1、对象实例化
2、属性设置
3、初始化
4、使用
5、销毁
示例代码如下:
java
import org.springframework.stereotype.Component;
@Component
public class SpringBeanA {
public SpringBeanA() {
System.out.println("第一步:实例化(spring对象:SpringBeanA)");
}
}
java
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class SpringBeanLifeCycle implements InitializingBean, BeanNameAware, BeanFactoryAware, DisposableBean {
private SpringBeanA springBeanA;
@Autowired
public void setControllerTest(SpringBeanA springBeanA) {
System.out.println("第二步:属性设置(spring对象注入,@Autowired、@Resource、@Value)");
this.springBeanA = springBeanA;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("第三步:属性设置后,调用InitializingBean接口的方法");
}
@PostConstruct
public void postConstructMethod() {
System.out.println("(init方法调用前)@PostConstruct方法调用");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("(init方法调用前)SetBeanFactory回调接口");
}
@Override
public void setBeanName(String name) {
System.out.println("(init方法调用前)setBeanName回调接口, name=" + name);
}
@Override
public void destroy() throws Exception {
System.out.println("第四步:DisposableBean-->destroy方法调用");
}
@PreDestroy
public void testDestroy() {
System.out.println("第四步(另一种方式):@PreDestroy方法调用");
}
}
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConfigurationBeanTest {
@Bean(initMethod = "initMethodTest",destroyMethod = "destroyTest")
public SpringBean getBean() {
return new SpringBean();
}
public static class SpringBean {
public void initMethodTest() {
System.out.println("第三步(另一种方式):@Bean(initMethod属性标识的方法)");
}
public void destroyTest() {
System.out.println("第四步(另一种方式):@Bean(destroyMethod属性标识的方法)");
}
}
}
打印如下:
第一步:实例化(spring对象:SpringBeanA)
第二步:属性设置(spring对象注入,@Autowired、@Resource、@Value)
(init方法调用前)setBeanName回调接口, name=springBeanLifeCycle
(init方法调用前)SetBeanFactory回调接口
(init方法调用前)@PostConstruct方法调用
第三步:属性设置后,调用InitializingBean接口的方法
第三步(另一种方式):@Bean(initMethod属性标识的方法)
(Tomcat started)
第四步(另一种方式):@Bean(destroyMethod属性标识的方法)
第四步(另一种方式):@PreDestroy方法调用
第四步:DisposableBean-->destroy方法调用
说明:
实现接口BeanNameAware,可以让SpringBean知道自己的名字,做一些日志记录等操作;实现BeanFactoryAware是为了让SpringBean拥有访问BeanFactory的能力,从而可以根据需要使用beanFactory.getBean()获取别的SpringBean,但是要谨慎使用,因为这个可能会破坏Ioc的原则,尽可能使用@Autowired或者@Value注解使用别的SpringBean