将YML / Java配置自动装配到Spring Boot Bean中

时间:2016-07-21 14:08:19

标签: java spring-boot

如果我有一个看起来像

的application.yml
system:
  props:
    version: 1.0.0
    host: myhost
  myapp:
    environment: LOCAL

---
spring:
  profiles: DEV
system:
  myapp:
    environment: DEV
devhost: mydevhost

---
spring:
  profiles: PROD
system:
  myapp:
    environment: PROD
testhost: myprodhost

我使用

设置了一个配置类
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
public class MyConfig { 
private string devhost;
:
:
public String getDevHost() {return devhost;}
}

我是否能够将MyConfig自动装入类,该类是类似于

的类的带注释的bean
@Configuration
@EnableJms
public class MyOtherConfig { 
@Bean
 public Object beanThatNeedsMyConfig(){return new beanThatNeedsMyConfig();}
 }

我尝试使用我的直觉并在beanThatNeedsMyConfig()中自动启动它并且我通过说myConfig.getDevHost()来调用它,但我得到一个空指针myConfig一片空白。我假设Spring还没有承认它的存在。我还在努力抓住Spring Boot和生命周期等等。有关如何实现这一目标的任何知识?

3 个答案:

答案 0 :(得分:2)

因此,您的原始代码中发生的事情是您没有在$category = category::with('parentCategory')->get(); 中自动装配任何内容。当你这样做时:

bean that needs configuration

您没有将@Bean public Object beanThatNeedsMyConfig(){return new beanThatNeedsMyConfig();}} bean传递给需要它的MyConfig。自动装配是美妙的,但它并不神奇。要传递它,你应该将它自动装入bean类,或者你应该完全删除MyOtherConfig方法,这将允许spring创建bean并自动进行自动装配。

顺便说一下:beanThatNeedsMyConfig()注释应该只用于构造函数,任何以不同方式告诉你的人都会对你撒谎。如果你在@Inject的构造函数上拥有它,那么在没有传递对象的情况下你就无法构造它而你的问题本身就是明显的。

答案 1 :(得分:1)

查看Spring Boot文档(structureautoconfiguration of beans)。

通常,最简单的方法是将SpringBootApplication放在包层次结构的根(例如com.example.myapp),然后根据需要进行扩展(例如com.example.myapp.model)。如果您这样做,除了为Application SpringBootApplication注释基本应用程序之外,您无需执行任何操作。您可能需要其他注释来添加其他功能,例如EnableJpaRepositories

  

如果按照上面的建议构建代码(在根包中定位应用程序类),则可以添加不带任何参数的@ComponentScan。所有应用程序组件(@ Component,@ Service,@ Repository,@ Controller等)都将自动注册为Spring Beans。

'自动注册为Spring Beans'意味着您无需定义使用默认或Autowired构造函数的@Bean方法。这些是自动为您提供的。您只需要为需要手动配置的内容明确定义@Bean方法,例如来自自定义Builder对象的内容。

答案 2 :(得分:0)

所以它似乎在

类中
@Bean
public Object beanThatNeedsMyConfig()

它似乎根本不知道MyConfig自动装配它。但是,如果我将自动装配的对象移动到MyOtherConfig(包含所有带注释的bean的类),它就存在并且我能够使用.yml中的属性,我所要做的就是通过自动装配的{ {1}}到需要它的类,它可以工作。

如果有人想在我的答案中添加评论(或提出一个全新的答案)来详细说明为什么Spring在我的主要配置类中使用我的bean知道它,而不是在bean本身内部,我会这样做确定它可以证明是对他人有价值的信息