我使用spring roo来构建项目并且它是注释驱动的,并且XML文件中没有bean定义。所有配置信息都在* .aj文件中。
现在我想为没有默认构造函数的bean设置一个init方法(该bean来自第三方,它有一个带参数的构造函数,我不能删除它们或给出一个默认的构造函数它。)
有人可以告诉我该怎么做吗?
我想这样做的原因是因为我想使用applicationContext.getBean("thatBeanName")
来动态获取bean并使用它。因为bean没有默认构造函数,所以我总是得到错误:java.lang.NoSuchMethodException: com.to.that.bean.<init>()
这就是为什么我要将init方法添加到bean中。
答案 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回调接口
定义
虽然,但今天我更喜欢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实例上使用自动调用的方法,则有以下两个选项:
@Configuration
class FooClass {
@Bean(initMethod="init")
public Bar bar() {
return new Bar();
}
}
@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