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 对象的引用。