spring如何为组件扫描自动创建的bean设置Init方法

How to set Init method for beans automatically created by Component Scanning in spring

在显式定义的 beans 中,可以通过注释定义 init 和 destroy 方法,在 Spring 配置 class:

@Configuration
@ComponentScan
public class Appconfig {
    @Bean(name="Andre",initMethod="init",destroyMethod="destroy")
    @Scope("singleton")
    public Person person() {
        Person person = new Person(1,"Andre");
        person.setTaxId(5);
        return person; 
    }

但是,如果bean是spring通过组件扫描自动创建的,怎么办?

我已经读到要用通过组件扫描创建的 bean 实现相同的效果,init 方法应该用@PostConstruct 注释。但是,@PostConstruct 不是 Spring 的一部分,当我使用这个注解时,出现错误

"PostConstruct cannot be resolved to a type"。

不知道为什么,Eclipse 好像不知道如何自动导入这个注解。经过更多浏览后,我发现使用

import javax.annotation.PostConstruct;

有效,但有警告说:

访问限制:类型'PostConstruct'不是API(对所需库的限制'C:\Program Files\Java\jre1.8.0_45\lib\rt.jar')

所以我有两个问题:

  1. Spring是否有内置机制来声明组件扫描 bean 上的 init 和 destroy 方法?

  2. 为什么会出现错误:访问限制:使用@PostConstruct 时,类型'PostConstruct' 不是API(对必需库'C:\Program Files\Java\jre1.8.0_45\lib\rt.jar' 的限制)?

提前致谢!

您可以实现InitializingBean接口。它声明了 afterPropertiesSet 方法,该方法应该完全按照您的要求执行。

Spring Javadoc InitializingBean

J2EE - Spring 等价物

@PostConstruct - InitializingBean

@PreDestroy - DisposableBean

编辑: 起初有点误解了这个问题。为 Person 创建一个扩展 InitializingBeanDisposableBean 的接口,实现已声明的 afterPropertiesSet()/destroy() 方法并更改 return 类型的 @Bean 接口的注释方法应该可以解决问题。