2012-08-10 46 views
10

我遇到了Spring 3提供的兩個註解(@Component@Configuration) 我在這些之間有點混淆。
這是我讀到@Component@Component和@Configuration在Spring 3中的區別

將這個「背景:組件」在bean配置文件,這意味着, 啓用春季自動掃描功能。基本包指示 你的組件存儲在哪裏,Spring會掃描這個文件夾並且 找出bean(用@Component註解),並在 Spring容器中註冊它。

所以我想知道有什麼用@Configuration的那麼如果@Controller將註冊我的豆子,而不需要他們宣告春天配置XML文件

回答

8

@Configuration是基於Java的配置的心臟在Spring 3中引入的機制。它提供了基於XML的配置的替代方案。

所以2個以下片段是相同的:

<beans ...> 
    <context:component-scan base-package="my.base.package"/> 
    ... other configuration ... 
</beans> 

和:

@Configuration 
@ComponentScan(basePackages = "my.base.package") 
public class RootConfig { 
    ... other configuration ... 
} 

在兩種情況下Spring將在my.base.package和下方掃描與@Component或其他註釋的一個註解的類其用@Component進行元註釋,例如@Service

7

從書臨春集成

@Configuration類就像普通@Components類,除了具有@Bean註解的方法被用於工廠bean。請注意,@Bean註釋的方法@Component的工作方式相同,只是範圍不被尊重和@Bean方法是重新調用(在戲沒有緩存),所以@Configuration是首選,儘管它需要CGLIB

+6

「注意,是樣B除了是b的行爲像X.注意,也表現得像X。」大。 – 2016-01-11 11:52:08

0

這裏與完整的例子的區別: -

//@Configuration or @Component 
public static class Config { 
    @Bean 
    public A a() { 
     return new A(); 
    } 
    //**please see a() method called inside b() method** 
    @Bean 
    public B b() { 
     return new B(a()); 
    } 
} 

1)在此,如果配置類註解爲@Configuration,比()方法和b()方法,兩者都將被稱爲一次

2)在此,如果用@Component註釋的配置類,比()方法將被調用一次 B()方法將被調用兩次

問題在(2): - 因爲我們已經注意到了@compenent註解的問題。 這個第二個配置(2)完全不正確,因爲spring將創建A的單例bean,但是B將獲得另一個不在spring上下文控件中的A實例。

解決方案: - 我們可以在Config類中使用@autowired註解和@component註解。

@Component 
public static class Config { 
    @Autowired 
    A a; 

    @Bean 
    public A a() { 
     return new A(); 
    } 

    @Bean 
    public B b() { 
     return new B(a); 
    } 
} 
+1

我想b會被稱爲一次和兩次(2 – 2017-09-03 13:36:07

0

雖然這是舊的,但詳細闡述JavaBoy和維傑的答案,用一個例子:

@Configuration 
public class JavaConfig { 
    @Bean 
    public A getA() { 
     return new A(); 
    } 
} 

@Component 
@ComponentScan(basePackages="spring.example") 
public class Main() { 
    @Bean 
    public B getB() { 
     return new B(); 
    } 
    @Autowired 
    JavaConfig config; 

    public static void main(String[]a) { 
     Main m = new AnnotationConfigApplicationContext(Main.class) 
      .getBean(Main.class); 
     /* Different bean returned everytime on calling Main.getB() */ 
     System.out.println(m.getB()); 
     System.out.println(m.getB()); 
     /* Same bean returned everytime on calling JavaConfig.getA() */ 
     System.out.println(m.config.getA()); 
     System.out.println(m.config.getA()); 
    } 
} 
相關問題