SpringBoot:(四)底层注解详解

news2024/11/30 12:25:48

笔记来源:【尚硅谷】SpringBoot2零基础入门教程(spring boot2干货满满)

文章目录

    • 4.1 @Configuration详解
      • 总结
    • 4.2 @Component、@Controller、@Service、@Repository、@Bean
    • 4.3 @Import导入组件
    • 4.4 @Conditional条件装配
    • 4.5 @ImportResource导入Spring配置文件
    • 4.6 @ConfigurationProperties配置绑定

4.1 @Configuration详解

  • 基本使用:声明当前类是SpringBoot的一个配置类

  • Full模式Lite模式

    • Full(proxyBeanMethods = true):保证每个@Bean方法被调用多少次返回的组件都是单实例的(默认)
    • Lite(proxyBeanMethods = false):每个@Bean方法被调用多少次返回的组件都是新创建的
  • 示例:

    @Configuration(proxyBeanMethods = false)
    public class MyConfig {
        @Bean("tom")
        public Pet tomcatPet(){
            return new Pet("tomcat");
        }
    
        @Bean
        public User user01(){
            User user = new User("张三", 18);
            user.setPet(tomcatPet());
            return user;
        }
    }
    
  • 进阶测试1:配置类MyConfig的注解@Configuration(proxyBeanMethods = false)

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        String[] beanDefinitionNames = run.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
        // 从容器总获取同名组件是否相同
        Pet tom1 = run.getBean("tom", Pet.class);
        Pet tom2 = run.getBean("tom", Pet.class);
        System.out.println("同名组件tom1与tom2是否相同:" + (tom1 == tom2));
    
        // 从组件中获取配置类实例
        MyConfig myConfig = run.getBean(MyConfig.class);
        System.out.println("配置类实例:" + myConfig);
    
        // 直接使用配置类的方法获取对象
        User user = myConfig.user01();
        User user1 = myConfig.user01();
        System.out.println("直接调用方法获取的对象是否相同:" +(user == user1));
    
        // 获取嵌套对象
        User user01 = run.getBean("user01", User.class);
        Pet tom = run.getBean("tom", Pet.class);
    
        System.out.println("嵌套的对象是否和容器对象相同:"+(user01.getPet() == tom));
    }
    

    image-20221103055629860

  • 进阶测试2:配置类MyConfig的注解@Configuration(proxyBeanMethods = true)
    在这里插入图片描述

总结

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

4.2 @Component、@Controller、@Service、@Repository、@Bean

@Component:通用的注解,可标注任意类为Spring的组件。如果一个Bean不知道属于哪个层,可以使用@Component注解标注。

@Repository:标注一个类为持久化层组件。与@Component、@Controller、@Service在功能上是一致的。

@Service:标注一个类为服务层组件。与@Component、@Controller、@Repository在功能上是一致的。

@Controller:标注一个类为控制层组件。与@Component、@Service、@Repository在功能上是一致的。

@Bean:必须和配置类注解@Configuration一起工作,标注在方法上,返回某个实例的方法,这个实例就会交给Spring容器管理。

4.3 @Import导入组件

  • 基本使用:@Import({User.class, DBHelper.class})给容器中自动创建出这两个类型的组件默认组件的名字就是全类名

    @Import({User.class, DBHelper.class})
    @Configuration(proxyBeanMethods = false)
    public class MyConfig {
    }
    
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        String[] users = run.getBeanNamesForType(User.class);
        for (String user : users) {
            System.out.println(user);
        }
        String[] dbHelpers = run.getBeanNamesForType(DBHelper.class);
        for (String dbHelper : dbHelpers) {
            System.out.println(dbHelper);
        }
    }
    

    image-20221103070945514

4.4 @Conditional条件装配

  • 基本使用:条件装配,满足Conditional指定的条件,则进行组件注入。可以配置在方法上,也可以配置在类上。

  • 类别:

    image-20221103071228884

  • 示例

    @Import({User.class, DBHelper.class})
    @Configuration(proxyBeanMethods = true)
    public class MyConfig {
    
        @Bean("tom1")
        public Pet tomcatPet(){
            return new Pet("tomcat");
        }
        
        // 当容器中有某个对象的时候才进行注入
        // 容器中有tom1,没有tom,看user01对象是否能注册到容器中
        @ConditionalOnBean(name = "tom")
        @Bean
        public User user01(){
            User user = new User("张三", 18);
            user.setPet(tomcatPet());
            return user;
        }
    }
    
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        User user01 = run.getBean("user01", User.class);
        System.out.println(user01);
    }
    

    image-20221103071729497

