我希望在Spring Context中执行几种设置方法。
我目前有以下代码,但它不起作用,因为我说它们是beans
并且没有返回类型。
@Configuration
@Component
public class MyServerContext {
...
// Works
@Bean
public UserData userData() {
UserData userData = new AWSUserDataFetcher(urlUtil()).fetchUserData();
return userData;
}
// Doesn't work
@Bean
public void setupKeyTrustStores() {
// Setup TrustStore & KeyStore
System.setProperty(SYS_TRUST_STORE, userData().get(TRUST_STORE_PATH));
System.setProperty(SYS_TRUST_STORE_PASSWORD, userData().get(TRUST_STORE_PASSWORD));
System.setProperty(SYS_KEY_STORE, userData().get(KEY_STORE_PATH));
System.setProperty(SYS_KEY_STORE_PASSWORD, userData().get(KEY_STORE_PASSWORD));
// Prevents handshake alert: unrecognized_name
System.setProperty(ENABLE_SNI_EXTENSION, "false");
}
...
}
如何在没有@Configuration
注释的@Bean
上下文中自动运行此方法?
答案 0 :(得分:11)
您可以使用@PostConstruct
注释代替@Bean
:
@Configuration
@Component
public class MyServerContext {
@Autowired
private UserData userData; // autowire the result of userData() bean method
@Bean
public UserData userData() {
UserData userData = new AWSUserDataFetcher(urlUtil()).fetchUserData();
return userData;
}
@PostConstruct
public void setupKeyTrustStores() {
// Setup TrustStore & KeyStore
System.setProperty(SYS_TRUST_STORE, userData.get(TRUST_STORE_PATH));
System.setProperty(SYS_TRUST_STORE_PASSWORD, userData.get(TRUST_STORE_PASSWORD));
System.setProperty(SYS_KEY_STORE, userData.get(KEY_STORE_PATH));
System.setProperty(SYS_KEY_STORE_PASSWORD, userData.get(KEY_STORE_PASSWORD));
// Prevents handshake alert: unrecognized_name
System.setProperty(ENABLE_SNI_EXTENSION, "false");
}
...
}
答案 1 :(得分:1)
Use @PostConstruct instead of @bean
由于Weld Reference注入和初始化按此顺序发生;
@PostConstruct
方法(如果有的话)。因此,使用@PostConstruct
的目的很明确;它让你有机会初始化注入的bean,资源等。
public class Person {
// you may have injected beans, resources etc.
public Person() {
System.out.println("Constructor is called...");
}
@PostConstruct
public void init() {
System.out.println("@PostConstruct is called...");
} }
因此,注入Person bean的输出将是;
构造函数被调用...
@PostConstruct被称为......
关于@PostConstruct
的一个重点是,如果您尝试通过生产者方法注入和初始化bean,则不会调用它。因为使用生成器方法意味着您使用新关键字以编程方式创建,初始化和注入bean。