• [学习记录] SpringBoot 2. 底层注解


    SpringBoot 2. 底层注解

    尚硅谷

    官方文档

    1. @Configuration

    1.1 基本应用

    新建 PetUser 类,代码省,并实现 gettersetter 等方法。
    新建 MyConfire 类:

    @Configuration
    public class MyConfigure {
    
        /**
         * 给容器中添加组件, 以方法名作为组件 id。
         * 返回类型就是组件类型, 返回的值就是组件在容器中的实例。
         */
        @Bean
        public User user01() {
            return new User("张三", 18);
        }
    
        @Bean("tom")
        public Pet tomcatPet() {
            return new Pet("tomcat");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    @Configuration 告诉 SpringBoot 这是一个 配置类 == 配置文件

    配置类中使用 @Bean 标注在方法上给容器注册组件,默认是单实例的。@Bean(id) 若不加 id 参数,默认组件 id 就是方法名。

    getBean(id, class) 在主程序中获取组件:

    ConfigurableApplicationContext run = SpringApplication.run(SpringbootReviewRecordsApplication.class, args);
    Pet tom1 = run.getBean("tom", Pet.class);
    Pet tom2 = run.getBean("tom", Pet.class);
    System.out.println(tom1 == tom2);
    
    • 1
    • 2
    • 3
    • 4

    最后的结果是 true,说明是单实例的。

    用配置类 组件bean.组件默认名() 查看组件:

    MyConfigure bean = run.getBean(MyConfigure.class);
    System.out.println(bean);
    User user = bean.user01();
    System.out.println(user);
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    外部无论对配置文件中的这个组件注册方法调用多少次获取的都是之前注册容器的单实例对象

    1.2 两种模式

    • Lite 模式(默认)
      @Configuration(proxyBeanMethods = true) 启动代理对象调用方法,SpringBoot 总会检查这个组件是否在容器中存在。保持组件单实例。
    • Full 模式
      @Configuration(proxyBeanMethods = false),则每次调用都新建对象。

    最佳实战:

    • 配置类组件之间无依赖关系用 Lite 模式加速容器启动过程,减少判断
    • 配置类组件之间有依赖关系,方法会被调用得到之前的单实例组件,用 Full 模式

    2. @Bean,@Component,@Controller,@Service,@Repository

    跟之前的用法一致。

    3. @ComponentScan,@Import

    @ComponentScan 用法和之前一致。

    @Import 注解可以导入自己的组件。

    @Import({User.class})
    @Configuration(proxyBeanMethods = true)
    public class MyConfigure {
    	@Bean
        public User user01() {
            return new User("张三", 18);
        }
    	// ...	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    @Import({User.class}) 给容器中自动创建 User.class 类型的组件。

    在主程序中查看:

    String[] beanNamesForType = run.getBeanNamesForType(User.class);
    for (String s : beanNamesForType) {
        System.out.println(s);
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    可以看到默认组件的名字就是全类名 com.xz.entity.User

    4. @Conditional

    条件装配:满足 Conditional 指定的条件,则进行组间注入。

    继承树:
    在这里插入图片描述
    比如:
    ConditionalOnBean 当有指定 Bean 组件干什么。

    ConditionalOnMissingBean 当没有指定 Bean 组件干什么。

    	@ConditionalOnBean(name = "tom22")
        @Bean
        public User user01() {
            return new User("张三", 18);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    若存在名字为 tom22 的组件,则创建 user01 组件,否则不创建。

    5. @ImportResource

    引入以前的 xml 文件。
    比如:
    @ImportResource("classpath:beans.xml")

    6. 配置绑定

    能更简单的与配置文件交互。

    补:

    • Q:什么有配置文件?
    • A:因为如果全写在程序里面的话每次修改配置都需要重新编译。

    6.1 @ConfigurationProperties

    先新建一个 Car 类,两个属性 brandprice,并实现 gettersetter 等方法。

    加上注解:

    @ConfigurationProperties(prefix = "mycar")
    public class Car {
    	// ... 
    }
    
    • 1
    • 2
    • 3
    • 4

    application.yml 添加:

    mycar:
      brand: BYD
      price: 100000
    
    • 1
    • 2
    • 3

    6.2 @EnableConfigurationProperties + @ConfigurationProperties

    在 6.1 的基础上,在 MyConfigure 上加注解 @EnableConfigurationProperties(class),表示开启 Car 属性配置功能,并把 Car 这个组件自动注入到容器中:

    @EnableConfigurationProperties(Car.class)
    public class MyConfigure {
    	// ...
    }
    
    • 1
    • 2
    • 3
    • 4

    编写 HelloController,添加内容:

    @Autowired
    Car car;
    
    @RequestMapping("/car")
    public Car car() {
        return car;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    访问 http://localhost:8888/car 然后就可以看到
    在这里插入图片描述

    6.3 @Component + @ConfigurationProperties

    取消 MyConfigure 类上的注解 @EnableConfigurationProperties(Car.class),然后在 Car 类上加上 @Component

    访问 http://localhost:8888/car 然后也可以看到
    在这里插入图片描述

  • 相关阅读:
    日志收集分析平台原理
    随笔记录Linux命令,待完善
    玩转NAS | 打造一个动态网关,部署OpenResty - Nginx与Lua的强强联合
    深度学习与总结JVM专辑(四):类文件结构(图文+代码)
    USB device ‘FTDI Dual RS232-HS‘ with UUID
    Vue 对话框 Dialog 重新打开后数据重置/清空遗留问题
    在Python中,使用什么方法可以替换if条件语句,减少代码冗余
    《WEB安全渗透测试》(29)记一次HOST头投毒漏洞
    Blender导出FBX给UE5
    HotSpot垃圾算法实现之记忆集与卡表和写屏障
  • 原文地址:https://blog.csdn.net/qq_39906884/article/details/126718294