一、控制反转与依赖注入的概念
1.1、控制反转与依赖注入的关系
IoC的核心是依赖注入,旨在提供一种更简单的机制来设置组件依赖项(通常称为对象的协作者),并在整个生命周期管理这些依赖项。IoC可分为依赖注入和依赖查找,DI是依赖注入,所以当谈论DI时总是在谈论IoC,而谈论IoC时,并不总是在谈论DI(依赖查找也是IoC的一种形式)
1.2、控制反转的类型
- 依赖查找包含依赖拉取(dependency pull,DL)和上下文依赖查找(contextualized dependecy lookup,CDL)两种类型
- 依赖注入包含构造函数和setter依赖注入两种方式
1.3、依赖拉取
- JNDI:(Java Naming and Directory Interface,Java命名和目录接口)
依赖拉取示例如下
public static void main(String[] args) throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("spring/app-conytext.xml");
DneOrderService dneOrderService = (DneOrderService) context.getBean("dneOrderService");
//或者
DneOrderService dneOrderService = context.getBean("dneOrderService",DneOrderService.class);
}
1.4、上下文依赖查找
上下文依赖查找与依赖拉取的区别在于直接从容器(代码里如Map)中查询,而不是从一个注册表(spring的配置文件)
详情请参考书P24
1.5、依赖注入的方式
构造函数注入
private DneMqProductMapper dneMqProductMapper;
public DneMqProductServiceImpl(DneMqProductMapper dneMqProductMapper) {
this.dneMqProductMapper = dneMqProductMapper;
}
setter注入
private DneMqProductMapper dneMqProductMapper;
public void setDneMqProductMapper(DneMqProductMapper dneMqProductMapper) {
this.dneMqProductMapper = dneMqProductMapper;
}
在Spring中,还支持一种被称为字段注入(field injection)的注入类型,后面讲到@Autowire会介绍
1.6、注入和查找
- 使用注入比使用查找更轻松
- 注入可以自由地使用与IoC完全分离的类,而查找总是依赖于容器定义的类和接口。
- 基于查找的解决方案比基于注入放入解决方案更复杂
- 使用注入对组件代码没有影响,而查找会与之进行交互
- 只要可以使用依赖注入,就尽量使用依赖注入
1.7、Spring 中的控制反转
二、Spring中的依赖注入
2.1、Bean与BeanFactory
- Spring依赖注入的核心是BeanFactory接口,它负责管理组件,包括依赖项以及它们的生命周期。
- bean用于引用由容器管理的任何组件,某种程度上遵守JavaBean规范(但不是必须的)
- BeanFactory可以通过编程方式配置,但通常做法是通过外部配置文件
2.2、BeanFactory的实现
bean的实现(详情请参考书P29)
BeanFactory的实现
XML配置文件的实现
2.3、ApplicationContext及其配置
ApplicationContext:ApplicationContext 接口是对 BeanFactory 的一个拓展,除了DI ,还包括事务,AOP服务、国际化(Internationalization:i18n)、应用程序事件处理等。
Spring配置选项(见书P31 ~ P)
- 使用注解(从jdk5和Spring 2.5开始)
- 使用xml配置文件
- 基本配置描述
- 声明Spring组件(GenericXmlApplicationContext)
- 使用Java配置(@Bean,@Configuration,@ImportResource,@Resource(name=""),@Inject,AnnotationConfigurationApplicationContext)
- 使用setter注入(Spring 2.5以后,支持 p 名称空间)
- 使用构造函数注入(Spring 3.1开始支持 c 名称空间,@Value)
- 使用字段注入(注意单一责任原则:即一个类制作一个事情,高内聚)
- 使用注入参数
- 注入简单值
- 通过使用SpEL注入值
- 在相同的XML单元中注入Bean
- 注入集合
- 使用方法注入
- 查找方法注入
- 查找方法注入的注意事项
- 方法替换
- 何时使用方法替换
- 了解bean命名
- bean名称别名
- 使用注解配置的bean命名
- 了解bean的实例化模式
- 选择实例化模式
- 实现bean的作用域
2.4、解析依赖项
2.5、自动装配bean和设置bean继承
- 自动装配模式
- 何时使用自动装配
三、配置Spring 应用程序的上下文
以上内容均来自于《Spring 5 高级编程 第五版》清华大学出版社 第三章 在Spring中引入 IoC 和 DI
转载于:https://www.jianshu.com/p/7ce0bd43e0a5