Spring Boot bean 配置

目录

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文件都有条件地加载到容器中。


image.png

例如RedisAutoConfiguration
假如我们自己制作的jar包,希望外部引用时能自动加载默认属性并创建bean,需要在resource目录下添加spring.factories添加我们自定义的配置类


image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,985评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,079评论 19 139
  • 入门 介绍 Spring Boot Spring Boot 使您可以轻松地创建独立的、生产级的基于 Spring ...
    Hsinwong阅读 16,969评论 2 89
  • 跑马是大家都很熟悉的一种现象(嘿嘿嘿~~~),这个不做多解释。我们会在众多的app或者网页上看到跑马显示的效果。近...
    见哥哥长高了阅读 977评论 2 4
  • 推荐游玩地点: 园博园 宜家 西南大学 三峡博物馆 解放碑 洪崖洞 科技馆 朝天门-洋人街 南山一棵树 磁器口 以...
    陆老撕阅读 921评论 0 3