天天看点

Spring注解(生命周期)

Spring注解(生命周期)

对于上面的知识图解,需要一点一点的研究。

 首先核心容器:

 控制反转 和 依赖注入

创建工程:

   maven仓库搜索 spring context  : 

Spring注解(生命周期)

 引入后

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>4.3.1.RELEASE</version>

</dependency>

Spring注解(生命周期)

以前是通过 application.xml 进行配置设置

配置类 等同于以前的配置文件:

Spring注解(生命周期)

config:

测试类:

在xml配置的时候,我们使用的是包扫描的方式

 <context: component-scan base-package= "com.toov5"> </context: conponent-scan>

 包扫描: 只要标注了 @Controller @Service @Repository  @Component

用注解搞定:  @ComponentScan(value="com.toov5.bean")

可以指定要扫描的包 

排除的包,包括可以按照 名字 按照类型等去排除   excludeFilters    

指定的包,指定扫描的时候只需要包含哪些组件     includeFilters

还可以通过自定义规则 CUSTOM 通过 implements TypeFilter 重写match方法

   metadataReader : 读取到的当前正在扫描的类的信息

   metadataReaderFactory: 可以获取到其他任何类

 controller

Service

Dao

测试:

Spring注解(生命周期)

 config类:

自定义的:

 运行结果:

Spring注解(生命周期)

可以继续往下玩儿:

Spring注解(生命周期)

@Scope 设置作用域 

    config:

  Test:

Spring注解(生命周期)

prototype: 多实例的

singleton: 单实例的(默认的)

request: 同一次请求创建一个实例

session: 同一个session创建一个实例

Spring注解(生命周期)

 单例情况下:

测试类启动ioc容器:

Spring注解(生命周期)

单例模式,ioc容器启动后会调用方法创建对象放到IOC容器总  以后每次获取就是直接从容器中获取. 类似于从map获取 map.get()

如果是多例模式:

 ioc容器启动是不会创建对象的!

只有调用时候,并且调用一次,获取一次 调用方法创建对象

 config:

Spring注解(生命周期)

@Lazy

 懒加载: 单实例bean,默认在容器启动的时候创建对象,懒加载容器启动时候先不创建。第一次在使用获取Bean时候才创建对象,并且进行初始化。

config:

 第一次获取时候加载。只创建一次。

Spring注解(生命周期)

 @Condition 按照条件注册bean

    也是springboot 底层大量使用的。 按照一定条件进行判断,满足条件给容器注册Bean

 原来情况:

打印:

Spring注解(生命周期)

要求:

如果操作系统是win10 被容器注册 linux

如果是linux  给容器注册 马云

 代码:

Spring注解(生命周期)

动态获取环境变量的值

context的巧用:

条件:

 测试:

Spring注解(生命周期)

可以做更多的判断,更多的条件

@Condition还可以标注在类上面, 满足当前条件 这个类 中配置的所有Bean注册才能生效

Spring注解(生命周期)

给容器中注册组件:

 1、 包+组件标注-@Controller @Service  @Repository @Component

 如果导入第三方包呢?

 2、 别人写类: @Bean 导入的第三方包里面的组件

 3、 @Import   快速给容器中导入一个组件  id默认全类名

       @ImportSelector  返回需要导入的组件的全类名数组

 4、Spring提供的FactoryBean

查看Ioc中的bean组件:

 除了ioc自己的,还有那几个正常的

Spring注解(生命周期)

这么玩儿:

结果:

Spring注解(生命周期)

 如果导入多个 ,可以用数组形式@Import({A.class, B.class})

 id 默认是全类名

类:

Spring注解(生命周期)

从容器中获取之:

Spring注解(生命周期)

业务判断:

配置:

Spring注解(生命周期)

FactoryBean 工厂Bean  区别普通的Bean,导入到容器中,容器会调用无参构造器,然后创建一个对象注册到的容器中

工厂Bean 是个工厂, 是个接口

Spring注解(生命周期)

容器调用:

Spring注解(生命周期)

返回对象给容器 

 还有两个方法:

Spring注解(生命周期)
Spring注解(生命周期)

创建一个 Pen 的工厂Beran

然后将工厂bean 加入到容器

工厂Bean 获取的是调用getObject创建的对象  

Spring注解(生命周期)

在于其他第三方框架整合时候 FactoryBean用的很多

方法一: Bean生命周期,Bean创建到初始化,到销毁的过程。由容器管理。

  初始化 和 销毁的方法可以自定义

xml配置中 通过  init-method  destory-method  配置方法指定

方法二: 注解中:  

   构造(对象创建)

     单例: 在容器启动的时候创建

     多例:在每次获取的时候创建

对于生命周期的方法声明,用注解:

  Bean: @Bean(initMethod="init", destroyMethod="destory") 

 config:

测试方法:

Spring注解(生命周期)

关闭容器:

Spring注解(生命周期)

 在数据源的配置过程中 有很多属性的配置需要用到 销毁时候 关闭连接等等

  总结:

    初始化, 对象创建完成,并赋值,调用初始化方法

    销毁, 容器关闭时候。 但是如果是多例情况,创建对象是获取时候才会执行。销毁时候,是不进行的。容器不管的。

 方法三: Spring 还提供了两个接口: Bean通过实现InitializingBean (定义初始化逻辑)

                                                                                    DisposableBean (定义销毁逻辑)

 Bean:

Spring注解(生命周期)

还可以使用: JSP250规范的   @PostConstruct   在bean创建完成 并且属性赋值完成执行初始化 

                                                  @Predestory  当bean从容器中销毁Bean之前 通知清理工作

test:

Spring注解(生命周期)

 还可以使用interface  BeanPostProcessor: 在bean初始化前后进行一些处理工作

     postProcessBeforeInitialization( )   初始化之前工作

     postProcessAfterInitialization( )      初始化之后工作

    后置处理器:  初始化前后进行处理工作

      每个bean在初始化init之前调用 postProcessBeforeInitialization  

                          初始化init 之后调用 postProcessAfterInitialization 

 对于Bean 的生命周期:

  构造器初始化, 初始化(可以自定义指定),初始化前后可以使用(BeanPostProcessor)进行拦截。 销毁(自定义执行)

关于BeanPostProcessor 在Spring 底层的使用

BeanValidationPostProcessor

    可以做数据校验, 当对象创建完 给Bean赋值以后。做数据校验

还有

InitDestoryAnnottionBeanPostProcessor

 AutowiredAnnotationBeanPostProcessor    对象创建完了之后 处理所有 @Autowried标注的属性

小结: BeanPostProcessor 接口 : bean赋值,注入其他组件,@Autowried,生命周期注解,@Async 等等

继续阅读