[英]Autowiring YML/Java Configuration into a Spring Boot Bean
如果我有一个看起来像的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()
中beanThatNeedsMyConfig()
调用它,我通过说myConfig.getDevHost()
调用它,但是当myConfig
为null时,我得到一个空指针。 我认为Spring还没有承认它的存在。 我还在努力抓住Spring Boot和生命周期等等。有关如何实现这一目标的任何知识?
因此,原始代码中发生的事情是,您不需要将任何内容自动装配到bean that needs configuration
的bean that needs configuration
。 当你这样做:
@Bean
public Object beanThatNeedsMyConfig(){return new beanThatNeedsMyConfig();}}
您没有将MyConfig
bean传递给需要它的bean
。 自动装配是美妙的,但它并不神奇。 要传递它,你应该将它自动装入MyOtherConfig
类,或者你应该完全删除beanThatNeedsMyConfig()
方法,这将允许spring创建bean并自动进行自动装配。
顺便说一下: @Inject
注释应该只用于构造函数,任何以不同方式告诉你的人都会对你撒谎。 如果你在BeanThatNeedsMyConfig
的构造函数中使用BeanThatNeedsMyConfig
,你将无法在不传递对象的情况下构造它,并且你的问题本身就是明显的。
查看Spring Boot文档( bean的 结构和自动配置 )。
通常,最简单的方法是将SpringBootApplication
放在包层的根部(例如com.example.myapp
),然后根据需要进行扩展(例如com.example.myapp.model
)。 如果这样做,除了使用SpringBootApplication
为基本应用程序注释Application
之外,您不必执行任何操作。 您可能需要其他注释来获取其他功能,例如EnableJpaRepositories
。
如果按照上面的建议构建代码(在根包中定位应用程序类),则可以添加不带任何参数的@ComponentScan。 所有应用程序组件(@ Component,@ Service,@ Repository,@ Controller等)都将自动注册为Spring Beans。
'自动注册为Spring Beans'意味着您不需要定义使用默认或Autowired构造函数的@Bean
方法。 这些是自动为您提供的。 您只需要为需要手动配置的事物显式定义@Bean
方法,例如来自自定义Builder对象的内容。
所以它似乎在类的内部
@Bean
public Object beanThatNeedsMyConfig()
它似乎根本不知道关于MyConfig
自动装配。 但是,如果我将自动装配的对象移动到MyOtherConfig
(带有所有带注释的bean的类),它就存在并且我能够使用.yml中的属性,我所要做的就是将自动装配的myConfig
传递给类需要它,它的工作原理。
如果有人想在我的答案中添加评论(或提出一个全新的答案)来详细说明为什么Spring在我的主要配置类中使用我的bean知道它,而不是在bean本身内部,我相信它可以证明是对他人有价值的信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.