系列二十二、各种注解

一、@Import

# 用法

1)@Import(User.class):如果导入的是配置类,将会按照配置类正常解析,如果是个普通类就会解析成bean
2)@Import(实现了ImportSelector接口的类.class):可以一次性注册多个bean,返回一个String[],每一个值就是类的完整类路劲
3)@Import(MyImportBeanDefinitionRegistrar.class):可以一次性注册多个bean,通过BeanDefinitionRegistry来动态注册BeanDefinition
4)@Import(MyDeferredImportSelector.class)

二、@Configuration

2.1、概述

@Configuration是用来代替传统的xml的配置方式配置bean的。

2.2、不加就不能配置bean吗

答:能。 

2.2.1、ComponentA

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/27 15:45* @Description:*/
public class ComponentA {public ComponentA componentA() {System.out.println("ComponentA's NoArgsConstructor was invoked!");return new ComponentA();}}

2.2.2、MySpringConfig

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/27 15:45* @Description:*/
@Slf4j
public class MySpringConfig {@Beanpublic ComponentA componentA() {return new ComponentA();}}

2.2.3、SpringConfigurationMainApp

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/27 15:46* @Description:*/
@Slf4j
public class SpringConfigurationMainApp {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MySpringConfig.class);ComponentA componentA = context.getBean("componentA", ComponentA.class);log.info("componentA:{}",componentA);}}

2.3、加与不加的区别

        配置类加了@Configuration注解,Spring会为配置类创建cglib动态代理,@Bean方法的调用就会通过容器getBean进行获取,保证当@Bean方法进行互调时,@Bean是单例的。

2.4、不加@Configuration注解案例

2.4.1、ComponentA(同2.2.1)

2.4.2、ComponentB

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/27 15:45* @Description:*/
public class ComponentB {public ComponentB componentB() {System.out.println("ComponentB's NoArgsConstructor was invoked!");return new ComponentB();}}

2.4.3、MySpringConfig

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/27 15:45* @Description:*/
//@Configuration
@Slf4j
public class MySpringConfig {@Beanpublic ComponentA componentA() {ComponentB componentB1 = componentB();ComponentB componentB2 = componentB();log.info("componentB1:{},componentB2:{},(componentB1 == componentB2) ? {}",componentB1,componentB2,(componentB1 == componentB2));return new ComponentA();}@Beanpublic ComponentB componentB() {return new ComponentB();}}

2.4.4、SpringConfigurationMainApp(同上)

2.5、加@Configuration注解案例

代码同2.4,但是要在MySpringConfig上标注@Configuration注解。

2.6、结论

        虽然配置类上加与不加@Configuration注解都可以创建bean,但是当@Bean方法内部调用另一个@Bean标注的方法时,如果配置类没有加@Configuration注解,那么Spring将不会为其创建Cglib动态代理,而是将被调用的@Bean方法当做一个普通方法,于是就出现了2.4中的结果。

2.7、原理

        1、启动IOC容器的时候会注册一个解析配置的处理器 ConfigurationClassPostProcessor

        2、调用invokeBeanFactoryPostProcessors(beanFactory)时,就会去调用postProcessBeanDefinitionRegistry进行解析配置(解析加了@Configuration、@Component、@Import、@Bean的类,目的是为了注册BeanDefinition)
        3、ConfigurationClassPostProcessor.postProcessBeanFactory去创建cglib动态代理;

        4、当@Bean方法进行互调时,会通过cglib进行增强,通过调用的方法名作为bean的名称去IOC容器中获取,进而保证了@Bean方法的单例

三、@SpringBootApplication

3.1、概述

        @SpringBootApplication是SpringBoot中的注解,通常标识在主启动类上,表明当前应用是一个SpringBoot工程,它实际上是一个复合注解,结构如下:

四、@SpringBootConfiguration

4.1、概述

        @SpringBootConfiguration也是SpringBoot中的注解,实际上就是一个@Configuration,表示启动类也是一个配置类,结构如下:

五、@EnableAutoConfiguration

5.1、概述

        @EnableAutoConfiguration也是SpringBoot中的注解,它导入了一个AutoConfigurationImportSelector,用于加载classpath/META-INF/spring.factories中所定义的所有自动配置类,并将这些自定配置类注册为bean,结构如下:

六、@Conditional

6.1、概述

        @Conditional注解是Spring中的一个注解,主要用于xxxAutoConfiguration类中,用于程序员自定义starter时进行扩展,这些自动配置类在IOC容器加载过程中最后才被加载,其中起到关键作用的注解就是@ConditionalXxx,例如:@ConditionalOnMissingClass({"org.aspectj.weaver.Advice"})、@ConditionalOnClass({Advice.class})、@ConditionalOnProperty()...等等,结构如下:

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

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

相关文章

Python爬虫基础之Scrapy框架详解

目录 1. 简介2. Scrapy的安装3. Scrapy的架构4. Scrapy的数据流程5. Scrapy开发流程5.1 创建项目5.2 创建Spider5.3 创建Item5.4 编写Spider5.5 运行Spider 参考文献 原文地址:https://program-park.top/2023/12/01/reptile_5/ 本文章中所有内容仅供学习交流使用&am…

0Ω电阻最大过流能力及作用用途

0Ω电阻最大过流能力及作用用途 0Ω电阻过流能力0Ω电阻的作用 0Ω电阻过流能力 0Ω电阻不一定是真正的0Ω电阻,0Ω电阻存在一定的阻值偏差,主要看生产电阻厂商做哪种了。厂商都是根据电阻标准文件 EN60115-2, 里头0Ω电阻实际最大阻值有 10…

