控制反转
控制反转(Inversion of Control,IoC)是一种软件设计原则,其核心思想是将程序的控制权交给一个外部框架或容器。传统的程序设计中,应用程序自己负责创建和管理对象,而在IoC中,对象的创建和生命周期管理被交给了容器,应用程序只需声明哪些对象需要使用,具体的实例化和依赖注入工作由容器负责。
依赖注入
Spring对IoC的实现是通过依赖注入(DI)实现的。
在依赖注入中,一个对象(被称为依赖)通过构造函数参数、方法参数或者属性的方式,由外部的容器来提供所依赖的其他对象(称为依赖项)。这样可以避免在类内部直接创建依赖项对象,减少了类之间的直接耦合。通过依赖注入,可以更好地实现解耦,提高可扩展性和可测试性。
依赖注入可以分为三种常见的方式:构造函数注入(Constructor Injection)、方法注入(Method Injection)和属性注入(Property Injection)。
Spring IoC容器
spring-beans
和spring-context
两个模块是IoC的具体实现
BeanFactory
和ApplicationContext
作为IoC容器,负责实例化、配置和组装bean。容器通过读取配置元数据来获取要实例化、配置和组装哪些对象的指令。配置元数据以XML、Java注解或Java代码表示。
前者是IoC容器的根接口,提供了配置框架和基本功能,后者扩展了前者,添加了更多企业特定的功能如:事件发布器、获取环境信息、国际化和资源模式访问器等。
示例s3_11:
private static void s3_11() {
// 1. 创建IOC容器
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext();
// 2. 加载配置元数据
applicationContext.setConfigLocation("s2/s2-bean.xml");
// 3. 启动容器
applicationContext.refresh();
// 依赖查找
final T1Service t1Service = applicationContext.getBean("t1Service", T1Service.class);
log.info("【{}】", t1Service);
}
示例s3_12:
private static void s3_12() {
// 1. 创建IOC容器
DefaultListableBeanFactory dlbf = new DefaultListableBeanFactory();
// 2. 加载配置元数据
XmlBeanDefinitionReader xbdr = new XmlBeanDefinitionReader(dlbf);
final int count = xbdr.loadBeanDefinitions("s2/s2-bean.xml");
log.info("成功加载bean定义数量【{}】", count);
// 依赖查找
final T1Service t1Service = dlbf.getBean("t1Service", T1Service.class);
log.info("【{}】", t1Service);
}
网友评论