【SpringBoot学习笔记(四)】之扫描Bean,依赖注入,Bean的生命周期,自定义Bean

2023-11-17

本文章由公号【开发小鸽】发布!欢迎关注!!!


老规矩–妹妹镇楼:

一. 扫描Bean

1. 概述

       之前,我们通过构造一个IOC容器来获取Bean,每个Bean对象都要添加@Bean注解,当Bean对象比较多的时候非常麻烦。这里我们使用@ComponentScan和@Component注解进行扫描装配Bean。

2. @Component注解

       这个注解用于哪个类就表明哪个类被扫描进入Spring IoC容器中,注解中的参数是Bean对象的名称,默认是当前类名的第一个字母小写,其他不变。注解@Value指定具体的值,使得Spring IoC给予对应的属性注入对应的值。

@Component("user")
public class User {
    @Value("aaa")
    private String id;
    @Value("username")
    private String userName;
    @Value("note")
    private String note;
}

3. @ComponentScan注解

       这个注解表明采用何种策略来扫描装配Bean对象。可以通过配置项basePackages自定义需要扫描的类,以及设置过滤器,过滤掉不需要的类。配置项includeFilters定义满足过滤器条件的Bean才去扫描,excludeFilters则是排除过滤器条件的Bean,都需要注解@Filter来定义,使用的一般是正则表达式。如:

@ComponentScan(“com.springboot.chapter3.*”)@ComponentScan(basePackages=”com.springboot.chapter3.pojo”)
@ComponentScan(basePackageClasses={User.class})

       添加过滤器的@ComponentScan,这样UserService就不会被扫描到:

@Component(basePackages=”com.springboot.chapter3.*”, excludeFilter = {@Filter(classes={UserService.class})})

二. 自定义第三方Bean

       Java应用需要引入第三方的包,且需要将第三方的类对象注入Spring IoC中,这时还是要使用@Bean注解,在需要注入的类上添加@Bean注解,这样就能够扫描到了。

三. 依赖注入

       Spring IoC还需要负责Bean之间的依赖关系,这里通过注解来配置。

1. @Autowired

       当需要注入一个Bean时,使用@Autowired注解来表示注入,它注入的机制基本的一条是根据类型,但是当一个Bean有多个时,就会出现异常。这时它就会首先根据类型找到Bean,再根据属性名称和Bean的名称进行匹配,如果匹配不成功,则抛出异常。同时,这个注解默认是必须找到对应的Bean对象的,如果不确定它标注的属性一定会存在且允许这个被标注的属性为null时,我们可以设置@Autowired属性required为false,那么该注解就可以不用找到对应的Bean对象了。

2. @Pirmary

       当出现注入歧义时,可以使用@Primary注解来修改注入的优先级。在优先级更高的注入类中添加该注解,那么就会首先找到该类来进行注入。

3. @Qualifier

       该注解配合@Autowired来使用,能够更加精确地注入,该注解的配置项value需要一个字符串,即需要注入的Bean对象名称,这样就能消除歧义性了。如:

@Autowired
@Qualifier(“dog”)

       注解同样可以在参数中使用,如下所示:

public BussinessPerson(@Autowired @Qualifier(“dog”) Animal animal){
	this.animal = animal;
}

四. 生命周期

       Spring IoC容器如何初始化和销毁Bean,这是Bean的生命周期。它大致分为Bean定义,Bean初始化,Bean的生存期和Bean的销毁四个部分。


1. Bean定义

       Spring 通过扫描包扫描到带有@Component的类后,开始解析,并将定义的信息保存起来,然后就会把Bean定义发布到Spring Ioc容器中,此时IOC容器中只有Bean的定义,没有Bean的实例生成,更没有依赖注入。

2. Bean初始化

       默认情况下,Spring在定义后,会完成Bean的实例化和依赖注入,这样从IOC容器中就可以得到一个依赖注入完成的Bean。@ComponentScan中有一个配置项lazyInit,默认是false,表示默认不进行延迟初始化,即默认Spring会完成Bean的实例化和依赖注入。

3. 自定义Bean初始化与销毁

       在Spring完成依赖注入后,还提供了一系列的接口和配置来完成Bean初始化的过程。

(1) 接口BeanNameAware

       该接口中的setBeanName方法用于设置Bean的名称。

(2) 接口BeanFactoryAware

       该接口中的setBeanFactory方法用于设置BeanFactory。

(3) 接口ApplicationContextAware

       该接口需要一个实现了ApplicationContext接口的IOC容器,这样该接口的setApplicationContext方法才会被调用。

(4) 接口BeanPostProcessor

       该接口为Bean后置处理器,将对所有的Bean有效,它有两个方法:预初始化方法postProcessBeforeInitialization,后初始化方法postProcessAfterInitialization。

(5) 注解@PostConstruct

       该注解用于表示自定义的初始化方法。

(6) 接口InitializingBean

       该接口中有一个afterPropertiesSet方法,用于设置属性。

(7) 注解@PreDestory

       该注解用于自定义一个销毁方法。

(8) 接口DIsposableBean

       该接口的destory方法用于销毁Bean。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【SpringBoot学习笔记(四)】之扫描Bean,依赖注入,Bean的生命周期,自定义Bean 的相关文章

