目錄
spring 自動(dòng)配置原理
@Configuration介紹
@configuaration @component @service @repository @controller區(qū)別,使用場(chǎng)景
1. spring 自動(dòng)配置原理
Spring 的 bean配置由復(fù)雜的xml文件組成葵陵,在spring boot中液荸,所有的dependency都自動(dòng)添加了bean配置,大功臣就是@EnableAutoConfiguration
在我們添加@SpringBootApplication的時(shí)候脱篙,里面就包含@EnableAutoConfiguration娇钱,@EnableAutoConfiguration使用 SpringFactoriesLoader.loadFactoryNames()
把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一個(gè)xxxAutoConfiguration文件都有條件地加載到容器中。
例如RedisAutoConfiguration
假如我們自己制作的jar包绊困,希望外部引用時(shí)能自動(dòng)加載默認(rèn)屬性并創(chuàng)建bean文搂,需要在resource目錄下添加spring.factories添加我們自定義的配置類
2. @Configuration介紹
@Configuration用于定義配置類,可替換xml配置文件考抄,被注解的類內(nèi)部包含有一個(gè)或多個(gè)被@Bean注解的方法细疚。@configuration相當(dāng)于spring xml配置文件中的<beans>標(biāo)簽,@bean相當(dāng)于<bean>標(biāo)簽川梅。@bean默認(rèn)是單例的
一個(gè)簡(jiǎn)單的例子
@Configuration
public class TestConfiguration {
public TestConfiguration() {
System.out.println("TestConfiguration容器啟動(dòng)初始化疯兼。。贫途。");
}
//@Bean注解注冊(cè)bean,同時(shí)可以指定初始化和銷毀方法
@Bean(name="testBean",initMethod="start",destroyMethod="cleanUp")
@Scope("prototype")
public TestBean testBean() {
return new TestBean();
}
}
引入外部的xml文件
@Configuration
@ImportResource("classpath:applicationContext-configuration.xml")
public class WebConfig {
}
3. @configuaration @component @service @repository @controller區(qū)別,使用場(chǎng)景
3.1 @configuaration @component區(qū)別
下面代碼吧彪,如果是@Configuration修飾,打印的是同一個(gè)car丢早,如果是@component 修飾姨裸,打印的是不同的car。@configuaration修飾的類下面的bean怨酝,會(huì)被ConfigurationClassPostProcessor進(jìn)行增強(qiáng)處理傀缩,使得調(diào)用@Bean修飾的函數(shù)返回的是同一個(gè)對(duì)象。而@component修飾的@bean函數(shù)調(diào)用是普通的java調(diào)用
@Configuration
public class MyTestConfig {
@Bean
public Driver driver(){
Driver driver = new Driver();
driver.setId(1);
driver.setName("driver");
driver.setCar(car());
return driver;
}
@Bean
public Car car(){
Car car = new Car();
car.setId(1);
car.setName("car");
return car;
}
}
測(cè)試代碼如下
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestApplicationTests {
@Autowired
private Car car;
@Autowired
private Driver driver;
@Test
public void contextLoads() {
boolean result = driver.getCar() == car;
System.out.println(result ? "同一個(gè)car" : "不同的car");
}
}
打印結(jié)果如下:
同一個(gè)car
3.2 @component @service @repository @controller區(qū)別
注解 | 含義 |
---|---|
@Component | 最普通的組件农猬,可以被注入到spring容器進(jìn)行管理 |
@Repository | 作用于持久層赡艰,會(huì)添加持久層的一些功能如持久層異常映射等 |
@Service | 作用于業(yè)務(wù)邏輯層 |
@Controller | 作用于表現(xiàn)層(spring-mvc的注解) |
4. 參考文獻(xiàn)
https://www.cnblogs.com/leihuazhe/p/7743479.html
https://blog.csdn.net/long476964/article/details/80626930
https://blog.csdn.net/long476964/article/details/80626930