• SpringBoot自动装配


    一、Springboot项目

            通常,我们通过maven创建的springboot项目的pom文件中,都会有以下配置

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.3.4.RELEASE</version>
    5. </parent>

            在这个基础上,我们创建的springboot项目为子项目会继承父项目的依赖以及其依赖的版本号,子项目的pom文件中的依赖就不需要再配置版本号了。

            比如我们有一个web场景下的springboot项目,在其pom文件中:

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-web</artifactId>
    5. </dependency>
    6. <dependency>
    7. <groupId>junit</groupId>
    8. <artifactId>junit</artifactId>
    9. <scope>test</scope>
    10. </dependency>
    11. </dependencies>

    引入的依赖不再需要我们配置版本号,都是继承父类的。

    1、@SpringBootApplication

           在SpringBoot项目下,会创建一个主程序,其会有@SpringBootApplication注解,表明这是一个SpringBoot应用,也是通过启动该主程序来启动项目。

    1. @SpringBootApplication
    2. public class MainApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(MainApplication.class,args);
    5. }
    6. }

    即可启动项目。

            同时@SpringBootApplication注解也等同于另外三个注解共同的作用:

            @SpringBootConfiguration + @ComponentScan + @EnableAutoConfiguration

    1.1  @SpringBootConfiguration

            就是表明这是一个SpringBoot项目的配置类

    1.2 @ComponentScan

            扫描指定位置下的所有组件

    1.3 @EnableAutoConfiguration

            

             该注解类的作用主要为SpringBoot项目注册组件。

            可划分为两类组件:

                    @AutoConfiguPackage:该注解注册的组件是我们主程序所在的包下及其该包子包中的所有组件

                    @Import(AutoConfigurationImportSelector):该注解注册的组件时第三方的组件,会根据SpringBoot项目中配置的依赖以及对应的场景来判断是否需要注册某些组件。

    2、spring中的注解        

    2.1 @Configuration

            作用:告诉SpringBoot这类是一个配置类,之后再该类中就可以使用@Bean方法给容器中注册组件,且该配置类也是组件。

            其里面有一个属性:proxyBeanMethods

    @Configuration(proxyBeanMethods = false)
    

            当其值为true时,表示Full模式:使用单例模式创建对象。

            反之,表示Lite模式,每次都会去new一个新的对象交给我们,节约时间。

            比如这是我们创建的一个bean对象

    1. @Bean
    2. // @ConditionalOnBean(value = Girl.class)
    3. public Boy boyConstruct(){
    4. return new Boy("boy001");
    5. }

            此时proxyBeanMethods 我们设置为true

    1. myConfig configBean = run.getBean(myConfig.class);
    2. Boy boy1 = configBean.boyConstruct();
    3. Boy boy2 = configBean.boyConstruct();
    4. System.out.println(boy1 == boy2);

            结果如下:

            当设置proxyBeanMethods的值为false时,输出的值就时false了。

    2.2 @Import

            给容器中自动注册一些组件,比如第三方的一些组件(我们不好再这一系列组件上标注解)

            举例:

    1. @ImportResource("classpath:spring-config.xml")
    2. @Configuration(proxyBeanMethods = false)
    3. @Import({User.class})
    4. public class myConfig {
    5. ..........
    6. }

            再主程序中判断是否有这个类

            System.out.println(run.containsBeanDefinition("com.study.boot.bean.User"));
    

            结果为:

             可以看到,当使用@Import组件的时候,组件的id就为其全类名。

    2.3 其他的注解

    2.3.1@ImportResource

            这个注解就是获取 spring-config.xml配置文件的中创建的组件,因为springBoot基本都是注解驱动,不用写Spring配置文件,但某些情况下可能为了获取Spring配置文件中的组件,可以使用该注解:

    1. @ImportResource("classpath:spring-config.xml")
    2. public class myConfig {
    3. ..........
    4. }

            即可导入spring-config.xml包中所有的组件。

    2.3.2@Conditional

            该注解的作用是条件装配,比如:

    1. @Bean(name="girlAnother")
    2. public Girl girlConstruct(){
    3. Girl girl = new Girl("girl001");
    4. girl.setBoyFriend(new Boy("boy_girl001"));
    5. return girl;
    6. }
    7. @Bean
    8. @ConditionalOnBean(value = Girl.class)
    9. public Boy boyConstruct(){
    10. return new Boy("boy001");
    11. }

            这里的@ConditionalOnBean 意思就是若有某个bean对象的情况下,才能注册Boy这个组件。

           当然, @Conditional还有很多孩子:

     3、配置绑定

            SpringBoot的规定配置文件的名称为application.properties

    3.1 @ConfigurationProperties与@EnableConfigurationProperties

            该注解的作用是 会在我们官方的配置文件中找前缀为“testcar”的值,获取其值给类中的属性,是根据属性(get和set方法后的那个值)来匹配的。

            之后使用第二个注解 来开启配置绑定(写到任何一个配置类都行)

    1. @ConfigurationProperties(prefix = "testcar")
    2. public class Car {
    3. private String brand;
    4. private Integer price;
    5. public String getBrand() {
    6. return brand;
    7. }
    8. public void setBrand(String brand) {
    9. this.brand = brand;
    10. }
    11. public Integer getPrice() {
    12. return price;
    13. }
    14. public void setPrice(Integer price) {
    15. this.price = price;
    16. }
    17. public Car() {
    18. }
    19. }

             再application.properties配置文件中:

    1. testcar.price=200000
    2. testcar.brand=passet

             

            主程序中:

    1. Car car = run.getBean(Car.class);
    2. System.out.println(car.getBrand()+" "+car.getPrice());

            输出结果:

            

  • 相关阅读:
    HTML网页设计【足球科普】学生DW静态网页设计
    【Vue】vue项目目录介绍 es6的导入导出语法 vue项目开发规范 Vue项目编写步骤
    Novatek发布最新高度集成的NT98530BG可开发4K30多光谱相机
    汽车融资租赁系统开发 | 互融云汽车融资租赁系统 实现全自动化流程管理
    【Python百日进阶-WEB开发】Day169 - Django案例:01工程创建和基本配置
    SSM+科技馆预约系统 毕业设计-附源码182154
    SCT71403F50,SCT71403F33,TPS7B82,TPS7B81
    Chromium浏览器启动参数
    Web安全常见攻击
    Seata 解决分布式事务理论与实践
  • 原文地址:https://blog.csdn.net/weixin_42196338/article/details/127594635