IOC概念理解
ioc:Inversion of control。又名:控制反转。它是一种设计思想。在开发中,ioc意味着将依赖对象交给容器控制,而不是传统的在对象中直接控制。
在以往的时候,我们使用依赖对象,都是通过new一个对象出来,对象之间进行耦合。随着系统的复杂,对象之间的耦合度越高,系统改造、维护等都会带来一定障碍。而且也与软件设计的低耦合目标不一致。为了解决对象之间耦合度过高的问题,spring的ioc框架出炉了。
控制反转,是相对于“正”,才有“反”的说法。什么是“正”呢?正是指,对于依赖对象主动的去创建,去控制,什么时候创建、使用,是由程序主动控制的。反则是指,由容器来帮忙创建和注入依赖对象。由原来的主动,变为被动接受,所以是反转。
控制反转,又名:依赖注入。依赖注入是指程序运行期间,动态的向某个对象提供它所需要的其它对象。控制反转和依赖注入是从不同角度描述的同一件事,那就是:通过引入IOC容器,通过依赖注入的方式,实现对象之间的解耦。
spring注入的三种方式
1. 属性注入
2. 构造方式注入
3. 工厂方式注入
1. 属性注入
属性注入是通过setter的方法注入到bean对象的属性值中的。使用标签<property>,name指定bean属性名,value指定属性值。属性的注入是通过对象中的set方法注入。如:定义一个Teacher类,有属性name和age,则注入是通过setName()和setAge()两个方法注入的。bean属性,要与对象中的set方法一一对应。
如:
<bean id = "teacher" class="com.ysl.http.service.Teacher">
<property name="name" value="王老师"></property>
<property name="age" value="22"></property>
</bean>
对应的Teacher对象中:
public class Teacher {
private String name;
private String age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(String age) {
this.age = age;
}
public String getAge() {
return age;
}
对应的测试类:
@Test
public void test001(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Teacher teacher = (Teacher) ctx.getBean("teacher");
System.out.println(teacher);
}
测试结果为:
Teacher{name='王老师', age='22'}
2. 构造注入
构造方法注入bean对象的属性值或者依赖对象,可以在实例化后,直接使用,相当于有默认值。
构造注入使用标签<constructor-arg>,这个标签中没有name,有value,通过value为属性值赋值。其中注入属性的个数一定与构造函数的参数一一对应。在这个标签中,还可以使用type指定参数类型,如遇到特殊字符,可使用<![CDATA[]]>包裹。 如:Dog类的bean配置文件
<bean id = "dog" class="com.ysl.http.service.Dog">
<constructor-arg value="小黄"></constructor-arg>
<constructor-arg type="java.lang.String">
<value><![CDATA[<白色>]]></value>
</constructor-arg>
</bean>
Dog的构造函数
public class Dog {
private String color;
private String name;
public Dog(String name, String color){
this.name = name;
this.color = color;
}
测试类
@Test
public void test002(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Dog dog = (Dog) ctx.getBean("dog");
System.out.println(dog);
}
执行结果:
Dog{color='<小黄>', name='白色'}
bean之间还可以使用<property>的ref属性建立bean之间的引用关系。如:为teaher这个bean关联上dog,<property name="dog" ref="dog"></property>。在执行结果中,可以看到:
<bean id = "teacher" class="com.ysl.http.service.Teacher">
<property name="name" value="王老师"></property>
<property name="age" value="22"></property>
<property name="dog" ref="dog"></property>
</bean>
Teacher{name='王老师', age='22', dog=Dog{color='<白色>', name='小黄'}}
对list集合的属性注入
<bean id = "teacher" class="com.ysl.http.service.Teacher">
<property name="name" value="王老师"></property>
<property name="age" value="22"></property>
<property name="dogs">
<list>
<ref bean="dog"/>
<ref bean="dog2"/>
<ref bean="dog3"/>
</list>
</property>
</bean>
<bean id = "dog" class="com.ysl.http.service.Dog">
<constructor-arg value="小黄"></constructor-arg>
<constructor-arg type="java.lang.String">
<value><![CDATA[<白色>]]></value>
</constructor-arg>
</bean>
<bean id = "dog2" class="com.ysl.http.service.Dog">
<constructor-arg value="小黑"></constructor-arg>
<constructor-arg value="黑色"></constructor-arg>
</bean>
<bean id = "dog3" class="com.ysl.http.service.Dog">
<constructor-arg value="小花"></constructor-arg>
<constructor-arg value="花色"></constructor-arg>
</bean>
在对象Teacher中加上private List dogs;的set和get方法。执行以后得到的结果为:
Teacher{name='王老师', age='22', dog=null, dogs=[Dog{color='<白色>', name='小黄'}, Dog{color='黑色', name='小黑'}, Dog{color='花色', name='小花'}]}
最后
我保证我写的都是经过验证的,欢迎关注和交流。