在Sprint Boot 2.3/Spring 5中创建自定义FactoryBean
我有一个SpringBootWeb应用程序,它大部分工作正常;我的数据源由外部在Sprint Boot 2.3/Spring 5中创建自定义FactoryBean,spring,spring-boot,javabeans,autowired,Spring,Spring Boot,Javabeans,Autowired,我有一个SpringBootWeb应用程序,它大部分工作正常;我的数据源由外部应用程序.properties文件正确配置 现在,我想向该文件添加属性,以帮助我在我的应用程序中实例化和配置一个类的两个实例。我有一个APNsFactory,我目前手动实例化并使用JNDI进行配置,但我想避开JNDI调用: @Bean 公众的 APNSF工厂 apnsFactory() 投掷 javax.naming.NamingException { sLogger.info(“配置APNsFactory”); In
应用程序.properties
文件正确配置
现在,我想向该文件添加属性,以帮助我在我的应用程序中实例化和配置一个类的两个实例。我有一个APNsFactory
,我目前手动实例化并使用JNDI进行配置,但我想避开JNDI调用:
@Bean
公众的
APNSF工厂
apnsFactory()
投掷
javax.naming.NamingException
{
sLogger.info(“配置APNsFactory”);
InitialContext ctx=新的InitialContext();
APNsFactory f=新的APNsFactory();
f、 setProductionKeyRepath((字符串)ctx.lookup(“java:comp/env/apns/prod/keystRepath”);
f、 setProductionKeystorePassword((字符串)ctx.lookup(“java:comp/env/apns/prod/keystorePassword”);
f、 setdevelopmentkeystrepath((字符串)ctx.lookup(“java:comp/env/apns/dev/keystrepath”);
f、 setdevelopmentkeystrepassword((String)ctx.lookup(“java:comp/env/apns/dev/keystrepassword”);
返回f;
}
以前在独立的webapp容器中运行时,Spring正确地调用了该方法,容器的
标记中的JNDI上下文可用
我正在尝试将我的APNsFactory
更新为一个合适的SpringFactoryBean
,并且我已经给了它一些@Autowire-String
变量,我希望Spring引导从应用程序.properties
文件中设置这些变量
为了获得额外的积分,我希望它可以在Spring Boot和像Tomcat或Resin这样的独立容器中使用
就我个人而言,我不知道如何让Spring做到这一点。Spring已经实现了几十个数据源和其他bean的示例,但是在Spring Boot web环境中,没有一个是完全定制的,使用application.properties
我见过一些使用XML配置文件的示例,但我不确定如何使用Spring Boot实现这一点。我认为这里不需要工厂bean。 您已经有了spring boot,它可以读取
应用程序。属性
开箱即用:
因此,请尝试以下方法:
应用程序.properties
文件中创建键/值:ConfigurationProperties
class@Configuration
(创建@Bean public APNsFactory APNsFactory()
)的类中,执行以下操作:prod
配置文件运行,那么除了要加载的application.properties
之外,您还可以将这些keystore
相关定义放入application-prod.properties
(后缀与配置文件名称匹配)-spring boot将自动加载这些属性。当然,dev
profile也是如此
现在我还没有完全理解“奖励点”任务:)这种机制是spring boot处理配置的专有方式。在“独立”服务器中,它应该仍然与内部的spring boot有一场战争,所以它无论如何都会使用这种机制。也许你可以进一步澄清,以便我/我们的同事能提供更好的答案我认为你不需要工厂豆。 您已经有了spring boot,它可以读取
应用程序。属性
开箱即用:
因此,请尝试以下方法:
应用程序.properties
文件中创建键/值:ConfigurationProperties
class@Configuration
(创建@Bean public APNsFactory APNsFactory()
)的类中,执行以下操作:prod
配置文件运行,那么除了要加载的application.properties
之外,您还可以将这些keystore
相关定义放入application-prod.properties
(后缀与配置文件名称匹配)-spring boot将自动加载这些属性。当然,dev
profile也是如此
现在我还没有完全理解“奖励点”任务:)这种机制是spring boot处理配置的专有方式。在“独立”服务器中,它应该仍然与内部的spring boot有一场战争,所以它无论如何都会使用这种机制。也许您可以进一步澄清,以便我/我们的同事能够提供更好的答案谢谢,这很有效!我还不确定如何在一个独立的容器中实现这一点,但当我到达它时,我会烧掉这座桥。几张便条;我在我的
AppConfig
类上使用了@ComponentScan
,在包含我的ConfigurationProperties类的包中指定了一个类。我恰当地命名了setter/getter,以匹配.properties文件
,不必以任何特殊方式命名字段。最后,prod/dev是由运行时决定的,所以两者都必须配置,但我已经处理好了。谢谢,这很有效!我还不确定如何在一个独立的容器中实现这一点,但当我到达它时,我会烧掉这座桥。几张便条;我在我的AppConfig
类上使用了@ComponentScan
,在包含我的ConfigurationProperties类的包中指定了一个类。我恰当地命名了我的setter/getter
myapp.keystore.path=...
myapp.keystore.passwd=...
// the same for other properties
@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
// 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
}
}