前言
@Configuration
用于定義配置類(lèi)樊拓,可替換XML配置文件典勇,被注解的類(lèi)內(nèi)部包含一個(gè)或多個(gè)@Bean
注解方法蝶糯±纸可以被AnnotationConfigApplicationContext
或者AnnotationConfigWebApplicationContext
進(jìn)行掃描划乖。用于構(gòu)建bean定義以及初始化Spring容器。
實(shí)例
@Configuration 加載Spring方法
Car.java
public class Car {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
定義Config類(lèi)
@Configuration
public class Config {
public Config() {
System.out.println("TestConfig容器初始化...");
}
@Bean(name = "getMyCar")
public Car getCar() {
Car c = new Car();
c.setName("dankun");
return c;
}
}
實(shí)例化
public void testConfig() {
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Car car = (Car)context.getBean("car");
System.out.println(car.getName());
}
// 輸出
// TestConfig容器初始化...
// dankun
@Configuration + @Component
@Configuration
也附帶了@Component的功能挤土。所以理論上也可以使用@Autowared
功能琴庵。上述代碼可以改成下面形式
Car.java
@Component
public class Car {
@Value("dankun")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Config.java
@Configuration
@ComponentScan("com.wuyue.annotation")
public class Config {
public Config() {
System.out.println("TestConfig容器初始化...");
}
測(cè)試主入口
public class TestConfig {
@Test
public void testConfig() {
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Car car = (Car)context.getBean("car");
System.out.println(car.getName());
}
}
// 輸出
// TestConfig容器初始化...
// dankun
總結(jié)
- @Configuation等價(jià)于
<Beans></Beans>
- @Bean 等價(jià)于
<Bean></Bean>
- @ComponentScan等價(jià)于
<context:component-scan base-package="com.dxz.demo"/>
- @Component 等價(jià)于
<Bean></Bean>
@Bean VS @Component
- 兩個(gè)注解的結(jié)果是相同的,bean都會(huì)被添加到Spring上下文中仰美。
- @Component 標(biāo)注的是類(lèi),允許通過(guò)自動(dòng)掃描發(fā)現(xiàn)迷殿。@Bean需要在配置類(lèi)
@Configuation
中使用。 - @Component類(lèi)使用的方法或字段時(shí)不會(huì)使用
CGLIB
增強(qiáng)咖杂。而在@Configuration類(lèi)中使用方法或字段時(shí)則使用CGLIB創(chuàng)造協(xié)作對(duì)象
假設(shè)我們需要將一些第三方的庫(kù)組件裝配到應(yīng)用中或者 我們有一個(gè)在多個(gè)應(yīng)用程序中共享的模塊庆寺,它包含一些服務(wù)。并非所有應(yīng)用都需要它們诉字。
如果在這些服務(wù)類(lèi)上使用@Component并在應(yīng)用程序中使用組件掃描懦尝,我們最終可能會(huì)檢測(cè)到超過(guò)必要的bean。導(dǎo)致應(yīng)用程序無(wú)法啟動(dòng)
但是我們可以使用 @Bean
來(lái)加載
因此壤圃,基本上陵霉,使用@Bean
將第三方類(lèi)添加到上下文中。和@Component
伍绳,如果它只在你的單個(gè)應(yīng)用程序中