在 Spring Context @Configuration 中运行 void setup 方法

我希望在我的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


答案 1

您可以使用注释代替 :@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");
    }

    ...

}

答案 2

使用@PostConstruct而不是@bean

@PostConstruct

由于焊缝参考的注入和初始化按此顺序发生;

  1. 首先,容器调用 Bean 构造函数(默认构造函数或带注释@Inject的构造函数),以获取 Bean 的实例。
  2. 接下来,容器初始化 Bean 的所有注入字段的值。
  3. 接下来,容器调用Bean的所有初始值设定项方法(调用顺序不可移植,不要依赖它)。
  4. 最后,调用该方法(如果有)。@PostConstruct

因此,使用目的很明确;它为您提供了初始化注入的bean,资源等的机会。@PostConstruct

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被称为...

重要的一点是,如果您尝试通过生产者方法注入和初始化Bean,则不会调用它。因为使用生产者方法意味着您正在以编程方式创建、初始化和注入 bean 与 new 关键字。@PostConstruct

资源链接:

  1. CDI 依赖关系注入@PostConstruct和@PreDestroy示例
  2. 为什么使用@PostConstruct?

推荐