其他分享
首页 > 其他分享> > IOC的介绍

IOC的介绍

作者:互联网

1、IOC本质

控制反转IoC(Inversion if Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。

没有IoC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为控制反转就是:获得依赖对象的方式反转了。

 

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注释的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注释)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection)。

2、HelloSpring

所谓的IoC:就是对象由Spring来创建,管理,装配!

仅在xml配置文件中修改。

3、IOC创建对象的方式

1、使用无参构造创建对象,默认!

2、假设我们要使用有参构造创建对象。

1.下标赋值

  <!--第一种,下标赋值!-->
<bean id="user" class="com.usect.pojo.User">
   <constructor-arg index="0" value="狂神说Java"/>
</bean>

2.类型

<!--第二种方式,通过类型创建,不建议使用!-->
<bean id="user" class="com.usect.pojo.User">
   <constructor-arg type="java.lang.String" value="qinjiang" />
</bean>

3.参数名

<!--第三种,直接通过参数名来设置-->
<bean id="user" class="com.usect.pojo.User">
   <constructor-arg name="name" value="秦疆"/>
</bean>

 

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!

4、Spring配置

4.1、别名

<!--别名,如果添加了别名,我们也可以使用别名获取到这个对象-->
<alias name="user" alias="userNew"/>

4.2、Bean的配置

xml:

<!--
id:bean的唯一标识符,也就是相等于我们学的对象名
class:bean对象所对应的全限定名:包名+类型
name:也是别名,而且name可以同时取多个别名
-->
<bean id="userT" class="com.usect.pojo.UserT" name="user2 u2,u3;u4">
   <property name="name" value="西部开源"/>
</bean>

 

4.3、import

这个import,一般用于团队开发使用,他可以将多个配置文件,导入合并一个

假设,项目中有多个人开发,这三个人复制不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的!

张三

李四

王五

applicationContext.xml

<import resource="beans.xml"/>
<import resource="beans2.xml"/>
<import resource="beans3.xml"/>

使用的时候,直接使用总的配置就可以了。

5、依赖注入

5.1、构造器注入

前面已经说过了

5.2、Set方式注入(重点)

依赖注入:Set注入!

依赖:bean对象的创建依赖于容器

注入:bean对象中的所有属性,由容器来注入!

 

【环境搭建】

1.复杂类型

public class Address {
   private String address;

   public String getAddress() {
       return address;
  }

   public void setAddress(String address) {
       this.address = address;
  }
}

2.真实测试对象

public class Student {

   private String name;
   private Address address;
   private String[] books;
   private List<String> hobbys;
   private Map<String,String> card;
   private Set<String> games;
   private String wife;
   private Properties info;
  }

3.beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">

   <bean id="student" class="com.usect.pojo.Student">
       <!--第一种,普通值注入,value-->
       <property name="name"  value="秦疆"/>   </bean>

</beans>

4.测试类

public class MyTest {
   public static void main(String[] args) {
       ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
       Student student = (Student)context.getBean("student");
       System.out.println(student.getAddress());
  }
}

完善注入信息

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">

   <bean id="address" class="com.usect.pojo.Address">
       <property name="address" value="西安"/>
   </bean>

   <bean id="student" class="com.usect.pojo.Student">
       <!--第一种,普通值注入,value-->
       <property name="name"  value="秦疆"/>

       <!--第二种,bean注入,ref-->
       <property name="address" ref="address"/>
       <!--数组-->
       <property name="books">
           <array>
               <value>红楼梦</value>
               <value>西游记</value>
               <value>水浒传</value>
               <value>三国演义</value>
           </array>
       </property>

       <!--List-->
       <property name="hobbys">
           <list>
               <value>听歌</value>
               <value>敲代码</value>
               <value>看电影</value>
           </list>
       </property>

       <!--Map-->
       <property name="card">
           <map>
               <entry key="身份证" value="111111222222223333"/>
               <entry key="银行卡" value="1113131323131323233"/>
           </map>
       </property>

       <!--Set-->
       <property name="games">
           <set>
               <value>LOL</value>
               <value>COC</value>
               <value>BOB</value>
           </set>
       </property>

       <!--null-->
       <property name="wife">
           <null/>
       </property>

       <!--Properties-->
       <property name="info">
           <props>
               <prop key="driver">20190525</prop>
               <prop key="url">男</prop>
               <prop key="username">小明</prop>
               <prop key="password">123456</prop>
           </props>
       </property>
   </bean>

</beans>

5.3拓展方式注入

我们可以使用p命令空间和c命令空间进行注入

官方解释:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:p="http://www.springframework.org/schema/p"
      xmlns:c="http://www.springframework.org/schema/c"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">

   <!--p命名空间注入,可以直接注入属性的值:property-->
   <bean id="user" class="com.usect.pojo.User" p:name="秦疆" p:age="18"/>

   <!--c命名空间注入,通过构造器注入:constructor-args-->
   <bean id="user2" class="com.usect.pojo.User" c:age="18" c:name="狂神"/>

</beans>

测试:

    @Test
   public void Test2(){
       ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
       User user = (User) context.getBean("user2",User.class);
       System.out.println(user);
  }

 

注意点:p命名和c命名空间不能直接使用,需要导入xml约束!

   xmlns:p="http://www.springframework.org/schema/p"
  xmlns:c="http://www.springframework.org/schema/c"

5.4、bean的作用域

1、单例模式(Spring默认机制)

<bean id="user2" class="com.usect.pojo.User" c:age="18" c:name="狂神" scope="singleton"/>

2、原型模式:每次从容器中get的时候,都会产生一个新对象!

<bean id="user2" class="com.usect.pojo.User" c:age="18" c:name="狂神" scope="prototype"/>

3、其余的request、session、application、这些个只能在web开发中使用到!

 

bean作用域的图示:

 

标签:www,http,springframework,beans,介绍,org,IOC,schema
来源: https://www.cnblogs.com/mhy123/p/16211732.html