SpringBoot底层注解

文章目录

  • 前言
  • 一、@Configuration
  • 二、@Import导入组件
  • 三、@Conditional条件装配
  • 四、@ImportResource导入Spring配置文件
  • 五、@ConfigurationProperties配置绑定
  • 总结


前言

本文主要讲诉@Configuration、@Import、@Conditional、@ImportResource、@ConfigurationProperties注解。

先将实体类给大家,方便下面测试:
get、set、构造器大家自己添加,这里我用的是ToString等注解(以后会出文章讲诉)所以没写这些,就不列出来了。

public class Pet {private String name;}
=================================
public class User {private String name;private Integer age;private Pet pet;
}
============================
public class Car {private String brand;private String price;
}

一、@Configuration

1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的,所谓单实例跟我们在Spring中了解的bean创建对象的单实例是一样的,就是在调用getBean方法创建相同类型实例对象时,这些对象的地址相同(即无论创建多少对象,都是同一个对象)。多实例就是每次创建对象都重新创建一个不同地址的新对象。
2、配置类本身也是组件。
3、proxyBeanMethods:代理bean的方法。
Full模式(proxyBeanMethods = true)(保证每个@Bean方法被调用多少次返回的组件都是单实例的)(默认)
Lite模式(proxyBeanMethods = false)(每个@Bean方法被调用多少次返回的组件都是新创建的)

配置类:

@Configuration(proxyBeanMethods = true) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {/*** Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象* @return*/@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例public User user01(){User zhangsan = new User("zhangsan", 18,tomcatPet());//user组件依赖了Pet组件return zhangsan;}@Bean("tom")public Pet tomcatPet(){return new Pet("tomcat");}
}

SpingBoot启动类

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.dragon.boot")
public class MainApplication {public static void main(String[] args) {//1、返回我们IOC容器ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);//2、查看容器里面的组件//    String[] names = run.getBeanDefinitionNames();//    for (String name : names) {//        System.out.println(name);//    }//3、从容器中获取组件Pet tom01 = run.getBean("tom", Pet.class);Pet tom02 = run.getBean("tom", Pet.class);System.out.println("组件:"+(tom01 == tom02));//4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892MyConfig bean = run.getBean(MyConfig.class);System.out.println(bean);//如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。//保持组件单实例User user = bean.user01();User user1 = bean.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));}
}

在这里插入图片描述
看运行结果分析:

  • 组件:true
    配置类中我用的Full模式:@Configuration(proxyBeanMethods = true) ,当然就是单实例模式,所有创建的对象都是同一个对象。
  • com.dragon.boot.config.MyConfig$ $ SpringCGLIB$$0@283e8358
    这个输出是我getBean获取的配置类组件,可以看出配置类本身也是组件。
  • 用户的宠物:true
    当我开启单实例模式时,就能够处理依赖关系,这里我创建的组件宠物==用户组件里的宠物,User zhangsan = new User("zhangsan", 18,tomcatPet());。我创建的用户组件时就是调用的tomcatPet(),因为是单实例模式,所以我在创建用户调用创建的宠物和直接创建的宠物都是同一个对象。

启动类中我写了个查看容器里面的组件的方法,注释掉了,可以运行,在控制台Ctrl+F搜索查看注册的组件。
将proxyBeanMethods 属性改成false,运行结果就变成了false。

总结:

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

二、@Import导入组件

@Bean、@Component、@Controller、@Service、@Repository,它们是Spring的基本标签,在Spring Boot中并未改变它们原来的功能。
@ComponentScan在Spring学习中大家一定接触了吧,就是开启组件扫描。
Import({User.class、DBHelper.class})会给容器中自动创建出User、DBHelper组件,默认组件的名字就是全类名。如果创建多个组件就在在大号内添加,用逗号隔开。

@Import({User.class,DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {//....
}

启动类:

//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);//...//5、获取组件
String[] beanNamesForType = run.getBeanNamesForType(User.class);for (String s : beanNamesForType) {System.out.println(s);
}

三、@Conditional条件装配

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

在这里插入图片描述

这里用@ConditionalOnMissingBean举例说明:

  • @ConditionalOnMissingBean(name = “tt”)
    用在类上:没有tt名字的Bean时才会将类里所有配置注册成组件
    用在方法上:没有tt名字的Bean时才会将改方法注册成组件
@Configuration(proxyBeanMethods = true) //告诉SpringBoot这是一个配置类 == 配置文件
@Import({User.class})
@ConditionalOnMissingBean(name = "tom")
public class MyConfig {/*** Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象* @return*/@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例public User user01(){User zhangsan = new User("zhangsan", 18,tomcatPet());//user组件依赖了Pet组件return zhangsan;}@Bean("tom")public Pet tomcatPet(){return new Pet("tomcat");}
}

启动类:

ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);//2、查看容器里面的组件String[] names = run.getBeanDefinitionNames();for (String name : names) {System.out.println(name);}boolean tom = run.containsBean("tom");//是否包含某个组件System.out.println("容器中Tom组件:"+tom);//falseboolean user01 = run.containsBean("user01");System.out.println("容器中user01组件:"+user01);//trueboolean tom22 = run.containsBean("tom22");System.out.println("容器中tom22组件:"+tom22);//true

四、@ImportResource导入Spring配置文件

公司项目使用bean.xml文件生成配置bean,然而你为了省事,想继续复用bean.xml,@ImportResource粉墨登场。

bean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><bean id="haha" class="com.dragon.boot.bean.User"><property name="name" value="zhangsan"></property><property name="age" value="18"></property></bean><bean id="hehe" class="com.atguigu.boot.bean.Pet"><property name="name" value="tomcat"></property></bean>
</beans>

复用方法:

@ImportResource("classpath:bean.xml")
public class MyConfig {//...
}

启动类测试:

//1、返回我们IOC容器ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);boolean haha = run.containsBean("haha");boolean hehe = run.containsBean("hehe");System.out.println("haha:"+haha);//trueSystem.out.println("hehe:"+hehe);//true

返回true,说明注册成了组件。

五、@ConfigurationProperties配置绑定

使用Java读取到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。}}}

SpringBoot的两种方法:

  • @ConfigurationProperties + @Component
    假设有配置文件application.properties
mycar.brand=BYD
mycar.price=100000

只有在容器中的组件,才会拥有SpringBoot提供的强大功能,所以Bean对象类注册成组件
下面的prefix是指属性前缀

@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
...
}
  • @EnableConfigurationProperties + @ConfigurationProperties
    1.开启Car配置绑定功能
    2.把这个Car这个组件自动注册到容器中

