Exploring
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
  • Java

    • 基础

    • 并发与多线程

    • 日志系统

    • 单元测试

    • JVM

    • Spring

      • 理解依赖注入与松耦合
      • Spring-Aop-注解方式食用
      • spring给util类注入bean
      • Spring之Bean的生命周期
        • spring-bean与普通bean
        • 图解Spring-Bean的生命周期
        • 文解Spring-Bean生命周期
        • 一个实用的使用方式
      • Spring之Bean的作用域
      • Spring中Profiles的作用及原理浅析
      • SpringBoot中的服务端推送SSE
    • SpringBoot

    • 一些工具

  • 语言
  • Java
  • Spring
unclezs
2020-03-10
0
目录

Spring之Bean的生命周期

# spring-bean与普通bean

Spring创建一个Bean不像是传统的javaBean一样,简单的new一个出来,用了等着被回收就完了,Spring对Bean的创建和销毁过程都加入了一些关于Spring本身的操作,比如当Spring容器销毁的时候自动调用Bean的destory方法,如果这个Bean实现了DisposableBean接口的话。

# 图解Spring-Bean的生命周期

# 文解Spring-Bean生命周期

1.Spring对Bean进行实例化 2.将依赖的Bean进行注入,和传入值进行赋值到属性中。 3.如果Bean实现了BeanNameAware接口,Spring将调用setBeanName将Bean的Id传入进来

public class SpringBean implements BeanNameAware {
    private String name;

    public void setBeanName(String name) {
        this.name=name;
        //do something
    }
}
1
2
3
4
5
6
7
8

4.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory将BeanFactory传入进来

public class SpringBean implements BeanFactoryAware {
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        //do something
    }
}
1
2
3
4
5

5.如果Bean实现了ApplicationContextAware接口,那么Spring将会把applicationContext传入调用setApplicationContext方法,这个可以用户获取上下文对象来手动获取Bean

public class SpringBean implements ApplicationContextAware {
    public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
        //拿到ApplicationContext对象
    }
}
1
2
3
4
5

6.如果实现了BeanPostProcessor,则调用post-ProcessBeforeInitialization方法。 7.如果Bean实现了InitializingBean,那么则调用after-PropertiesSet 8.如果Bean实现了BeanPostProcessor接口,Spring将调用post-ProcessAfterInitialization方法,这个时候Bean已经加载好了,直到被销毁。 9.如果Bean实现了DisposableBean接口,那么在Bean销毁的时候将会自动调用该Bean的destory方法。

# 一个实用的使用方式

根据以上周期,可以根据其特性来创建一个Spring上下文工具类。使用范围一般在一些静态方法里面使用Spring容器里面的Bean和一些非SpringBean中调用SpringBean对象的时候。SpringContextHolder.getBean(xxx.class) 即可

public class SpringContextHolder implements ApplicationContextAware, DisposableBean {

    private static ApplicationContext applicationContext = null;

    /**
     * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) {
        assertContextInjected();
        return (T) applicationContext.getBean(name);
    }

    /**
     * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
     */
    public static <T> T getBean(Class<T> requiredType) {
        assertContextInjected();
        return applicationContext.getBean(requiredType);
    }

    /**
     * 检查ApplicationContext不为空.
     */
    private static void assertContextInjected() {
        if (applicationContext == null) {
            throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext" +
                    ".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder.");
        }
    }

    /**
     * 清除SpringContextHolder中的ApplicationContext为Null.
     */
    private static void clearHolder() {
        log.debug("清除SpringContextHolder中的ApplicationContext:"
                + applicationContext);
        applicationContext = null;
    }

    @Override
    public void destroy(){
        SpringContextHolder.clearHolder();
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringContextHolder.applicationContext != null) {
            log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);
        }
        SpringContextHolder.applicationContext = applicationContext;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11
spring给util类注入bean
Spring之Bean的作用域

← spring给util类注入bean Spring之Bean的作用域→

Theme by Vdoing | Copyright © 2018-2024 unclezs
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式