在Sprint Boot 2.3 / Spring 5中创建自定义FactoryBean

问题描述 投票:0回答:1

我有一个可以正常工作的spring-boot网络应用程序;我的数据源已通过外部application.properties文件正确配置。

现在,我想向该文件添加属性,以帮助我在我的应用程序中实例化和配置一个类的两个实例。我有一个APNsFactory,目前正在手动实例化并使用JNDI进行配置,但我想摆脱JNDI调用:

    @Bean
    public
    APNsFactory
    apnsFactory()
        throws
            javax.naming.NamingException
    {
        sLogger.info("Configuring APNsFactory");

        InitialContext ctx = new InitialContext();

        APNsFactory f = new APNsFactory();
        f.setProductionKeystorePath((String) ctx.lookup("java:comp/env/apns/prod/keystorePath"));
        f.setProductionKeystorePassword((String) ctx.lookup("java:comp/env/apns/prod/keystorePassword"));
        f.setDevelopmentKeystorePath((String) ctx.lookup("java:comp/env/apns/dev/keystorePath"));
        f.setDevelopmentKeystorePassword((String) ctx.lookup("java:comp/env/apns/dev/keystorePassword"));
        return f;
    }

[以前在独立的Webapp容器中运行时,Spring会正确调用该方法,并且容器的<env-entry>标记中的JNDI上下文可用。

我正在尝试将我的APNsFactory更新为适当的Spring FactoryBean<>,并且给了它几个@Autowire String变量,这些变量我想由Spring Boot从application.properties文件中进行设置。

关于奖励积分,我希望这可以在Spring Boot和像Tomcat或Resin这样的独立容器中使用。

为了我的一生,我不知道如何让Spring做到这一点。 Spring已经实现了数十个有关DataSources和其他Bean的示例,但对于在Spring Boot Web环境中使用application.properties进行完全自定义的示例,则没有一个示例。

我已经看到了一些使用XML配置文件的示例,但是我不确定如何使用Spring Boot来做到这一点。

spring spring-boot javabeans autowired
1个回答
0
投票

我认为您这里不需要工厂bean。您已经有了可以直接读取application.properties的spring boot:

因此,请尝试以下操作:

  1. application.properties文件中创建键/值:
myapp.keystore.path=...
myapp.keystore.passwd=...
// the same for other properties
  1. 创建ConfigurationProperties

@ConfigurationProperties(prefix="myapp.keystore")
public class MyAppKeyStoreConfigProperties {

   private String path;  // the names must match to those defined in the properties file
   private String passwd;

   ... getters, setters
}

  1. 在标有@Configuration的类(创建@Bean public APNsFactory apnsFactory()的类中,请执行以下操作:

@Configuration
// Note the following annotation:
@EnableConfigurationProperties(MyAppKeyStoreConfigProperties.class)
public class MyConfiguration {
   // Note the injected configuration parameter
   @Bean public APNsFactory apnsFactory(MyAppKeyStoreConfigProperties config) {
       APNsFactory f = new APNsFactory();
       f.setProductionKeystorePath(config.getKeyPath());
       and so on
   } 
}

我故意没有显示生产/开发人员之间的分离。在Spring Boot中,您具有配置文件,因此可以将相同的工件(WAR,JAR等)配置为以不同的配置文件运行,并取决于将读取对应的属性。

示例:

[如果您正在使用prod配置文件运行,那么除了仍然要加载的application.properties,您还可以将这些keystore相关定义放到application-prod.properties(后缀与配置文件名称匹配)-春季启动将自动加载它们。当然,dev配置文件也是如此。

现在我还没有完全理解“加分项”任务:)这种机制是Spring Boot处理配置的专有方式。在“独立”服务器中,它仍应具有内部带有Spring Boot的WAR,因此无论如何它将使用此机制。也许您可以澄清更多,以便我/我们的同事可以提供更好的答案

© www.soinside.com 2019 - 2024. All rights reserved.