配置类:

@EnableConfigurationProperties(Car.class)
public class MyConfig {//...
}

Car类:

@ConfigurationProperties(prefix = "mycar")
public class Car {//...
}

HelloController类:

@RestController
public class HelloController {@AutowiredCar car;@RequestMapping("/car")public Car car(){return car;}@RequestMapping("/hello")public String handle01(){return "Hello,Spring Boot 2!"+"你好";}
}

这里我写了个控制层,运行结果如下:
在这里插入图片描述
可以看出确实将properties文件内的内容封装了。


总结

以上就是SpringBoot的一些底层注解的讲解。

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

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

相关文章

【DockerCE】Docker-CE 24.0.6正式版发布

官网下载地址&#xff08;For RHEL/CentOS 7.9&#xff09;&#xff1a; https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ 相对于24.0.5版本&#xff0c;本次24.0.6版本更新的rpm包有 5 个&#xff0c;使用目录对比软件对比的结果如下&#xff1a; 在Lin…

使用融云 CallPlus SDK,一小时实现一款 1V1 视频应用

9 月 21 日&#xff0c;融云直播课 社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频应用&#xff1f; 欢迎点击小程序报名~ 1V1 音视频、远程服务类应用的实现利器——融云 CallPlus SDK 上线&#xff01; 关注【融云全球互联网通信云】了解更多 作为新一代音视频通话场…

RuoYi若依管理系统最新版 基于SpringBoot的权限管理系统

RuoYi是一个后台管理系统&#xff0c;基于经典技术组合&#xff08;Spring Boot、Apache Shiro、MyBatis、Thymeleaf&#xff09;主要目的让开发者注重专注业务&#xff0c;降低技术难度&#xff0c;从而节省人力成本&#xff0c;缩短项目周期&#xff0c;提高软件安全质量。 本…

前端代理报错Error occured while trying to proxy to: localhost:端口

webpack配置进行前端代理时&#xff0c; 报错信息如下&#xff1a;(DEPTH_ZERO_SELF_SIGNED_CERT) 需设置&#xff1a;secure为false即可解决此报错 // webpack配置前端代理config["/test"]{target: https://xxxx.com,changeOrigin: true,secure: false // 这个配置…

CentOS 安装HTTP代理服务器 Tinyproxy

Tinyproxy是一个小型的基于GPL的HTTP/SSL代理程序&#xff0c;非常适合小型网络而且便于快速部署。这个代理程序最大的优点就是占用系统资源比较少。这里使用的系统为CentOS7.6&#xff0c;可以直接 yum 方式安装。 yum install tinyproxy -y 如果提示找不到安装包&#xff0…

列表和字典练习

定义四个学生信息 在Python环境下&#xff0c;用列表定义&#xff1a; >>> stu1[xiaoming,True,21,79.9] >>> stu1[lihong,False,22,69.9] >>> stu1[zhangqiang,True,20,89.9] >>> stu1[EMT,True,23,99.9]如图&#xff0c;定义了四个列表…

LeetCode 刷题记录——从零开始记录自己一些不会的

