IOC容器-构造函数注入、属性注入、接口注入

/ Spring / 没有评论 / 377浏览

今天我们详细了解一下spring框架中IOC的作用。IOC的英文名叫Inverse of Control,中文名叫控制反转也可以叫依赖注入,是spring容器的内核。AOP、事务等功能都依赖于此技术。IoC说白了,就是将对象与对象之间的依赖关系从代码中转移到spring的配置文件中,从而由spring进行对象声明周期的管理。这样的好处就是降低了对象与对象之间的依赖。IoC的工作原理就是利用Java的反射功能实例化对象与对象的依赖。除此之外,IoC容器还提供了对象的实例缓存、生命周期管理、对象实例代理、事件发布、资源装载等高级功能。

通过上面的介绍我们知道spring的IOC提供了很多个功能,但主要的功能就是依赖注入,也就是实例化对象。IOC从方法的的注入上可以分为3种类型的注入它们分别是:构造函数注入、属性注入、接口注入。下面我们按照这3种不同的注入类型通过测试用例来演示一样它们的区别。我们首先按照我们正常的开发方式分别注入上面3种类型,也就是采用手动实例化对象。

public interface UserDetailAble {
void print();
}
public class UserDetailAbleImpl implements UserDetailAble {
public void print() {
System.out.println("接口注入");
}
}
public class UserDetail {

public void print(String user) {
System.out.println(user);
}
}
public class UserInfo {

private UserDetail userDetail;
private UserDetailAble userDetailAble;

public UserInfo() {
}

public UserInfo(UserDetail userDetail) {
this.userDetail = userDetail;
}

public void setUserDetail(UserDetail userDetail) {
this.userDetail = userDetail;
}

public void setUserDetailAble(UserDetailAble userDetailAble) {
this.userDetailAble = userDetailAble;
}

public void print(String msg) {
userDetail.print(msg);
}

public void print() {
userDetailAble.print();
}

}
public class UserDetailTest {

/**
* 构造方法注入
*
* @throws Exception
*/
@Test
public void constructionMethodInject() throws Exception {
UserInfo userInfo = new UserInfo(new UserDetail());
userInfo.print("构造方法注入");
}

/**
* 属性注入
*
* @throws Exception
*/
@Test
public void propertyInject() throws Exception {
UserInfo userInfo = new UserInfo();
userInfo.setUserDetail(new UserDetail());
userInfo.print("属性注入");
}

/**
* 接口注入
*
* @throws Exception
*/
@Test
public void interfaceInject() throws Exception {
UserInfo userInfo = new UserInfo();
userInfo.setUserDetailAble(new UserDetailAbleImpl());
userInfo.print();
}

}
构造方法注入
接口注入
属性注入

按照我们上述所说IOC的功能就是将对象与对象之间的依赖关系从代码中转移到spring的配置文件中。所以如果我们要采用IOC容器注入需要创建相关的配置文件。下面我们将创建spring配置文件来配置IOC容器注入的相关依赖。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="userDetail" class="com.jilinwula.spring.UserDetail"/>
<bean id="userDetailAble" class="com.jilinwula.spring.UserDetailAbleImpl"/>

<!-- 构造函数注入 start -->
<bean id="userInfo1" class="com.jilinwula.spring.UserInfo">
<constructor-arg name="userDetail" ref="userDetail"/>
</bean>
<!-- 构造函数注入 end -->

<!-- 属性注入 start -->
<bean id="userInfo2" class="com.jilinwula.spring.UserInfo">
<property name="userDetail" ref="userDetail"/>
</bean>
<!-- 属性注入 end -->

<!-- 接口注入 start -->
<bean id="userInfo3" class="com.jilinwula.spring.UserInfo">
<property name="userDetailAble" ref="userDetailAble"/>
</bean>
<!-- 接口注入 end -->

</beans>
/**
* IOC注入
*
* @throws Exception
*/
@Test
public void iocInject() throws Exception {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("bean.xml");
UserInfo userInfo = beanFactory.getBean("userInfo1", UserInfo.class);
userInfo.print("构造方法注入");
userInfo = beanFactory.getBean("userInfo2", UserInfo.class);
userInfo.print("属性注入");
userInfo = beanFactory.getBean("userInfo3", UserInfo.class);
userInfo.print();
}
构造方法注入
属性注入
接口注入