系列二十二、各种注解

一、@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 {

    @Bean
    public 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 {

    @Bean
    public ComponentA componentA() {
        ComponentB componentB1 = componentB();
        ComponentB componentB2 = componentB();
        log.info("componentB1:{},componentB2:{},(componentB1 == componentB2) ? {}",componentB1,componentB2,(componentB1 == componentB2));
        return new ComponentA();
    }

    @Bean
    public 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方法的单例

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 栈回溯

目录 前言一、什么是栈回溯?二、栈回溯的实现原理三、参考阅读 前言 日常工作中,我们在开发软件程序时,经常会遇到程序奔溃的问题,导致程序奔溃的原因有很多,我们一般都是定位到相关代码,再去查询具体原因。…

FinOps和DevOps的未来会怎样?

FinOps(或财务运营)是一种文化实践,它将财务责任引入云的可变支出模型。这是一种将系统、最佳实践和文化相结合的战略方法,可提高组织了解云成本并做出明智决策的能力。 本质上,FinOps 是一个管理云运营费用&#xff…

C++:OJ练习(每日练习系列)

编程题: 题一:把字符串转换成整数 把字符串转换成整数_牛客题霸_牛客网 示例1 输入: "2147483647" 返回值: 2147483647思路一: 第一步:it从str的第一个字符开始遍历,定义一个最后输…

使用 ChatGPT 创建 Makefile 构建系统:从 Docker 开始

使用 Docker 搭配 ChatGPT 创建 Makefile 构建系统 Makefile 构建系统是嵌入式软件团队实现其开发流程现代化的基础。构建系统不仅允许开发人员选择各种构建目标,还可以将这些构建集成到持续集成/持续部署 (CI/CD) 流程中。使用诸如 ChatGPT 这样的人工智能 (AI) 工…

【docker】docker的基础命令

基础操作 docker info #查看docker的基本信息docker version #查看docker版本信息一、镜像操作 1、搜索镜像 docker search nginx2、下载镜像 docker pull nginx#从仓库中下载镜像,若没有指定标签,则下载最新的版本,也就是标签为: lat…

使用opencv实现图像滤波

1 图像滤波介绍 滤波是信号和图像处理中的基本任务之一,其旨在有选择地提取图像的某些特征,可以用于在给定应用程序的上下文中传达重要信息,例如,去除图像中的噪声、提取所需的视觉特征、图像重采样等。 1.1 图像滤波理论 图像…

Matplotlib线形图的创建_Python数据分析与可视化

线形图的创建 绘制线形图设置颜色和风格设置坐标轴上下限设置图形标签 绘制线形图 在所有图形中,最简单的应该就是线性方程y f (x) 的可视化了。来看看如何创建这个简单的线形图。要画Matplotlib图形时,都需要先创建一个图形fig 和一个坐标轴ax。创建图…

AI - Crowd Simulation(集群模拟)

类似鱼群,鸟群这种群体运动模拟。 是Microscopic Models 微观模型,定义每一个个体的行为,然后合在一起。 主要是根据一定范围内族群其他对象的运动状态决定自己的运动状态 Cohesion 保证个体不会脱离群体 求物体一定半径范围内的其他临近物…

深度学习回顾:七种网络

一、说明 本文 揭开CNN、Seq2Seq、Faster R-CNN 和 PPO ,以及transformer和humg-face— 编码和创新之路。对于此类编程的短小示例,用于对照观察,或做学习实验。 二、CNN网络示例 2.1 CNN用mnist数据集 CNN 专为图像处理而设计,包…

idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;) 📜jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量&a…

FreeRTOS源码阅读笔记6--event_groups.c

通常用的事件标志组是一个32位的变量uxEventBits,可设置的位有24位,一共就是24 种事件。 事件组的结构体类型: 6.1创建事件组xEventGroupCreate() 6.1.1函数原型 返回值:事件组句柄,指向事件组。 6.1.2函数框架 ①…

通过亚马逊云科技云存储服务探索云原生应用的威力

文章作者:Libai 欢迎来到我们关于“使用亚马逊云科技云存储服务构建云原生应用”的文章的第一部分。在本文中,我们将深入探讨云原生应用的世界,并探索亚马逊云科技云存储服务在构建和扩展这些应用中的关键作用。 亚马逊云科技开发者社区为开发…

鸿蒙应用开发-初见:ArkUI

编程范式:命令式->声明式 以一个卡片的实现做下讲解 命令式 简单讲就是需要开发用代码一步一步进行布局,这个过程需要开发全程参与。 Objective-C UIView *cardView [[UIView alloc] init]; cardView.backgroundColor [UIColor whiteColor]; ca…

[socket 弹 shell] msg_box3

前言 题目比较简单,没开 Canary 和 NX. Arch: amd64-64-littleRELRO: Full RELROStack: Canary foundNX: NX disabledPIE: PIE enabledRWX: Has RWX segments 漏洞利用与分析: 白给的函数调用,其中 ptr 10 是用…

Elasticsearch启动失败问题汇总

版本elasticsearch-8.11.1,解压安装完后,修改安装目录下conf/jvm.options, 默认配置如下: -Xms4g -Xmx4g 默认的配置占用内存太多了,调小一些: -Xms256m -Xmx256m由于es和jdk是一个强依赖的关系&#xff0…

[黑马程序员SpringBoot2]——开发实用篇3

目录: jetcache远程缓存方案jetcache本地缓存方案jetcache方法缓存j2cache基本操作springboot整合quartz​​​​​​​springboot整合task发送简单邮件发送多部件邮件消息简介购物订单案例-发送短信ActiveMQ安装springboot整合ActiveMQRabbitMQ安装springboot整合…

代理IP可以用于哪些实际场景?遇到问题如何解决

随着互联网的普及和网络应用的广泛使用,代理IP已成为许多人工作和生活中不可或缺的一部分。代理IP可以用于多种实际场景,并在遇到问题时提供有效的解决方案。下面将详细介绍代理IP的实际应用场景及遇到问题时的解决方法。 一、代理IP的实际应用场景 1. 网…

C#,数值计算——插值和外推,径向基函数插值(RBF_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 径向基函数插值 /// Object for radial basis function interpolation using n points in dim /// dimensions.Call constructor once, then interp as many times as desir…

阿里云服务器部署node和npm

目录 1.链接服务器2.找到node 下载地址3获取链接地址4下载到linux5.解压6.重命名 解压后的文件7.配置环境变量7.1复制当前的bin目录7.2vim /etc/profile7.3在按下ESC按键 8.重启环境变量9.输入node10.npm配置加速镜像 1.链接服务器 2.找到node 下载地址 https://nodejs.org/d…

激光雷达毫米波雷达

一.激光雷达 技术指标&#xff1a; 视场角 线数&#xff08;32/64/128&#xff09; 分辨率&#xff08;激光光束夹角越小分辨率越高&#xff0c;0.1度&#xff09; 探测距离&#xff1a;0.3-200m 反射率&#xff08;一般探测10%以上反射率的目标&#xff09; 分类 按照测距方…
最新文章