1. 最多可以摧毁的敌人城堡数目 题意 思路 两层循环&#xff0c;太low了 用一个变量记录前一个位置 代码 class Solution { public:int captureForts(vector<int>& forts) {int ans 0, pre -1;for (int i 0; i < forts.size(); i) {if (forts[i] 1 || forts…

c++ 学习之类型,常量以及变量的重点知识

const 和 volatile 组合考点 const int ( * ) 等价于 int const ( * ) const int x 1 ; 说明 x 是常量&#xff0c;无法修改 如何区分指针常量和常量指针 指针常量 为 先有指针后有常量 故为 形式如 &#xff1a; int * const p & x ; 且const 修饰的是 p &#xff0c…

【MySQL】JDBC编程

MySQL-JDBC编程 文章目录 MySQL-JDBC编程Java的数据库编程JDBC工作原理JDBC的使用驱动包下载导入代码编写 Java的数据库编程 JDBC&#xff0c;即Java Database Connectivity&#xff0c;java数据库连接。是一种用于执行SQL语句的Java API&#xff0c;它是 Java中的数据库连接…

DELL 台式机的内置扬声器如何关闭

DELL 台式机的内置扬声器如何关闭&#xff1f; 点“开始”——控制面板——高清晰音频管理器——右上角“设备高级设置”——“播放设备”——点击“使前部和后部设备播放不同的音频流”前面的小方框——“确认”。ok了。

初识网络的发展史、通信基础和原理

目录 一.网络的发展史 二.网络通信基础 2.1IP地址 2.2端口号 2.3认识协议 2.3.1协议是什么&#xff1f; 2.3.2为什么需要协议&#xff1f; 2.3.3OSI模型和TCP/IP体系结构 三.网络通信的原理 总结 &#x1f381;个人主页&#xff1a;tq02的博客_CSDN博客-C语言,Java,J…

R730xd风扇调速

共使用了三个方法都是有效的&#xff0c;dell_fans_controller_v1.0.0和Dell_EMC_Fans_Controller_1.0.1以及ipmitool&#xff0c;前面两个是GUI界面后面一个是命令行工具 重点 我虽然能通过设置的ip地址能访问idrac管理界面&#xff0c;但是使用上面三个工具都是无法获取风扇…

Mybatis-Plus 批量插入数据时报错 java.lang.Object Not Found TableInfoCache

文章目录 前言问题回溯排查过程总结 前言 报错堆栈信息如下&#xff0c;基本是mybatis-plus源码中的一些东西&#xff1a; com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: java.lang.Object Not Found TableInfoCache.at com.baomidou.mybatisplus.core.to…

REST风格【SpringBoot】

1.REST简介 行为动作 通常模块名使用复数&#xff0c;也就是加s 2.RESTful入门 Controller public class UserController {RequestMapping(value "/users", method RequestMethod.POST)public String save() {System.out.println("user save");return &…

ClickHouse进阶(十二):Clickhouse数据字典-2-字典类型

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_大数据OLAP体系技术栈,Apache Doris,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

英码深元“三位一体”AI场景化解决方案,助力多地化工园区快速实现智慧化转型!

我国是世界公认的化工大国&#xff0c;同时也是崛起中的化工强国。近年来多起重大爆炸事故暴露出我国化工园区安全问题突出&#xff0c;特别是在安全风险管控数字化转型、智能化升级方面存在明显短板和不足&#xff0c;尤其突出的痛点&#xff1a;化工园区的日常管理方式较为粗…

电子烟行业常用的英文表达

1. 电子烟的各种表达 a) 电子烟 i. Electronic-cigarette, ii. Electronic smoke, iii. electronic cigarettes iv. Electric cigarette, v. E-Cigarettes vi. e-cigarette, vii. e-Cig viii. E cigar,e-cigar 电子烟雪茄 2. 电子烟特指词汇及衍生 a) VAPE i. Vapo…

【Git】Git 分支

Git 分支 1.分支简介 为了真正理解 Git 处理分支的方式&#xff0c;我们需要回顾一下 Git 是如何保存数据的。 或许你还记得 起步 的内容&#xff0c; Git 保存的不是文件的变化或者差异&#xff0c;而是一系列不同时刻的 快照 。 在进行提交操作时&#xff0c;Git 会保存一…

Scrum工作模式的角色和活动

​Scrum工作模式是一种敏捷软件开发方法&#xff0c;其核心是团队合作和自我组织&#xff0c;旨在通过短周期的迭代开发&#xff0c;实现快速反馈和持续改进。 Scrum工作模式包括以下角色和活动&#xff1a; 1、产品负责人&#xff08;Product Owner&#xff09;&#xff1a;…

Oracle(1):Oracle简介

1 什么是 ORACLE ORACLE 数据库系统是美国 ORACLE 公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或B/S 体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。 ORACLE 数据…