Spring-DI控制反转和IOC依赖注入
DI控制反转实例
IDEAJ自动导入Spring框架
创建UserDao.java
接口
public interface UserDao {
public void say();
}
创建UserDaoImpl.java
继承UserDao.java
并重写say()
方法
public class UserDaoImpl implements UserDao{
@Override
public void say() {
System.out.println("i am a UserDaoImpl");
}
}
创建SpringBean配置文件ApplicationContext.xml
这个温江,相当于花名册,Spring中的Bean全部需要在这里注册,当遇到实例化某个Bean时,只需要翻开花名册,根据它的name
来获取Bean的实例。
<?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 = "userDao" class="UserDaoImpl"></bean>
</beans>
创建DI的测试类TestDI.java
并实例化userDao
对象
ApplicationContext
类是Spring中的org.springframework.context.BeanFactory
的子接口,是Spring中的Bean实例加工厂。
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDI {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
@Test
public void testDI() {
userDao.say();
}
}
测试testDI()
方法
通过JUnit4运行testDI()
方法,运行结果如下:
总结
控制反转(DI)本质上是一种创建实例化对象的方式,通过控制反转,程序员不需要通过new
关键字来创建对象,而是直接通过对象的名字从BeanFactory
的子接口ApplicationContext
中取出实例化好的对象,BeanFactory
本质上是Spring中容器。
依赖注入
创建UserService.java
接口
public interface UserService {
public void say();
}
创建UserServiceImpl.java
继承UserService.java
并重写say()
方法
public class UserServiceImpl implements UserService{
@Override
public void say() {
System.out.println("i am a UserServiceImpl !");
}
}
在UserServiceImpl.java
中声明UserDao
对象,并生成setUserDao()
方法注入UserDao
对象
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void say() {
userDao.say();
System.out.println("i am a UserServiceImpl !");
}
}
在ApplicationContext.xml
文件中配置UserServiceImpl
<?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 = "userDao" class="UserDaoImpl"></bean>
<!-- 将id为uerDao的Bean实例注入到userService实例中 -->
<bean id = "userService" class="UserServiceImpl" >
<!-- property标签调用userService实例中的setUserDao方法实现依赖注入 -->
<property name="userDao" ref="userDao"></property>
<!-- name属性表示userService实例中的属性名称,
ref属性表示userService实例中的属性值 -->
</bean>
</beans>
创建IOC的测试类TestIOC.java
并实例化userService
对象
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIOC {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
@Test
public void testIOC() {
userService.say();
}
}
测试testIOC()
方法
总结
在UserServiceImpl.java
里实例化UserDao
对象作为它的属性,UseServiceImpl.java
对UserDaoImpl.java
产生依赖关系。通过setUserDao()
方法将userDao
对象注入就叫做依赖注入。