Spring IoC

2019-08-18  本文已影响0人  编程喵喵

概念

IoC(控制反转):在使用 Spring 框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring 容器负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring 容器,控制权发生了反转,这就是Spring 的控制反转。

DI(依赖注入):从Spring 容器的角度来看,Spring 容器负责将被依赖对象复制给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring 的依赖注入。

核心容器

image.png image.png

对比

BeanFactory接口

BeanFactory 才是 Spring 容器中的顶层接口,

ApplicationContext 接口

ApplicationContext 是BeanFactory 的子接口,也被称为应用上下文,是另一种常用的 Spring核心容器。 不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。

BeanFactory 和 ApplicationContext 的区别

ApplicationContext接口

入门程序

  1. 创建接口和实现类
  2. 配置文件
<bean id="userDao" class="com.zen.dao.impl.UserDaoImpl"></bean></pre>
  1. 测试程序
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) ac.getBean("userDao")</pre>

Bean

常用标签

image.png

基于XML的依赖注入(过时)

实例化 Bean 的三种方式

基于注解的装配

常用注解

注解配置

 <!-- 告知Spring框架在,读取配置文件,创建容器时,扫描注解,依据注解创建对象,并存入容器中 -->
 <context:component-scan base-package="com.zen"></context:component-scan></pre>

纯注解方法

ApplicationContext ac =  new AnnotationConfigApplicationContext(SpringConfiguration.class);

提高部分

BeanDefinition

Class只是描述了一个类有哪些字段、方法,但是无法描述如何实例化这个bean!**如果说,Class类描述了一块猪肉,那么BeanDefinition就是描述如何做红烧肉。

在容器内部,这些bean定义被表示为BeanDefinition对象,包含以下元数据:

  1. 包限定的类名:通常,定义bean的实际实现类。

  2. Bean行为配置:它声明Bean在容器中的行为(范围、生命周期回调,等等)。

  3. Bean依赖:对其他Bean的引用。

  4. 对当前Bean的一些设置:例如,池的大小限制或在管理连接池的bean中使用的连接数。

后置处理器

image.png

后置处理器分类

image.png

BeanFactoryPostProcessor是用来干预BeanFactory创建的,而BeanPostProcessor是用来干预Bean的实例化。

容器配置

Spring 的容器配置方式可以分为 3 种:

Spring 支持的 2 种注入方式:

所谓的3种编程风格其实指的是“将Bean交给Spring管理的3种方式”,可以理解为IOC,而2种注入方式即DI,是建立在IOC的基础上的。也就是说Spring的DI(依赖注入)其实是以IOC容器为前提。

image.png

自动装配

XML 实现自动装配可以分为两种:全局、局部。

所谓全局,就是在 XML 根标签末尾再加一个配置default-autowire="byName",那么在此 XML 中配置的每一个<bean>都遵守这个自动装配模式,可选值有4个:

Spring 支持自动装配(全局/局部),把原先<bean>标签的职责单一化,只定义 bean,而依赖关系交给类本身维护

自动装配共 4 种,除了 no,其他 3 种各自对应两种注入方式:byName/byType对应 setter 方法注入,constructor 对应构造方法注入

@Autowired默认采用byType模式自动装配,如果找到多个同类型的,会根据名字匹配。都不匹配,则会报错

为了弥补@Autowired不能指定名字的缺憾,Spring提供了@Qualifier注解

@Resource:和@Autowired几乎一样,但不能配合@Qualifier,因为它本身就可以指定beanName

JavaConfig方式:@Configuration+@Bean

上一篇下一篇

猜你喜欢

热点阅读