第六十四周周报

学习目标: 项目 实验 学习时间: 2023.11.24-2023.12.1 学习产出: 项目 由于小程序要上线了,这周前几天都在和前端联调改bug,并且多拆分出来两张表,工作量比较大,花的时间很多。 实验 整…

JAVA全栈开发 day15_集合(Set接口、增强For循环、Map体系)

一、增加for遍历集合 语法: for(数据类型 变量名: 数组名或集合){​ }//集合遍历 ,推荐使用增加for 1.静态导入 注意事项: 方法必须是静态注意不要和本类的方法同名,如果同名,记得加前缀,由此可…

error: flexible array member not at end of struct 柔性数组/可变数组

在C之中,给定了一个结构定义和一个指向结构的指针,编译器必须能够通过指针偏移的方式访问该结构的任何成员。由于结构中每个成员的位置都取决于其前导成员的数量和类型,因此访问任何结构都需要知道所有前导成员的数量和类型。 在结构体之中&…

Git——分支应用进阶

主要内容包括以下几个方面: 长期分支和短期分支的类型以及用途。多种分支模型,其中包括基于工作流的主题分支。不同分支模型的发布流程。在多个预览版程序中使用分支修复安全问题。远程跟踪分支和refspecs规范,以及默认远程版本库配置。拉取…

Mongodb 开启oplog,java监听oplog并写入关系型数据库

开启Oplog windows mongodb bin目录下找到配置文件/bin/mongod.cfg,配置如下: replication:replSetName: localoplogSizeMB: 1024双击mongo.exe 执行 rs.initiate({_id: "local", members: [{_id: 0, host: "localhost:27017"}]})若出现如…

深入理解前端路由:构建现代 Web 应用的基石(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

多线程(初阶六:单例模式)

一、单例模式的简单介绍 二、饿汉模式 三、懒汉模式 四、饿汉模式和懒汉模式的线程安全问题分析 一、单例模式的简单介绍 单例模式是一种设计模式,其中设计模式是软性的规定,与它关联的框架是硬性的规定,这些都是大佬已经设计好了的&…

feign自定义第三方接口;配置化Feign接口URL;调用指定IP的feign服务

最近接手一个项目,各子工程之间通过feign调用;各服务部署在K8S上,通过nacos管理配置;由于服务部署的机器无法开放端口等原因,导致本机服务与测试环境网络端口无法互通,故需要重写feign的调用地址&#xff1…

QT线程的使用 循环中程序的等待

QT线程的使用 循环中程序的等待 先看效果1 pro文件2 头文件3 源文件4 ui文件先看效果 1 pro文件 QT += concurrent2 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H

简述MyBatis、MyBatis-Plus、以及MyBatis-Plus的简单运用

什么是MyBatis MyBatis是一个开源的Java持久层框架,用于简化与关系型数据库的交互。它通过将SQL语句与Java代码进行分离,提供了一种优雅的方式来处理数据库操作。 MyBatis的核心思想是将SQL语句与Java方法进行映射,使得开发人员可以通过配置…

集成开发环境PyCharm的使用【侯小啾python领航计划系列(三)】

集成开发环境 PyCharm 的使用【侯小啾python领航计划系列(三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

【Vue3+Ts项目】硅谷甄选 — 搭建后台管理系统模板

一、 项目初始化 一个项目要有统一的规范,需要使用eslintstylelintprettier来对我们的代码质量做检测和修复,需要使用husky来做commit拦截,需要使用commitlint来统一提交规范(即统一提交信息),需要使用pre…

剑指 Offer(第2版)面试题 12:矩阵中的路径

剑指 Offer(第2版)面试题 12:矩阵中的路径 剑指 Offer(第2版)面试题 12:矩阵中的路径解法1:回溯 剑指 Offer(第2版)面试题 12:矩阵中的路径 题目来源&#x…

Python | 轻量ORM框架Peewee的基础使用(增删改查、自动创建模型类、事务装饰器)

文章目录 01 简介02 安装03 自动创建模型类04 基础使用4.1 查询4.2 新增4.3 更新4.4 删除 05 事务 01 简介 在使用python开发的过程中,有时需要一些简单的数据库操作,而Peewee正是理想的选择,它是一个小巧而灵活的 Python ORM(对…

hadoop-3.3.5安装过程

准备资源三台虚拟机: 1)准备3台服务器(关闭防火墙、静态IP、主机名称) 2)安装JDK 3)配置环境变量 4)安装Hadoop 5)配置环境变量 安装虚拟机(略)--1台即…

SQL练习

建数据库: mysql> create database worker; Query OK, 1 row affected (0.00 sec) mysql> CREATE TABLE worker (-> 部门号 int(11) NOT NULL,-> 职工号 int(11) NOT NULL,-> 工作时间 date NOT NULL,-> 工资 float(8,2) NOT NULL,-> 政治面貌…

如何删除mac苹果电脑上面的流氓软件?

在使用苹果电脑的过程中,有时候我们也会遇到一些不需要的软件。无论是因为不再需要,或者是为了释放磁盘空间,删除这些软件是很重要的。本文将为大家介绍怎样删除苹果电脑上的软件! CleanMyMac X全新版下载如下: https://wm.make…

elementUI实现根据屏幕大小自适应换行,栅格化布局

需求: 默认一行展示4个卡片;当屏幕小于某个大小的时候,一行展示3个卡片;再小就展示2个;以此类推,最小就展示1个。 效果卡片样式如下图: 默认一行4个 屏幕缩小到某个阈值,一行展示…