首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring automagic @Autowired

Spring automagic @Autowired
EN

Stack Overflow用户
提问于 2015-12-07 19:58:46
回答 2查看 323关注 0票数 0
代码语言:javascript
复制
@Autowired
Environment env;

@Value("${jdbcConnectionString}")
    private String jdbcConnectionString;

上述功能在某些类中自动工作,但是在相同包中的类似类中为null,并且具有相同的注解@Configuration/@Component

我试图找出正确的方法来理解spring在配置各种工件时所做的事情。

我可以时不时地运行一些东西,但是任何能理解魔法的好资源都会受到很好的赞赏。

PS。我现在只对基于java-config的方法感兴趣。

工作:

代码语言:javascript
复制
package a.b.c;
@Configuration
public class AppConfig {

    @Autowired 
    Environment env;

package a.b.d;
@Configuration
@EnableBatchProcessing
public class JobConfiguration {

    @Autowired
    private Environment env;

package a.b.L;
public class BatchJobListener implements Ordered, JobExecutionListener {

    @Autowired
    public Environment env;

不在里面工作

代码语言:javascript
复制
package a.b.u

尝试用@Component/@Configuration注释类

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-07 22:16:45

为了自动创建bean,首先需要在上下文中定义它。

代码语言:javascript
复制
@Configuration
public class ConfigOne {

    @Bean
    public String myBean(){
        return "my bean";
    }
}

您想要注入的bean和要注入bean的bean需要在相同的上下文中。你可以这样做:

代码语言:javascript
复制
JavaConfigApplicationContext context =
    new JavaConfigApplicationContext(ConfigOne.class, ConfigTwo.class);

也可以使用@import将一个配置类导入另一个配置类。

代码语言:javascript
复制
@Configuration
@Import(ConfigTwo.class)
    public class ConfigOne {

更新

我的意思是,很可能你没有以合理的方式进行配置。因此,您要注入环境的所有bean都不是在相同的上下文中。

但是,如果您已经配置好了所有的东西,那么有些类可能在环境之前加载。在这种情况下,您可以使用EnvironmentAware

代码语言:javascript
复制
@Configuration
@PropertySource("classpath:myProperties.properties")
public class MyConfiguration implements EnvironmentAware {

    private Environment environment;

    @Override
    public void setEnvironment(final Environment environment) {
        this.environment = environment;
    }

    public void myMethod() {
        final String myPropertyValue = environment.getProperty("myProperty");
        // ...
    }

}
票数 0
EN

Stack Overflow用户

发布于 2015-12-08 19:20:17

在初始化spring引导应用程序的主类中,是否有类似的配置:

代码语言:javascript
复制
@Configuration
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan("a.b") //Note that this scans the components where you have configured spring container backed objects
@PropertySource({
    "classpath:someProperty1.properties",
    "classpath:someProperty2.properties"
})
public class Main{
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }

}

基本上,它告诉spring这是一个配置类,并指示这个配置类也会触发自动配置和组件扫描(只扫描这些特定的包(a.b),并检查是否存在用于自动bean检测的注释,如:@Component, @Service, @Controller, @Repository)。在检测具有这些构造型的任何类时,spring将根据配置创建对象。在创建这些对象时,可能有一些对象具有autowired,或者可以引用在属性文件中定义的一些属性。配置@PropertySource会这样做。

@ComponentScan中的包声明应该是基本包。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34142077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档