4.5 @ImportResource导入Spring配置文件

  • 基本使用:导入外部的bean.xml配置文件

  • 示例

    <?xml version="1.0" encoding="UTF-8"?>
    <beans ...">
        <bean id="haha" class="com.lun.boot.bean.User">
            <property name="name" value="zhangsan"></property>
            <property name="age" value="18"></property>
        </bean>
        <bean id="hehe" class="com.lun.boot.bean.Pet">
            <property name="name" value="tomcat"></property>
        </bean>
    </beans>
    
    @ImportResource("classpath:beans.xml")
    public class MyConfig {
    ...
    }
    
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
    
    	boolean haha = run.containsBean("haha");
    	boolean hehe = run.containsBean("hehe");
    	System.out.println("haha:"+haha);
    	System.out.println("hehe:"+hehe);
    }
    

    image-20221103152042812

4.6 @ConfigurationProperties配置绑定

  • 基本使用:读取到properties文件中的内容,并且把它封装到JavaBean中,以供随时使用

  • 传统方法:

    public class getProperties {
        public static void main(String[] args) throws FileNotFoundException, IOException {
            Properties pps = new Properties();
            pps.load(new FileInputStream("a.properties"));
            Enumeration enum1 = pps.propertyNames();//得到配置文件的名字
            while(enum1.hasMoreElements()) {
                String strKey = (String) enum1.nextElement();
                String strValue = pps.getProperty(strKey);
                System.out.println(strKey + "=" + strValue);
                //封装到JavaBean。
            }
        }
    }
    
  • Spring Boot一种配置配置绑定:@ConfigurationProperties + @Component

    • 假设有配置文件application.properties

      mycar.brand=BYD
      mycar.price=100000
      
    • 只有在容器中的组件,才会拥有SpringBoot提供的强大功能

      ...
      @Component
      @ConfigurationProperties(prefix = "mycar")
      public class Car {
      	private String brand;
          private int price;
      }
      
    • 示例:

      public static void main(String[] args) {
              ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
              Car haha = run.getBean("car", Car.class);
              System.out.println(haha);
          }
      

      image-20221103155651035

  • Spring Boot另一种配置配置绑定:@EnableConfigurationProperties + @ConfigurationProperties

    • 开启Car配置绑定功能

      @EnableConfigurationProperties(Car.class) // 注入对象的名称为全类名,不再是类名首字母小写了
      public class MyConfig {
      ...
      }
      
    • 把这个Car这个组件自动注册到容器中

      @ConfigurationProperties(prefix = "mycar")
      public class Car {
      	private String brand;
          private int price;
      }
      
    • 示例

      public static void main(String[] args) {
          ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
          String[] beanNamesForType = run.getBeanNamesForType(Car.class);
          for (String s : beanNamesForType) {
              System.out.println(s);
          }
          Car car = run.getBean(Car.class);
          System.out.println(car);
      }
      

      image-20221103160349919

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刷题记录(NC20313 [SDOI2008]仪仗队)

NC20313 [SDOI2008]仪仗队 题目链接 关键点&#xff1a; 1、首先分析题目&#xff0c;对于只能看到的点&#xff0c;设原点坐标为&#xff08;0&#xff0c;0&#xff09;&#xff0c;则除去横纵坐标上能看到的两点(0, 1)、(1, 0)&#xff0c;和对角线上的(1, 1)&#xff0c…

Redis相关知识

目录 一&#xff0c;Redis的命令操作 1.Redis简介 2.Redis安装&#xff08;按步骤执行以下步骤即可&#xff09; 3.redis命令 二&#xff0c;java代码操作Redis 1.java连接Redis 2.java操作Redis 三&#xff0c;Spring注解式缓存Redis 1.Spring整合Redis 2.redis注解式缓…

2023年,前端开发未来可期

☆ 对于很多质疑&#xff0c;很多不解&#xff0c;本文将从 △ 目前企业内前端开发职业的占比&#xff1b; △ 目前业内开发语言的受欢迎程度&#xff1b; △ 近期社区问答活跃度&#xff1b; 等维度来说明目前前端这个职业的所处位置。 ☆ 还有强硬的干货&#xff0c;通过深入…

Flask快速白嫖

一、快速搭建 有前面Flask的学习&#xff0c;相信大家对flask已经有一个不错的了解&#xff0c;今天教大家如何快速搭建一个web网页&#xff01;&#xff01;&#xff01;. 博主不是专门做软件的&#xff0c;但是需求里又有网站的需要&#xff0c;所以怎么办呢&#xff1f; 那…

python动态规划算法实例详解

文章目录python动态规划算法实例详解一、什么是动态规划&#xff1f;二、新视角&#xff1a;从斐波那契数列看动态规划三、实例扩展&#xff08;爬楼梯&#xff09;1. 题目描述2. 示例示例1示例23. 解析4. 代码实现四、结语&#x1f496;&#x1f496;&#x1f496;&#x1f49…

特性Attribute

浅浅了解一下&#xff0c;可影响程序集的运行 [Obsolete]:生成表提示&#xff0c;有true报错提示&#xff0c;无true是提醒提示 是什么&#xff1a;特性就是一个类(可是自定义类)&#xff0c;这个类直接/间接继承自Attribute类&#xff0c;一般类名以Attribute结尾&#xff0c…

ReentrantLock与ReentrantReadWirteLock 原理