随机推荐

  • MySQL中的sleep函数介绍

    微信公众号 互联网全栈架构 MySQL数据库中有一个不太常用但便于进行某些调试的函数 sleep 今天我们就来介绍一下这个函数的用法 首先 看看官网对于函数的定义 SLEEP duration Sleeps pauses for the n
  • 70道面试常见算法题

    字符串的循环移位 三次翻转 字符串的包含 哈希表 字符串全排列 next permutation算法 字符串的所有组合 dfs 字符串转整数 stoi stol 注意边界 回文判断 判断字符串是否为回文串 双指针从两头往中间扫描 判断链表是
  • linux系统下怎么安装.deb文件?

    linux系统下怎么安装 deb文件 deb 是 ubuntu debian 的格式 rpm 是 redhat fedora suse 的格式 他们不通用 虽然可以转换一下 deb是debian发行版的软件包 ubuntu是基于debian
  • pycharm常用快捷键总结

    工欲善其事 必先利其器 Python开发利器Pycharm常用快捷键以及配置如下 相信有了这些快捷键 你的开发会事半功倍 一 常用快捷键 编辑类 Ctrl D 复制选定的区域或行 Ctrl Y 删除选定的行 Ctrl Alt L 代码格式化
  • Three.js创建文字(Creating text)

    1 DOM CSS 使用HTML通常是最简单 最快速的添加文本的方法 这是大多数的Three js示例中用于添加描述性叠加文字的方法 div Description div 然后使用CSS来将其绝对定位在其它具有z index的元素之上 尤
  • 你的公司建立了企业文化了么?没有就看看这个

    一个地方运营商的经营语录 文 毛启盈 国庆期间 笔者出差河南 有一个意外的发现 这就是我要特别给大家介绍的河南联通的经营语录 是一本广泛流传于河南运营商中的 语录体 小册子 名曰 王祖益总 经理关于河南联通企业文化论述摘要 培训教材 内部资
  • Linux MISC 驱动实验

    我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动 MISC 驱动其实就是最简单的字符设备驱动 通常嵌套在 platform 总线驱动中 实现复杂的驱动 一 MISC 设备驱动简介 所有的 MISC 设备驱动的主设备号都为 1
  • [数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北

    MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库 用于处理移动物体的轨迹数据 它提供了一组强大的工具 可以轻松地加载 分析和可视化移动物体的轨迹 通过使用MovingPandas 用户可以轻松地处理
  • Window安全策略的制定与实施

    一 安全策略一 给系统打补丁 1 加强windows用户账户认证和访问控制权限控制 通过经常给电脑打补丁来保护电脑数据 这是一个保护电脑 防护很多病毒的有效措施 因为大多数电脑病毒都是通过WINDOWS操作系统的漏洞进行攻击 破坏电脑的正常
  • Django图书商城系统实战开发-实现商品分类管理

    Django图书商城系统实战开发 实现商品分类管理 目前项目已经实现了登录注册 商品详情查看 购物车购买 个人订单管理 评价功能 个人中心管理 管理员登录 会员管理 请设计商品分类管理的相关页面以及视图函数 首先你要知道 商品分类有一级分类
  • (深度学习,机器学习)卷积神经网络

    1 卷积神经网络使深度学习卷土重来是因为卷积神经网络非常适合计算机视觉应用的模型 2 卷积神经网络基本原理包括 卷积算子 卷积的特征 卷积神经网络的典型结构 以及其中的卷积层和池化层 3 卷积提供了能够提升机器学习效果的的三种重要方法 系数
  • 考研机试题 -- DFS、模拟、递推、BFS

    目录 全排列 DFS 八皇后 DFS 反序输出 模拟 特殊乘法 模拟 众数 模拟 吃糖果 模拟 递推数列 递推 玛雅人的密码 BFS 全排列 DFS https www noobdream com DreamJudge Issue page
  • React16新特性

    React的16版本采用了MIT开源许可证 新增了一些特性 Error Boundary render方法新增返回类型 Portals 支持自定义DOM属性 setState传入null时不会再触发更新 更好的服务器端渲染 新的打包策略 1
  • vue 基于el-table实现多页多选、翻页回显过程

    近半年时间在接触vue写pc页面 文中内容即在实际的开发过程中遇到的实际问题 1 问题交代 在pc版的列表页面中 假设当前在列表的第一页 想要在当前页面选择几行数据 跳转到其他页面选择几行数据 选择后的数据页面展示为已勾选状态 经过跳转页面
  • VMware虚拟机安装及如何正确联网

    需要下载 1 VMware 12 第一个图和第二个图是借用其他网友的 本教程使用全部为VMware12 VMware 14同样适用于本文 2 Linux系统 CentOS 6 2 x86 64 bin DVD1 iso 1 安装vmware
  • LIRE代码剖析1——运行第一个图像检索

    lucene是一个开源的强大的索引工具 但是它仅限于文本索引 基于内容的图像检索 CBIR 要求我们利用图像的一些基本特征 如颜色纹理形状以及sift surf等等 搜索相似的图片 LIRE Lucene Image Retrieval 是
  • javascript_JavaScript走向成熟

    javascript 明年JavaScript将有20年的历史 从首次在Netscape浏览器中首次亮相开始算起 这是一门具有悠久历史的语言 并且从其早期开始就带来了很多负担 但是随着它离开少年时代的到来 我认为这是一种最终发展起来的语言
  • Nginx安装Lua

    Nginx安装Lua 1 安装Lua 两个二选一 yum install readline devel CentOS sudo apt get install libreadline dev Ubuntu sudo apt get inst
  • _this2.setState is not a function错误解决办法

    编写RN的小伙伴都知道setState是RN最常见的一个函数 但是这个最简单的函数却是经常报错 这一次我们就来解决 this2 setState is not a function这个错误 首先来看一下我的代码 这段代码就是发送一个请求 然
  • 【SpringBoot学习笔记(四)】之扫描Bean,依赖注入,Bean的生命周期,自定义Bean

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 扫描Bean 1 概述 之前 我们通过构造一个IOC容器来获取Bean 每个Bean对象都要添加 Bean注解 当Bean对象比较多的时候非常麻烦 这里我们使用 Componen