IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring框架(六)——bean的生命周期 -> 正文阅读

[Java知识库]Spring框架(六)——bean的生命周期

遇到面试官问bean生命周期,让我回答bean生命周期中调用的接口和方法,给我整蒙了
在这里插入图片描述
没办法,老老实实学习和记录一下。

对于普通的java对象,通过new方法创建的对象,当没有引用时被垃圾回收机制回收。
而SpringBean对象,Spring会扫描指定包下面的Java类,然后将其变成beanDefinition对象,然后Spring会根据beanDefinition来创建bean,它们的生命周期完全由容器控制。

一、生命周期流程、

实例化 -> 属性赋值 -> 初始化 -> 销毁
在这里插入图片描述

  1. 调用 Bean 构造方法或工厂方法实例化 Bean
  2. 利用依赖注入完成 Bean 中所有属性值的配置注入
  3. 如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id
  4. 如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用
  5. 如果 Bean 实现了 ApplicationContextAware 接口,则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 实例的引用
  6. 如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的预初始化方法 postProcessBeforeInitialzation() 对 Bean 进行加工操作,此处非常重要,Spring 的 AOP 就是利用它实现的
  7. 如果 Bean 实现了 InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 方法
  8. 如果在配置文件中通过 init-method 属性指定了初始化方法,则调用该初始化方法
  9. 如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的初始化方法 postProcessAfterInitialization()。此时,Bean 已经可以被应用系统使用了
  10. 如果在<bean> 中指定了该 Bean 的作用范围为 scope=“singleton”,则将该 Bean 放入 Spring IoC 的缓存池中,将触发 Spring 对该 Bean 的生命周期管理;如果在 中指定了该 Bean 的作用范围为 scope=“prototype”,则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean
  11. 如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁

二、接口方法分类

类型描述
Bean自身的方法包括了Bean本身调用的方法和通过配置文件中的init-methoddestroy-method指定的方法
Bean级生命周期接口方法包括了BeanNameAwareBeanFactoryAwareInitializingBeanDiposableBean这些接口的方法
容器级生命周期接口方法包括了InstantiationAwareBeanPostProcessorBeanPostProcessor 这两个接口实现的方法,一般称它们的实现类为“后处理器”。
工厂后处理器接口方法括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器接口的方法

三、演示

1. 调用Bean自身的方法和Bean级生命周期接口方法

public class UserBean implements BeanFactoryAware, BeanNameAware,
        InitializingBean, DisposableBean {

    private String name;//名称

    private BeanFactory beanFactory;
    private String beanName;
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("传入当前工厂实例");
        this.beanFactory = beanFactory;
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("传入当前 Bean 的 id 值:"+s);
        this.beanName =s;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("实现Bean级生命周期接口接口的destroy()");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("实现Bean级生命周期接口的afterPropertiesSet()");
    }



    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void myInit() {
        System.out.println("调用<bean>的init-method属性指定的方法");
    }
    public void myDestory() {
        System.out.println("调用<bean>的destroy-method属性指定的方法");
    }

}

2.实现BeanPostProcessor接口

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("预初始化方法对"+bean+"进行加工");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("后初始化方法对"+bean+"进行加工");
        return bean;
    }
}

3. 实现InstantiationAwareBeanPostProcessor接口

InstantiationAwareBeanPostProcessor本质上是BeanPostProcessor的子接口

public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

    public MyInstantiationAwareBeanPostProcessor(){
        System.out.println("这是InstantiationAwareBeanPostProcessorAdapter实现类构造器");
    }

    //实例化Bean之前调用
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("实例化前调用InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization()");
        return bean;
    }

    //实例化Bean之后调用
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)  throws BeansException {
        System.out.println("实例化后调用InstantiationAwareBeanPostProcessor.postProcessAfterInitialization()");
        return bean;
    }

    //设置某个属性时调用
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        System.out.println("设置"+pvs.toString()+"属性时调用InstantiationAwareBeanPostProcessor的postProcessProperties()");
        return pvs;
    }
}

4.工厂后处理器接口

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    public MyBeanFactoryPostProcessor(){
        System.out.println("实例化MyBeanFactoryPostProcessor构造器");
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("调用BeanFactoryPostProcessor.postProcessBeanFactory()");
        BeanDefinition bd = configurableListableBeanFactory.getBeanDefinition("userBean");
        System.out.println("实例化Bean:"+bd.toString());
        bd.getPropertyValues().addPropertyValue("name", "测试后工厂方法");
        System.out.println("注入属性:"+bd.getPropertyValues().getPropertyValues());
    }
}

5. 配置文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

    <bean id="beanPostProcessor" class="com.tung.MyBeanPostProcessor">
    </bean>

    <bean id="instantiationAwareBeanPostProcessor" class="com.tung.MyInstantiationAwareBeanPostProcessor">
    </bean>

    <bean id="beanFactoryPostProcessor" class="com.tung.MyBeanFactoryPostProcessor">
    </bean>

    <bean id="userBean" class="com.tung.UserBean" init-method="myInit"
          destroy-method="myDestory" scope="singleton" p:name="张三"/>

</beans>

6.测试

public class BeanLifeCycle {
    public static void main(String[] argss){
        System.out.println("初始化容器");
        ApplicationContext factory = new ClassPathXmlApplicationContext("/beans.xml");
        System.out.println("容器初始化成功");
        UserBean userBean = factory.getBean("userBean",UserBean.class);
        System.out.println(userBean);
        System.out.println("开始关闭容器");
        ((ClassPathXmlApplicationContext)factory).registerShutdownHook();
    }
}

结果
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:21:20  更:2022-03-24 00:23:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:01:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码