你能说说Spring框架中Bean的生命周期吗?

75 阅读5分钟

引言

今天讲的是Java面试合集EP【02】Spring框架中Bean的生命周期

首先简单说一下(以下为一个回答的参考模板)

1、实例化一个Bean--也就是我们常说的new;

2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;

3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值

4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);

5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);

6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。

9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;

10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

结合代码理解一下

1、Bean的定义

Spring通常通过配置文件定义Bean。如:

  
<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-2.0.xsd”>  
  
<bean id=”HelloWorld” class=”com.pqf.beans.HelloWorld”>  
    <property name=”msg”>  
       <value>HelloWorld</value>  
    </property>  
</bean>  
  
</beans>

这个配置文件就定义了一个标识为 HelloWorld 的Bean。在一个配置文档中可以定义多个Bean。

2、Bean的初始化

有两种方式初始化Bean。

1、在配置文档中通过指定init-method 属性来完成

在Bean的类中实现一个初始化Bean属性的方法,如init(),如:

   public String msg=null;  
   public Date date=null;  
  
    public void init() {  
      msg=”HelloWorld”;  
      date=new Date();  
    }  
    ……   
}

然后,在配置文件中设置init-mothod属性:

2、实现 org.springframwork.beans.factory.InitializingBean接口

Bean实现InitializingBean接口,并且增加 afterPropertiesSet() 方法:

   public String msg=null;  
   public Date date=null;  
  
   public void afterPropertiesSet() {  
       msg="向全世界问好!";  
       date=new Date();  
   }  
    ……   
}

那么,当这个Bean的所有属性被Spring的BeanFactory设置完后,会自动调用afterPropertiesSet()方法对Bean进行初始化,于是,配置文件就不用指定 init-method属性了。

3、Bean的调用

有三种方式可以得到Bean并进行调用:

1、使用BeanWrapper
BeanWrapper bw=new BeanWrapperImpl(hw);  
bw.setPropertyvalue(”msg”,”HelloWorld”);  
system.out.println(bw.getPropertyCalue(”msg”));
2、使用BeanFactory
XmlBeanFactory factory=new XmlBeanFactory(is);  
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);  
system.out.println(hw.getMsg());
3、使用ApplicationConttext
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);  
System.out.println(hw.getMsg());

4、Bean的销毁

1、使用配置文件中的 destory-method 属性

与初始化属性 init-methods类似,在Bean的类中实现一个撤销Bean的方法,然后在配置文件中通过 destory-method指定,那么当bean销毁时,Spring将自动调用指定的销毁方法。

2、实现 org.springframwork.bean.factory.DisposebleBean接口

如果实现了DisposebleBean接口,那么Spring将自动调用bean中的Destory方法进行销毁,所以,Bean中必须提供Destory方法。

图解

cb916abfd9b0105cb5f6fc1ccaef3677.jpg

近年来,总能看到一些声音质疑八股文的价值,认为它们已经过时。但作为一名面试了几十家公司的后端开发者,我发现:传统的“八股文”不是消失了,而是转化为了更深入的场景化问题。这篇文章将为你分析为什么在金九银十的面试季,后端八股文仍然至关重要。 以下八股文打包好:

bd511e03412be9f1d32ab54718a38dd.png 19d0b00fa36f0d4c9b012118438c35fc.png

过去,Java后端面试可能更多依赖于背诵“八股文”式的基础知识,如Java集合框架的特点、多线程的实现方式等。但现在,面试方式发生了巨大转变,不仅要背还更加注重实际项目经验和解决问题的思维能力。面试官会抛出各种实际项目场景题,像设计一个高并发的秒杀系统,不仅要考虑如何防止超卖、保证数据一致性,还要涉及到缓存策略、分布式锁的应用等多个方面;或者询问线上出现性能问题时,如何通过分析日志、监控数据来定位和解决问题。这种面试方式能更真实地考察候选人的技术水平和应变能力,不再给那些只会死记硬背的人可乘之机,对于没有丰富实践经验和灵活思维的开发者来说,无疑增加了面试难度。

Java后端面试越来越难,是行业发展、技术进步以及企业需求变化等多种因素共同作用的结果。虽然难度提升,但这也为我们指明了努力的方向,持续学习、积累实践经验、拓宽技术视野,才能在这场激烈的求职竞争中脱颖而出。