我有一个可以正常工作的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来做到这一点。
我认为您这里不需要工厂bean。您已经有了可以直接读取application.properties
的spring boot:
因此,请尝试以下操作:
application.properties
文件中创建键/值:myapp.keystore.path=...
myapp.keystore.passwd=...
// the same for other properties
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
}
@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,因此无论如何它将使用此机制。也许您可以澄清更多,以便我/我们的同事可以提供更好的答案