当通过注释驱动配置spring时,如何为bean设置init-method?

时间:2011-12-24 02:51:24

标签: spring configuration annotations initialization spring-roo

我使用spring roo来构建项目并且它是注释驱动的,并且XML文件中没有bean定义。所有配置信息都在* .aj文件中。

现在我想为没有默认构造函数的bean设置一个init方法(该bean来自第三方,它有一个带参数的构造函数,我不能删除它们或给出一个默认的构造函数它。)

有人可以告诉我该怎么做吗?

我想这样做的原因是因为我想使用applicationContext.getBean("thatBeanName")来动态获取bean并使用它。因为bean没有默认构造函数,所以我总是得到错误:java.lang.NoSuchMethodException: com.to.that.bean.<init>()这就是为什么我要将init方法添加到bean中。

5 个答案:

答案 0 :(得分:23)

使用@PostConstruct,如下例所示。它相当于init-method="initialize()"

@PostConstruct
public void initialize() {
    messages.put("English", "Welcome");
    messages.put("Deutsch", "Willkommen");
}

答案 1 :(得分:18)

@Bean(initMethod="init")
public MyBean getMyBean() {
 ...
}

答案 2 :(得分:4)

在春季容器中它是&#34; init&#34;被称为最后的方法,
@postconstruct在afterPropertiesSet之前调用。所以如果有人错过使用会更安全。 &#34;为同一个bean配置的多个生命周期机制,具有不同的初始化方法,如下所示:

  

1.方法用@PostConstruct注释

     

2.afterPropertiesSet(),由InitializingBean回调接口

定义      
      
  1. 自定义配置的init()方法   [https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-java-lifecycle-callbacks][1]
  2.   

虽然,但今天我更喜欢Spring独立并使用@Postconstract,甚至配置默认的init方法识别。只有有意义的方法名称表明它应该用于初始化 - 从框架中清除,从注释中清除。

答案 3 :(得分:3)

正如@Pangea所说,@PostConstruct是最好的选择。你也可以实现initializingBean并在afterPropertiesSet方法中进行初始化。检查here这个方法。

答案 4 :(得分:0)

我意识到尝试解决问题有多个答案。但是引入了@Configuration,这在 Spring Boot 中很常用。事情发生了一些变化。

如果您在@Bean带注释的类中使用@Configuration注释,请执行以下操作:

@Configuration
class FooClass {
    @Bean
    public Bar bar() {
        return new Bar();
    }
}

如果要在初始化期间在bean实例上使用自动调用的方法,则有以下两个选项:

选项1:

@Configuration
class FooClass {
    @Bean(initMethod="init")
    public Bar bar() {
        return new Bar();
    }
}

选项2:

@Configuration
class FooClass {
    @Bean
    public Bar bar() {
        Bar bar = new Bar();
        bar.init();
        return bar;
    }
}

但是,正如@Bean Java Doc中的解释:

 /**

     * The optional name of a method to call on the bean instance during initialization.

     * Not commonly used, given that the method may be called programmatically directly

     * within the body of a Bean-annotated method.

     * The default value is {@code ""}, indicating no init method to be called.

     */

第二个被认为是一个更好的答案。请参见链接here