简述spring框架中的IOC和DI

Hello World! IOC和DI可以说是相同的,但有些资料记载把它们进行了细的划分。 IOC(控制反转) 它是将创建的对象的权限交由给spring容器,由它统一创建统一分配。 DI(依赖注入) 它就是在IOC创建好对象之后,为这个对象注入各个属性,这个过程就是依赖注入。 1.创建对象

    有参构造 无参构造 静态方法创建对象 public class PersonFactory { public static Person createPerson(){ System.out.println(“静态工厂创建Person”); return new Person(); } } 非静态方法创建对象 - public class Users{ public Person createPerson1(){ System.out.println("非静态工厂创建Person"); return new Person(); } } <bean id="u2" class="com.bean.Users"></bean> <bean id="u3" factory-method="createPerson1" factory-bean="u2"></bean>

2.DI注入 1> 可以通过name属性,按照参数名赋值

public  Person(String  name , Car car){
        this.name = name;
        this.car = car;
        System.out.println("Person的有参构造方法:"+name+car);
     }    <bean name="person" class="com.itqf.spring.bean.Person">
           <constructor-arg name="name" value="rose"/>
           <constructor-arg name="car"  ref="car"/>    </bean>

2> 可以通过index属性,按照参数索引注入

> <bean name="person2" class="com.itqf.spring.bean.Person">
    >         <constructor-arg name="name" value="helen" index="0"></constructor-arg>
    >         <constructor-arg name="car" ref="car" index="1"></constructor-arg> </bean>

3> 使用type注入

public Person(Car car, String name) {
            super();
            System.out.println("Person(Car car, String name)");
           this.name = name;
           this.car = car;
        }


public Person(Car car, Integer name) {
    super();
    System.out.println("Person(Car car, Integer name)");
    this.name = name + "";
    this.car = car;
}

<bean name="person2" class="com.itqf.spring.bean.Person">
    <constructor-arg name="name" value="988" type="java.lang.Integer"></constructor-arg>
    <constructor-arg name="car" ref="car" ></constructor-arg>
</bean>

4> spel spring表达式

<bean name="car"  class="com.itqf.spring.bean.Car" >
           <property name="name" value="mime" />
           <property name="color" value="白色"/>   </bean>


 <bean  name="person1"  class="com.itqf.spring.bean.Person"  p:car-ref="car">
            <property name="name" value="#{car.name}"/>
            <property name="age" value="#{person.age}"/>

   </bean>

5>复杂注入

<!-- 数组变量注入 --> <property name="arrs"> <list> <value>数组1</value> <!--引入其他类型--> <ref bean="car"/> </list> </property> <!-- 集合变量赋值--> <property name="list"> <list> <value>集合1</value> <!--集合变量内部包含集合--> <list> <value>集合中的集合1</value> <value>集合中的集合2</value> <value>集合中的集合3</value> </list> <ref bean="car" /> </list> </property> <!--map赋值 --> <property name="map"> <map> <entry key="car" value-ref="car" /> <entry key="name" value="保时捷" /> <entry key="age" value="11"/> </map> </property> <!-- properties赋值 --> <property name="properties"> <props> <prop key="name">pro1</prop> <prop key="age">111</prop> </props> </property>

6> 自动注入(由程序自动给属性赋值) autowire: no 不自动装配(默认值) byName 属性名=id名 ,调取set方法赋值 byType 属性的类型和id对象的类型相同,当找到多个同类型的对象时报错,调取set方法赋值 constructor 构造方法的参数类型和id对象的类型相同,当没有找到时,报错。调取构造方法赋值 示例:

<bean id="service" class="service.impl.UserServiceImpl" autowire="constructor"> </bean>

配置全局自动装配:

<beans default-autowire="constructor/byName/byType/no">
经验分享 程序员 微信小程序 职场和发展