Spring自动化,@ Autowired

时间:2015-12-07 19:58:47

标签: spring

@Autowired
Environment env;

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

上述内容在某些类中自动生成,但在相同包中的相似类中使用相同的注释@Configuration/@Component时为null。

我正在尝试找出正确的方法来理解弹簧在配置各种工件时的作用。

我能够时不时地运行东西,但是理解魔法的任何好资源都很受欢迎。

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

工作:

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;

不在内部工作

package a.b.u

尝试用@ Component / @Configuration

注释类

2 个答案:

答案 0 :(得分:0)

为了自动装配bean,首先需要在Context中定义它。

@Configuration
public class ConfigOne {

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

要注入的bean和注入bean的bean需要在同一个上下文中。你可以用:

JavaConfigApplicationContext context =
    new JavaConfigApplicationContext(ConfigOne.class, ConfigTwo.class);

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

@Configuration
@Import(ConfigTwo.class)
    public class ConfigOne {

<强>更新

我的意思是,你可能没有以环形方式进行配置。因此,您注入环境的所有bean都不在同一个环境中。

但是,如果你已经很好地配置了一切,那么在环境之前可能会加载一些类。在这种情况下,您可以使用 EnvironmentAware

@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");
        // ...
    }

}

答案 1 :(得分:0)

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

printf

这基本上是做什么的,它告诉spring这是一个配置类,并指示这个配置类它还触发自动配置和组件扫描(只扫描这些特定的包(ab)并检查是否有任何注释用于自动bean检测,如:@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将根据配置创建对象。在创建这些对象时,可能有@Component, @Service, @Controller, @Repository个对象,或者可以引用属性文件中定义的某些属性。配置autowired执行此操作。

@PropertySource中的包声明应该是基础包。