Bean的生命周期
ioc容器中bean的生命周期分为四个部分:
- Bean的定义
- Bean的初始化
- Bean的生存期
- Bean销毁
-
bean的定义过程
容器启动时,spring通过我们的配置扫描带有@Component、@Service等注解的类并进行解析,解析的过程可以说是读取了我们对Bean(类)的描述,生成了Bean(类)的定义,并将Bean(类)的定义保存起来。然后将该定义发布到ioc容器中,但此时容器中并没有生成Bean的实例。
bean定义的过程可以看作是扫描并发布Bean的过程。 -
bean的初始化
Bean的定义完成后,在默认的情况下ioc容器会进行初始化操作生成Bean的实例并完成依赖注入。
若是想要在我们取出Bean的时候再让ioc容器对其进行初始化,则可以使用@ComponentScan中的配置项lazyInit实现懒加载。如下:
@ComponentScan(basePackages="com.example.demo.*",lazyInit = false)
public class MyConfig {
}
lazyInit属性默认为false,即不进行延迟加载。若配置为true,则该Bean在我们使用@Autowired进行注入时才进行初始化。
- @PostConstruct注解
该注解是由java提供的,java中的说明: @PostConstruct用来修饰一个非静态的void方法,该方法在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
在spring中,被@PostConstruct修饰的方法在@Autowired之后立即执行,可以用来实现一些自定义的初始化。什么意思呢,看如下的代码:
public class MyTest {
private String m;
@Autowired
private MyTest1 mytest1;
public MyTest() {
}
@PostConstruct
public void init() {
System.out.println("mytest1自定义初始化操作");
}
}
在ioc容器对MyTest进行初始化时,首先会执行MyTest的构造方法,然后变量m会被赋予初值。而mytest1依赖于依赖注入,无法在构造方法中进行初始化,而我们又需要完成某些自定义的初始化操作,则可以使用@PostConstruct注解方法来进行初始化。
- 实现InitializingBean接口
自定义初始化还可以通过重写InitializingBean接口的afterPropertiesSet()方法来进实现。注意:若存在@PostConstruct修饰的方法,则afterPropertiesSet()方法在其之后执行。
- bean的生存期
bean的生存期即bean在程序运行时的流转。 - bean的销毁
- @PreDestroy注解
用@PreDestr