IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。XmlBeanFacotory实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。
spring中有三种注入方式,一种是setter注入,一种是接口注入,另一种是构造方法注入。
使用IoC容器更加容易组合对象直接间关系,面向接口编程,降低耦合。
在不使用spring框架之前,我们的service层中要使用dao层的对象,不得不在service层中new一个对象。如下:
//dao层对象
public class UserDao{
publicvoid insert(User user){}
}
//service层对象
public classUserService{
publicvoid insert(User user){
UserDaouserdao = new UserDao();
userdao.insert(user);
}
}
存在的问题:层与层之间的依赖。
使用框架后:
//dao层对象
public class UserDao{
publicvoid insert(User user){}
}
//service层对象
public classUserService{
privateUserDao userdao;
publicUserDao getUserdao() {
returnuserdao;
}
publicvoid setUserdao(UserDao userdao) {
this.userdao= userdao;
}
publicvoid insert(User user){
userdao.insert(user);
}
}
service层要用dao层对象需要配置到xml配置文件中,至于对象是怎么创建的,关系是怎么组合的都交给了spring框架去实现。
模拟实现
创建需要被依赖(被实例化)的对象:User.java
package com.spring.ioc;
//..忽略input
public class User {
private String userId;
private String userName;
private String userPassword;
private int age;
private List list;
private Set set;
private Map map;
//各自的set、get方法忽略
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName
+ ", userPassword=" + userPassword + ", age=" + age + ", list="
+ list + ", set=" + set + ", map=" + map + "]";
}
}
spring配置使用:spring.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" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="userBean" class="com.spring.ioc.User">
<!-- 构造器注入 -->
<constructor-arg index="0">
<value>张大明</value>
</constructor-arg>
<constructor-arg index="1">
<value>88888888</value>
</constructor-arg>
<!-- 属性值注入 -->
<property name="age">
<value type="int">10</value>
</property>
<!-- list注入 -->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
<value>list3</value>
</list>
</property>
<!-- set注入 -->
<property name="set">
<set>
<value>set1</value>
<value>set2</value>
<value>set3</value>
</set>
</property>
<!-- map注入 -->
<property name="map">
<map>
<entry>
<key>
<value>1</value>
</key>
<value>map1</value>
</entry>
<entry>
<key>
<value>2</value>
</key>
<value>map2</value>
</entry>
<entry>
<key>
<value>3</value>
</key>
<value>map3</value>
</entry>
</map>
</property>
</bean>
</beans>
使用spring,依赖User。Text.java
package com.spring.ioc;
//忽略input
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext=new
FileSystemXmlApplicationContext("src/com/spring/ioc/spring.xml");
//可以当做是控制反转的用法ioc
User user=(User)applicationContext.getBean("userBean");
//通过依赖注入(构造器注入)获取的值
System.out.println("userName:"+user.getUserName());
System.out.println("userPassword:"+user.getUserPassword());
System.out.println("age:"+user.getAge());
List list=user.getList();
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
运行结果:
setter方法注入:
<property name="user2" ref="user23"></property>
<bean id="user23" class="com.spring.ioc.User2">
<constructor-arg name="other">
<value>2</value>
</constructor-arg>
<constructor-arg name="other2">
<value>asd</value>
</constructor-arg>
</bean>
其他代码省略;说明:user2是 user 里的一个成员变量。
此处通过setter方法设置元素的值,user23 属性配置是 user2 对象的引用。