文章目录
- 功能
- 源码
功能
初始化bean执行的回调方法其一,它不像@PostConstruct
一样可以有多个,只能调用一次;它执行的时机是在@PostConstruct
之后,从它的名称也可以看出,他是在属性填充完,也就是bean初始化完后执行的回调方法。
注意:
如果afterPropertiesSet
方法被@PostConstruct
标注,那么它就指挥在@PostConstruct
时机执行,且只会执行一次。
在开发中,常会使用在缓存的场景,对某一类数据进行缓存,或者需要在某一个bean完成初始化就需要执行的功能场景。
例如:
作为示例,下面代码不严谨,常量需要定义到常量表,可管理,然后缓存尽量不要永久缓存,需要设置过期事件
@Component
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class TableServiceImpl extends ServiceImpl<TableMapper, Table> implements TableService, InitializingBean {private final StringRedisTemplate redisTemplate;@Overridepublic void afterPropertiesSet() throws Exception {List<Table> list = this.list();if (list.isEmpty()) {return;}redisTemplate.opsForValue().set("pro:table", JSONUtil.toJsonPrettyStr(list));}
}
源码
上面提到,回调执行时机是在bean初始化完后,那么直接定位:
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
下面这段就是afterPropertiesSet
方法执行的逻辑,最终执行是通过接口InitializingBean
直接调用;
AccessController.doPrivileged
是提供了方法资源的特权,可以不用理会;
注意:
mbd.isExternallyManagedInitMethod("afterPropertiesSet")
判断的是afterPropertiesSet
不是@PostConstruct
标注的方法之一,如果是,就直接跳过不执行,所以需要注意