四、在Spring中引入IoC和DI

一、控制反转与依赖注入的概念

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);
}
15387780-56a565d805f2fa5c.png
通过JNDI查找进行依赖拉取.png
1.4、上下文依赖查找

上下文依赖查找与依赖拉取的区别在于直接从容器(代码里如Map)中查询,而不是从一个注册表(spring的配置文件)
详情请参考书P24

15387780-bf99c15a635c7b93.png
上下文依赖查找.png
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 中的控制反转
15387780-7b1c8c215ccc7661.png
Spring的依赖注入机制.png

二、Spring中的依赖注入

2.1、Bean与BeanFactory
  • Spring依赖注入的核心是BeanFactory接口,它负责管理组件,包括依赖项以及它们的生命周期。
  • bean用于引用由容器管理的任何组件,某种程度上遵守JavaBean规范(但不是必须的)
  • BeanFactory可以通过编程方式配置,但通常做法是通过外部配置文件
2.2、BeanFactory的实现

bean的实现(详情请参考书P29)

15387780-902249f955c2cc15.png
image.png

BeanFactory的实现

15387780-4a068a67f21c7d9a.png
image.png

XML配置文件的实现

15387780-cdf669e4c133e6de.png
image.png

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

猜你喜欢

转载自blog.csdn.net/weixin_33755557/article/details/91272768