Spring面试题目--请讲解一下Spring bean的生命周期

Spring bean的生命周期

A. 5步骤版本
1.实例化
2.依赖注入
3.初始化
4.使用
5.销毁

A.1 代码示例

#创建一个对象,自定义销毁以及初始化方法
package com.ruoyi.bizsys.domain;


public class AccountInfo {

    private String acctNo;

    public AccountInfo(String acctNo) {
        this.acctNo = acctNo;
    }


    public AccountInfo() {
        System.out.println("1.实例化");
    }

    public String getAcctNo() {
        return acctNo;
    }


    public void setAcctNo(String acctNo) {

        System.out.println("2.依赖注入");
    }

    public void myInit(){
        System.out.println("3.初始化");
    }

    public void myDestory(){
        System.out.println("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"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="AccountInfo" class="com.ruoyi.bizsys.domain.AccountInfo" init-method="myInit" destroy-method="myDestory">
        <property name="acctNo" value="123456789"></property>
    </bean>

</beans>
public class MyTest {

   //测试类测试5个步骤
    @Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring/SpringConfig.xml");
        Object  o = context.getBean(AccountInfo.class);
        System.out.println("4.使用");
        ((ClassPathXmlApplicationContext) context).close();
    }
}

A.2 输出结果
在这里插入图片描述

B. 7步骤版本
1.实例化
2.依赖注入
3.初始化前 BeanPostProcessor before方法 ⇒ postProcessBeforeInitialization(Object obj, String s)
4.初始化
5.初始化结束时 BeanPostProcessor after方法 ⇒ postProcessAfterInitialization(Object obj, String s)
6.使用
7.销毁
B. 1 代码示例

package com.ruoyi.bizsys.domain;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        if (bean instanceof AccountInfo){
            System.out.println("3.初始化前 BeanPostProcessor before方法 ");
        }
        return bean;
    }

    /**
     * 同上,不过时在初始化之后执行
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof AccountInfo){
            System.out.println("5.初始化后 BeanPostProcessor after 方法 ");
        }
        return bean;
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="AccountInfo" class="com.ruoyi.bizsys.domain.AccountInfo" init-method="myInit" destroy-method="myDestory">
        <property name="acctNo" value="123456789"></property>
    </bean>
    <bean id="MyBeanPostProcessor" class="com.ruoyi.bizsys.domain.MyBeanPostProcessor">
    </bean>

</beans>
package com.ruoyi.bizsys.domain;


public class AccountInfo {

    private String acctNo;

    public AccountInfo(String acctNo) {
        this.acctNo = acctNo;
    }


    public AccountInfo() {
        System.out.println("1.实例化");
    }

    public String getAcctNo() {
        return acctNo;
    }


    public void setAcctNo(String acctNo) {

        System.out.println("2.依赖注入");
    }

    public void myInit(){
        System.out.println("4.初始化");
    }

    public void myDestory(){
        System.out.println("7.销毁");
    }
}

package com.ruoyi.bizsys.test;

import com.ruoyi.bizsys.domain.AccountInfo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {

    @Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring/SpringConfig.xml");
        Object  o = context.getBean(AccountInfo.class);
        System.out.println("4.使用");
        ((ClassPathXmlApplicationContext) context).close();
    }

    @Test
    public void test2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring/SpringConfig.xml");
        Object  o = context.getBean(AccountInfo.class);
        System.out.println("6.使用");
        ((ClassPathXmlApplicationContext) context).close();
    }
}

B. 2 输出结果
在这里插入图片描述
C. 10步骤版本
1.实例化
2.依赖注入
3.BeanNameAware,BeanFactoryAware,ApplicationContextAware方法执行啦
【BeanNameAware#setBeanName,BeanFactoryAware#setBeanFactory,ApplicationContextAware#setApplicationContext】
4.初始化前 BeanPostProcessor before方法 ⇒ postProcessBeforeInitialization(Object obj, String s)
5.InitializingBean 方法执行啦
6.初始化
7.初始化结束时 BeanPostProcessor after方法 ⇒ postProcessAfterInitialization(Object obj, String s)
8.使用
9.DisposableBean 方法执行啦
10.销毁
C. 1 代码示例

package com.ruoyi.bizsys.domain;


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;

public class AccountInfo implements  BeanFactoryAware, InitializingBean, DisposableBean {

    private String acctNo;

    public AccountInfo(String acctNo) {
        this.acctNo = acctNo;
    }


    public AccountInfo() {
        System.out.println("1.实例化");
    }

    public String getAcctNo() {
        return acctNo;
    }


    public void setAcctNo(String acctNo) {

        System.out.println("2.依赖注入");
    }

    public void myInit(){
        System.out.println("6.初始化");
    }

    public void myDestory(){
        System.out.println("10.销毁");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("3.BeanNameAware,BeanFactoryAware,ApplicationContextAware方法执行啦" );
    }


    @Override
    public void destroy() throws Exception {
        System.out.println("9.DisposableBean 方法执行啦");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5.InitializingBean 方法执行啦" );
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="AccountInfo" class="com.ruoyi.bizsys.domain.AccountInfo" init-method="myInit" destroy-method="myDestory">
        <property name="acctNo" value="123456789"></property>
    </bean>
    <bean id="MyBeanPostProcessor" class="com.ruoyi.bizsys.domain.MyBeanPostProcessor">
    </bean>

</beans>
package com.ruoyi.bizsys.domain;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        if (bean instanceof AccountInfo){
            System.out.println("4.初始化前 BeanPostProcessor before方法 ");
        }
        return bean;
    }

    /**
     * 同上,不过时在初始化之后执行
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof AccountInfo){
            System.out.println("7.初始化后 BeanPostProcessor after 方法 ");
        }
        return bean;
    }
}

package com.ruoyi.bizsys.test;

import com.ruoyi.bizsys.domain.AccountInfo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {

    @Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring/SpringConfig.xml");
        Object  o = context.getBean(AccountInfo.class);
        System.out.println("4.使用");
        ((ClassPathXmlApplicationContext) context).close();
    }

    @Test
    public void test2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring/SpringConfig.xml");
        Object  o = context.getBean(AccountInfo.class);
        System.out.println("6.使用");
        ((ClassPathXmlApplicationContext) context).close();
    }

    @Test
    public void test3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring/SpringConfig.xml");
        Object  o = context.getBean(AccountInfo.class);
        System.out.println("8.使用");
        ((ClassPathXmlApplicationContext) context).close();
    }
}

C. 2 输出结果
在这里插入图片描述

可以根据代码一步步进行累加,逐步理解10步骤的意思即可

转载:https://www.bilibili.com/video/BV1L14y1S7cf/?spm_id_from=333.337.search-card.all.click&vd_source=6451bb187cdcf8a07158b6acb30c5cac

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值