spring注解驱动开发(BEAN注册方式与生命周期)

news2024/12/23 10:29:54

目录

容器中注册BEAN的方式

BEAN生命周期


容器中注册BEAN的方式

  1. 包扫描+组件标注注解
    @ComponentScan(basePackages = {"com.an.spring.condition"})
    @Service
    @Component
    @Controller
    @Repository
  2. @BEan方式【导入第三方包里面的组件】
    @ComponentScan(basePackages = {"com.an.spring.condition"})
    public class ConditionConifg extends BaseConfig {
    
        @Bean
        @Conditional(WindowsCondition.class)
        public ListService wl() {
            return new WindowsListService();
        }
    }
  3. @Import快速给容器中导入一个组件。
    @Import({ColorBlue.class, MyImportSelector.class, 
    MyImportBeanDefinitionRegistrar.class})
    

    1)、@IMport(要导入到容器中的组件),容器就会注入这个组件,默认BEAN在容器中的ID为类的全类名。
    @ComponentScan(basePackages = {"com.an.spring.condition"})
    @Import(ColorBlue.class)
    public class ConditionConifg extends BaseConfig {}
    
    效果:
    当前容器中Bean: com.an.spring.other.ColorBlue
    

    2)、在Import注解中类实现org.springframework.context.annotation.ImportSelector接口,返回需要导入的类全名数组。

    public class MyImportSelector implements ImportSelector {
    
        /**
         * 返回值,就是导入到容器中的组件的全类名。
         *
         * @param importingClassMetadata:当前标注@Import注解的类的所有注解信息
         * @return 导入到容器中的组件的全类名【不可返回null】
         */
        @Override
        public String[] selectImports(AnnotationMetadata importingClassMetadata) {
            System.out.println("MyImportSelector: " + importingClassMetadata.getClassName());
            return new String[]{"com.an.spring.other.ColorRed"};
        }
    }

    3)、在Import注解中类实现org.springframework.context.annotation.ImportBeanDefinitionRegistrar接口,手动注册BEAN到容器中。
     

    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        /**
         * 注册BEAN
         *
         * @param importingClassMetadata 当前类的注解信息
         * @param registry 通过调用BeanDefinitionRegistry#registerBeanDefinition(java.lang.String,
         *                org.springframework.beans.factory.config.BeanDefinition)方法注册BEAN
         */
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            ImportBeanDefinitionRegistrar.super.registerBeanDefinitions(importingClassMetadata, registry);
            RootBeanDefinition beanDefinition = new RootBeanDefinition();
            beanDefinition.setBeanClass(ColorGreen.class);
            registry.registerBeanDefinition("rabinoooxx", beanDefinition);
        }
    }

  4. 使用Spring提供的org.springframework.beans.factory.FactoryBean(工厂BEAN)注册BEAN。
    BEAN定义与配置:
    @ComponentScan(basePackages = {"com.an.spring.condition"})
    @Import({ColorBlue.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
    public class ConditionConifg extends BaseConfig {
        @Bean
        public MyFactoryBean myFactoryBean() {
            return new MyFactoryBean();
        }
    }
    FactoryBean配置:
    package com.an.spring.condition;
    
    import com.an.spring.other.RainBow;
    import org.springframework.beans.factory.FactoryBean;
    
    public class MyFactoryBean implements FactoryBean<RainBow> {
        // 返回对象,这个会被添加到容器中
        @Override
        public RainBow getObject() throws Exception {
            return new RainBow();
        }
    
        @Override
        public Class<?> getObjectType() {
            return RainBow.class;
        }
    
        // 是否单例
        @Override
        public boolean isSingleton() {
            return FactoryBean.super.isSingleton();
        }
    }
    

    获取FactoryBEAN的方式与特点:
    System.out.println("=====Spring提供的工厂BEAN对象获取:======");
    System.out.println("获取工厂BEAN本身:" + context.getBean("&myFactoryBean"));
    System.out.println("获取工厂BEAN,getObject()方法返回的对象:" + context.getBean("myFactoryBean"));
    

BEAN生命周期

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

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

相关文章

chatgpt赋能python:Python处理雷达数据

Python处理雷达数据 雷达技术是一种主要用于测量目标距离、速度和方位的技术。在雷达系统中&#xff0c;雷达接收器接收到的信号经过一系列的处理才能得到有效的数据。在这一过程中&#xff0c;Python语言得到了广泛应用。本文将介绍Python如何处理雷达数据。 雷达数据的格式…

linuxOPS基础_ssh概念详解

ssh 什么是SSH SSH&#xff08;Secure Shell&#xff0c;安全外壳&#xff09;是一种网络安全协议&#xff0c;通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录和文件传输方式&#xff0c;例如Telnet、FTP&#xff0c;使用明文传输数据&#xff0c;存在很多…

Openlayers 教程 - 基于 Openlayers api 实现空间查询(客户端):点选、范围查询

Openlayers 教程 - 基于 Openlayers api 实现空间查询&#xff08;客户端&#xff09;&#xff1a;点选、范围查询 客户端空间查询核心代码在线示例 客户端空间查询 在地理信息系统中&#xff0c;空间查询有的非常重要的作用&#xff0c;几乎所有地图相关的业务系统都需要空间…

青少年C++编程等考有这么多??机构到底该带孩子考哪个?

随着信息学的普及与发展&#xff0c;越来越多的孩子开始学习C&#xff0c;参加编程等考来检验C的学习成果、作为也逐渐成为了一个共识&#xff0c;跟C有关的等考究竟有哪些&#xff0c;哪个等考含金量够高&#xff0c;能够客观、有效地检验学习成果呢&#xff1f; 在这里整理了…

解决Fortify漏洞:Access Specifier Manipulation

目录 1. 什么是Fortify漏洞 2. 漏洞描述 示例&#xff1a; 3. 漏洞原因 4. 解决方法 示例&#xff1a; 1. 什么是Fortify漏洞 Fortify 是一种静态代码分析工具&#xff0c;可用于识别源代码中的安全漏洞和错误。Fortify 检查程序是否存在潜在的安全漏洞&#xff0c;例如 …

Vue-springboot大学生心理健康测试咨询与诊断平台设计与实现

心理健康咨询与诊断平台一直以来就是困扰医院提高服务水平的重要环节&#xff0c;特别是医疗水平高、门诊访问量高的综合型医院&#xff0c;门诊拥挤就成了普遍现象。因此&#xff0c;本文提出了心理健康咨询与诊断平台。在线预约挂号、医疗诊断、医生评价、排班信息、心理测试…

WWW 2023 | 量化交易相关论文(附论文链接)

写在前面 国际万维网会议&#xff08;Proceedings of the ACM Web Conference&#xff0c;简称 WWW&#xff09;是互联网技术领域最重要的国际会议之一。今年的 WWW 将在美国德克萨斯州举行。本届会议共收到了1900篇论文&#xff0c;接收365篇&#xff0c;录用率为19.2%。本文介…

单片机的系统移植

目录 一、uboot概述 Bootloader Bootloader基本功能&#xff1a; 二、SD卡启动盘制作 三、uboot的使用 3.1uboot模式 自启动模式 交互模式 3.2uboot帮助命令 3.3uboot环境变量命令 3.4常用环境变量 3.5网络传输命令 3.6u-boot访问存储器命令 3.7 u-boot自启动环境变量&#xff…

web3到底是什么?只是一场永远醒不来的梦

Hello大家好&#xff0c;我是ClonBrowser鱼鱼。 过去&#xff0c;我一直与大家分享Facebook运营和广告方面的干货&#xff0c;但今天我想和大家聊聊一个更加炙手可热的话题——Web3。 近年来&#xff0c;Web3成为了互联网行业的热门关键词&#xff0c;被各大媒体和技术界热议…

体验管理|关于客户旅程编排(CJO),你不知道的事!

Guofu 第 97⭐️ 篇原创文章分享 &#xff08;点击&#x1f446;&#x1f3fb;上方卡片关注我&#xff0c;加⭐️星标⭐️~&#xff09; 客户旅程地图大家已经很熟悉了&#xff0c;那客户旅程编排又是什么呢&#xff1f; 我们一起来看一下。&#x1f47b;&#x1f47b;&#x1…

for循环中的变量

此处点击时打印的i为5 因为i本身onclick内部没有,需要去全局变量找 此处点击时打印的i为5 此处按按钮i打印4 // 对每一个按钮的点击进行监听for (var i 0; i < btnEls.length; i) {var btnItemEl btnEls[i]btnItemEl.index ibtnItemEl.onclick function() {console.log…

提高数据处理效率的有力工具:TopK算法解析

文章目录 TopK是什么TopK算法的实现总结 在现实生活中&#xff0c;TopK算法是非常常见的一种应用&#xff0c;你可能已经在电商平台上使用它来搜索最畅销的商品或者在音乐应用中使用它来发现最受欢迎的歌曲。那么&#xff0c;让我们深入了解TopK算法的原理和实现吧&#xff01;…

一维Logistic系统分岔图matlab实现

Logistic系统被广泛应用在各个领域中&#xff0c;如生态学、物理学和社会科学等&#xff0c;也被用于密码学和数据加密中。在工业和商业中&#xff0c;混沌Logistic系统也被用于数据编码和保密通信。Logistic系统是一种非常简单的二次多项式形式的映射。 混沌Logistic系统指的…

Centos7更换OpenSSL版本

OpenSSL 1.1.0 用户应升级至 1.1.0aOpenSSL 1.0.2 用户应升级至 1.0.2iOpenSSL 1.0.1 用户应升级至 1.0.1u 查看openssl版本 openssl version -v选择升级版本 我的版本是OpenSSL 1.0.2系列&#xff0c;所以要升级1.0.2i https://www.openssl.org/source/old/1.0.2/openssl-…

MATLAB 滤波器频率特性分析

【设计目标】对典型滤波器进行时频域分析和处理的基本方法 【设计工具】MATLAB 【设计要求】 1)设计典型的滤波电路:低通、高通、带通、带阻2)理论分析各滤波电路的系统函数 3)利用Matlab分析各滤波电路的系统函数的频率特性(幅频、相频)、零极点分布 4)分析不同频率正…

