开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
前言
我们在Spring项目当中,有些时候需要在Bean创建出来后做一些初始化的操作,比如项目启动后自动加载缓存,或者Bean创建好后创建线程池或者链接池等操作;面对这种应用场景,我们应该如何使用Spring来完成呢?
配置方式
我们在以前使用xml配置Bean的时候,经常会使用到init-method这么一个属性,我们来看一个示例:
package com.test.service;
public class UserService{
public void init(){
// TODO
// 执行初始化操作
}
}
xml编写示例如下:
<bean id="myService" class="com.test.service.UserService" init-method="init"></bean>
我们通过在xml中指定UserService这个Bean创建完毕后第一时间执行方法名称为init的初始化方法;
注解方式
第二种指定初始化的方式就是注解,我们通常会使用@PostConstruct注解来标注Bean的初始化方法:
package com.test.service;
@Service
public class UserService{
@PostConstruct
public void init(){
// TODO
// 执行初始化操作
}
}
关于@PostConstruct的实现原理在前面的文章Spring中@PostConstruct是如何实现的详细讲解过,感兴趣的小伙伴可以了解一下;主要原理还是利用了Spring的生命周期扩展点BeanPostProcessor实现的;
实现指定接口
第三种方式就是要求目标类实现指定的接口InitializingBean,这个接口里面有一个需要实现的方法afterPropertiesSet(),很明显这个方法的意思就是在Bean的所有属性值都设置完毕后调用:
package com.test.service;
@Service
public class UserService implements InitializingBean{
public void afterPropertiesSet(){
// TODO
// 执行初始化操作
}
}
实现了这个接口的Bean在所有的属性值被设置后将会自动调用afterPropertiesSet()方法;
注意
在设置初始化方法时,有以下几个注意点:
1.初始化方法不可以有任何参数,否则将执行失败;
2.
xml配置方式与实现InitializingBean接口的方式只可以设置一个初始化方法,@PostConstruct注解方式可以设置多个注解方法,甚至允许父类也通过@PostConstruct注解方式设置初始化方法;3.初始化方法的修饰符不可以是
static修饰;
小结
通过上述讲解,我们大概知道了有三种方式配置Bean的初始化方法:
1.
xml配置属性init-method来设置Bean的初始化方法名称;2.通过注解
@PostConstruct标注初始化方法;3.通过实现接口
InitializingBean的afterPropertiesSet()方法来实现Bean的初始化;