Spring中你一定要知道的afterPropertiesSet()

文章目录

  • 功能
  • 源码

功能

初始化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;

    @Override
    public 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)

Spring中你一定要知道的afterPropertiesSet()_第1张图片

下面这段就是afterPropertiesSet方法执行的逻辑,最终执行是通过接口InitializingBean直接调用;

AccessController.doPrivileged是提供了方法资源的特权,可以不用理会;

注意:

mbd.isExternallyManagedInitMethod("afterPropertiesSet")判断的是afterPropertiesSet不是@PostConstruct标注的方法之一,如果是,就直接跳过不执行,所以需要注意
Spring中你一定要知道的afterPropertiesSet()_第2张图片

你可能感兴趣的:(Spring,spring,java,后端)