ReentrantLock原理&#xff08;**&#xff09; 讲解除了FairLock部分是FairLock流程&#xff0c;其余均NonFairLock源码 &#xff08;FairLock部分会讲解两者不同&#xff09; 1. NonFairLock实现原理 加锁解锁流程 先从构造器开始看&#xff0c;默认为非公平锁实现 public …

Commvault+XSKY 推出基于 Object Lock 的防勒索病毒联合方案

从桶粒度到对象粒度随着对象存储的普及&#xff0c;对象存储已经成为最流行的备份目的&#xff08;backup target) 存储。XSKY星辰天合作为国内领先的对象存储厂商&#xff0c;Commvault 作为全球领先的数据保护厂商&#xff0c;双方一直有紧密的合作。特别在 2020 年&#xff…

装了我这 10 个 IDEA 神级插件后,同事也开始情不自禁的嘚瑟了

CSDN 的小伙伴&#xff0c;大家好&#xff0c;我是二哥呀。 昨天&#xff0c;有读者私信发我一篇 CSDN 上的文章&#xff08;就是这篇&#x1f602;&#xff09;&#xff0c;说里面提到的 Intellij IDEA 插件真心不错&#xff0c;基本上可以一站式开发了&#xff0c;希望能分享…

【学习笔记】《Python深度学习》第一章:什么是深度学习

文章目录1 人工智能、机器学习与深度学习1.1 人工智能1.2 机器学习1.3 从数据中学习表示1.4 深度学习之“深度”1.5 用三张图理解深度学习的工作原理2 机器学习简史2.1 概率建模2.2 早期神经网络2.3 核方法2.4 决策树、随机森林与梯度提升机2.5 回到神经网络2.6 深度学习的不同…

清华学姐三年的测试成长经历,到最后的喜提高薪offer

上个礼拜刚好转正了&#xff0c;三个月试用期&#xff0c;五月份换的工作。 现在这份工作&#xff0c;相比上一份确实好很多&#xff0c;比如工资直接涨了一倍&#xff0c;7到14&#xff0c;13薪&#xff0c;朝九晚六&#xff0c;从不加班&#xff0c;项目也简单&#xff0c;包…

计算机毕业设计(附源码)python疫情下校园食品安全信息管理

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

stm32毕业设计 单片机MP3音乐播放器

文章目录1 简介2 绪论2.1 课题背景与目的3 系统设计3.1 系统架构3.2 软件部分设计3.3 实现效果3.4 部分相关代码1 简介 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始…

【网络原理】UDP和TCP协议重点知识汇总

目录 1.UDP协议&#xff1a; 2.TCP协议&#xff1a; 1.UDP协议&#xff1a; UDP协议的特点&#xff1a;无连接、不可靠传输、面向数据报和全双工。UDP报文最大长度是2个字节&#xff0c;2个字节表示的范围就是0~65535&#xff0c;也就是64kb。所以如果需要使用UDP传输一个比…

Qt 自定义控件

学过的东西很久不用都已经忘记了&#xff0c;即使是很简单的事情 1、添加一个Qt 设计师界面类 如何将这个放到比较好看并且是居中的呢&#xff1f; 布局--》水平-》竖直 点击大的widget 不是这两个控件 2、在主窗口中添加一个widget 来加载上面我们已经拿到组合控件 3、将这个…

HTML入门零基础教程(三)

嗨&#xff0c;大家好&#xff0c;我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助&#xff0c;请支持一波。 希望未来可以一起学习交流。 目录 一、 VSCode工具生成骨架标签新增代码 1.文档类型声明标签 2.lang语言种类 3.charset字符集 二、HT…

从刘老师的进化的力量到有感,疫情阶段如何弯道超车

听了刘老师的内容&#xff0c;了解了一个公式&#xff1a;方向趋势不确定周期&#xff0c;那么JVS更能成为企业这几年实现弯道超车的助理。 方向事关企业生死&#xff0c;在方向上宁愿多花些时间&#xff0c;也不能犯错。不确定刺激企业短时间的痛&#xff0c;企业是需要化解短…

[Spring MVC 4] MyBatis 分页开发

在做Web开发的时候&#xff0c;需要对查询结果进行分页查询&#xff0c;初学者会使用原生的sql查询方式&#xff0c;例如limit关键字&#xff0c;不过这种属于对数据库物理分页了&#xff0c;然而会造成数据库本身的压力&#xff0c;所以分页管理就诞生了。一般在Mybatis中使用…

校园二手交易系统,二手交易网站,闲置物品交易系统毕业设计作品

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的二手交易网站系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于java的springboot框架下开发&#xff1b;用户通过登录网站&#xff0c;查询二手交易商品&#xff0c;购买二手交易网站…

对于volatile的看法

volatile原意是易变的&#xff0c;编译器对volatile修饰的变量&#xff0c;当要读取这个变量时&#xff0c;任何情况下都会从内存中读取&#xff0c;而不会从寄存器缓存中读取。 编译器不会对volatile修饰的变量进行任何优化 1&#xff09;非volatile变量 在这个用例中&#…