(iView)表格过长省略显示且提示

(iView)表格过长省略显示且提示 效果&#xff1a; 写法&#xff1a; data(){return:{ columns: [{type: "selection",align: "center",width: 60,},{title: "名称",key: "chinese",align: "center",ellipsis: true, //1.…

STM32模拟I2C协议获取HMC5883L电子罗盘磁角度数据 (HAL)

STM32模拟I2C协议获取HMC5883L电子罗盘磁角度数据(HAL) HMC5883L 传感器采用霍尼韦尔各向异性磁阻(AMR)技术&#xff0c;应用于罗盘和三轴磁场角度检测领域&#xff0c;常用于水平物体转动的角度识别。HMC5883L 采用I2C总线接口&#xff0c;2.16~3.6V供电范围&#xff0c;带有…

利用docker compose 搭建 elasticsearch 和kibana

本文已参与「新人创作礼」活动&#xff0c;一起开启掘金创作之路。 本文介绍了从docker compose 搭建 elasticsearch 并安装IK 分词插件&#xff0c;然后再用kibana测试的详细步骤。 利用docker compose 搭建 elasticsearch 和kibana 1. 下载软件 1.1 下载镜像 docker pul…

实验技术—测序数据不好,可能是建库出了问题?(上)

回顾 在建库之前&#xff0c;我们需要对先前提取的核酸进行质检。只有质检合格的样本才能继续建库、测序、分析。&#xff08;质检的内容在上一章节也有描述&#xff09;这里再回顾下质检的内容主要分以下几部分&#xff1a; 1. 凝胶电泳实验: DNA是否降解 &#xff0c;是否有…

【Python 异步编程】零基础也能轻松掌握的学习路线与参考资料

Python 异步编程学习路线&#xff1a; 1.理解同步和异步编程模型的区别&#xff0c;了解使用异步编程的优缺点。 同步编程是指一个任务执行完毕后再执行下一个任务&#xff0c;而异步编程则是在任务执行的同时还可以继续执行其他任务。 异步编程优点&#xff1a; (1)性能优…