关于spring控制反转和依赖注入的随笔,及测试小demo
- 什么是控制反转(Ioc),什么是依赖注入(DI)有什么区别于联系
1)IoC控制反转:传统的创建对象的方法是用new关键字主动创建对象,而spring则使用IoC外部容器创建对象,这种创建对象的的方式由主动行为变成被动行为的方式被称为控制反转。
2)DI依赖注入:IoC外部容器在主动运行期间主动将程序所需要的外部容器注入进来
3)IoC控制反转和DI依赖注入在某种角度上描述的是一种东西,IoC是从对象的角度描述容器,DI是从容器的角度在程序运行期间主动的为应用程序注入外部资源(可以是外部对象,也可以是外部文件)
例如,对象a依赖对象b,或者应用程序运行到某一节点的时候需要创建对象b,或者引用已存在的对象b,Spring的IoC容器自动的注入对象所需要的外部资源,不需要再创建对象b
- Ioc控制反转小demo
appliactionContext.xml配置文件,(建议放在resourse中或者clasess文件夹中)
<?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-4.3.xsd"> <!-- 将指定类配置给spring,让spring创建其对象的实例 -->
<!-- 表示在容器中创建一个id为UserDao的Bean实例 ,其中class属性用于指定需求实例化的Bean类--> <bean id="userDao" class="org.lyl.chapter001.UserDaoImpl"></bean> <!-- 添加一个id为UserService的bean --> <bean id="userService" class="org.lyl.chapter001.UserServiceImpl"> <!-- 将name为UserDao的Bean实例 注入userService实例中--> <property name="UserDao" ref="userDao"></property> </bean> </beans> |
Dao方法
public interface UserDao { //定义login方法 public void login() ; } |
Dao的实现类
public class UserDaoImpl implements UserDao{
@Override public void login() { System.out.println("UserDao login"); } } |
创建一个Ioc类来测试控制反转
public class IoC { public static void main(String[] args) { //1.初始化Spring容器,加载配置文件 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); //2.通过容器UserDao获得实例 UserDao dao=(UserDao)applicationContext.getBean("userDao"); //3.调用实例中的login方法 dao.login(); } } |
运行结果如下
这里调用UserDao的login方法时没有使用new关键字创建对象而是获取Spring的Ioc容器创建好的Bean实例。
小demo需要用到的jar包如下,建议使用maven的pom引入jar包坐标,直接引入jar包可以报找不到配置文件applicationContext.xml编译错误