2015-12-07 114 views
0
@Autowired 
Environment env; 

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

上述工作在某些類中自動生成,但是在相同包中具有相同類和相同註釋@Configuration/@ComponentSpring automagic,@Autowired

我想找出正確的方法來理解配置各種工件時彈簧的功能。

我能夠運行的東西時不時,但任何良好的資源來了解魔術是非常值得讚賞的。

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 

試圖用@組件/ @配置註釋類

+0

請添加您的代碼,當它的工作,當它不是。 – reos

+0

更新了原始問題。我正在尋找按照什麼順序彈簧加載什麼的方法,如果我有自定義類,我如何確保它們被加載和管理,並在需要時可用。 – explorer

回答

0

爲了自動裝配bean的工作,你首先需要定義它在上下文中。

@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 { 

UPDATE

我的意思是,可能你沒有將在ringht方式配置。所以你注入環境的所有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"); 
     // ... 
    } 

} 
+0

環境是Spring自己的物業管理抽象,所以不知道如何解決這個問題,而作爲@Autowired – explorer

+0

我編輯了答案。 – reos

0

在您被初始化春天啓動的應用程序主類中,你是否有類似的配置:

@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說這是一個配置類,並指出這個配置類,它也會觸發自動配置和組件掃描(只掃描這些特定的包(ab)並檢查是否有任何註釋用於自動bean檢測,如:@Component, @Service, @Controller, @Repository)。在檢測到具有這些構造型的任何類時,spring會根據配置創建對象。在創建這些對象時,可能會有一些對象,或者可能引用屬性文件中定義的某些屬性。配置@PropertySource這樣做。

@ComponentScan中的包聲明應該是基本包。

+0

EnableAutoConfiguration 使用SpringBootApplication時,ComponentScan(「a.b」)不是必需的。同樣,由於環境不可訪問,這是因爲它的順序和使用位置不是用戶定義的bean。 – explorer