Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Sprint Boot 2.3/Spring 5中创建自定义FactoryBean_Spring_Spring Boot_Javabeans_Autowired - Fatal编程技术网

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

在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

我有一个SpringBootWeb应用程序,它大部分工作正常;我的数据源由外部
应用程序.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
更新为一个合适的Spring
FactoryBean
,并且我已经给了它一些
@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()
    )的类中,执行以下操作:
  • 我故意没有显示生产与开发之间的分离。 在SpringBoot中,您有配置文件,因此可以配置相同的工件(WAR、JAR等)以使用不同的配置文件运行,这取决于将读取相应的属性

    例如:

    如果您使用
    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()
    )的类中,执行以下操作:
  • 我故意没有显示生产与开发之间的分离。 在SpringBoot中,您有配置文件,因此可以配置相同的工件(WAR、JAR等)以使用不同的配置文件运行,这取决于将读取相应的属性

    例如:

    如果您使用
    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
       } 
    }