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">