目录
spring 自动配置原理
@Configuration介绍
@configuaration @component @service @repository @controller区别,使用场景
1. spring 自动配置原理
Spring 的 bean配置由复杂的xml文件组成,在spring boot中,所有的dependency都自动添加了bean配置,大功臣就是@EnableAutoConfiguration
在我们添加@SpringBootApplication的时候,里面就包含@EnableAutoConfiguration,@EnableAutoConfiguration使用 SpringFactoriesLoader.loadFactoryNames()
把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一个xxxAutoConfiguration文件都有条件地加载到容器中。
例如RedisAutoConfiguration
假如我们自己制作的jar包,希望外部引用时能自动加载默认属性并创建bean,需要在resource目录下添加spring.factories添加我们自定义的配置类
2. @Configuration介绍
@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法。@configuration相当于spring xml配置文件中的<beans>标签,@bean相当于<bean>标签。@bean默认是单例的
一个简单的例子
@Configuration
public class TestConfiguration {
public TestConfiguration() {
System.out.println("TestConfiguration容器启动初始化。。。");
}
//@Bean注解注册bean,同时可以指定初始化和销毁方法
@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区别,使用场景
3.1 @configuaration @component区别
下面代码,如果是@Configuration修饰,打印的是同一个car,如果是@component 修饰,打印的是不同的car。@configuaration修饰的类下面的bean,会被ConfigurationClassPostProcessor进行增强处理,使得调用@Bean修饰的函数返回的是同一个对象。而@component修饰的@bean函数调用是普通的java调用
@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;
}
}
测试代码如下
@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 ? "同一个car" : "不同的car");
}
}
打印结果如下:
同一个car
3.2 @component @service @repository @controller区别
注解 | 含义 |
---|---|
@Component | 最普通的组件,可以被注入到spring容器进行管理 |
@Repository | 作用于持久层,会添加持久层的一些功能如持久层异常映射等 |
@Service | 作用于业务逻辑层 |
@Controller | 作用于表现层(spring-mvc的注解) |
4. 参考文献
https://www.cnblogs.com/leihuazhe/p/7743479.html
https://blog.csdn.net/long476964/article/details/80626930
https://blog.csdn.net/long476964/article/details/80626930