SpringBoot SpringBoot 原理篇 1 自动配置 1.11 bean 的加载控制【编程式】

news2025/2/28 17:26:54

SpringBoot

【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

SpringBoot 原理篇

文章目录

      • SpringBoot
      • SpringBoot 原理篇
      • 1 自动配置
        • 1.11 bean 的加载控制【编程式】
          • 1.11.1 bean 的加载控制
          • 1.11.2 环境准备
          • 1.11.3 加载控制

1 自动配置

1.11 bean 的加载控制【编程式】

1.11.1 bean 的加载控制

前面我们已经看完了8 种+ 的bean的加载方式【收获颇丰】,这些都可以往Spring 的容器中去加载bean

但是很多情况下,都需要根据情况去加载对应的bean,而不是每次都加载固定的那些bean【就是咱们可以对其进行控制】

bean的加载控制:bean的加载控制指根据特定情况对bean进行选择性加载以达到适用于项目的目标。

前面我们讲的各种方式中,哪些可以实现控制呢?

一、XML方式声明bean

在这里插入图片描述

二、XML+注解方式声明bean

在这里插入图片描述

二、使用@Component及其衍生注解@Controller 、@Service、@Repository定义bean;使用@Bean定义第三方bean,并将所在类定义为配置类或Bean

在这里插入图片描述

三、注解方式声明配置类

在这里插入图片描述

  • 初始化实现FactoryBean接口的类,实现对bean加载到容器之前的批处理操作

在这里插入图片描述

  • 加载配置类并加载配置文件(系统迁移)

在这里插入图片描述

  • 使用proxyBeanMethods=true可以保障调用此方法得到的对象是从容器中获取的而不是重新创建的

在这里插入图片描述

四、使用@Import注解导入要注入的bean对应的字节码

在这里插入图片描述

  • 使用@Import注解导入配置类

在这里插入图片描述

五、使用上下文对象在容器初始化完毕后注入bean

在这里插入图片描述

六、导入实现了ImportSelector接口的类,实现对导入源的编程式处理

在这里插入图片描述

七、导入实现了ImportBeanDefinitionRegistrar接口的类,通过BeanDefinition的注册器注册实名bean,实现对
容器中bean的裁定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果

在这里插入图片描述

八、导入实现了BeanDefinitionRegistryPostProcessor接口的类,通过BeanDefinition的注册器注册实名bean,
实现对容器中bean的最终裁定

在这里插入图片描述

所以,通过下面的 四种加载方式,我们就可以通过编程的方式去控制bean 的加载。

在这里插入图片描述

1.11.2 环境准备

新建一个普通的Maven 工程模块

在这里插入图片描述

OK,直接创建

在这里插入图片描述

一个全新的Maven 工程

【添加坐标】

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.23</version>
    </dependency>
</dependencies>

在这里插入图片描述

【创建类】

package com.dingjiaxiong.bean;

/**
 * ClassName: Cat
 * date: 2022/10/25 10:32
 *
 * @author DingJiaxiong
 */


public class Cat {
}

狗和老鼠同理

在这里插入图片描述

【配置类】

package com.dingjiaxiong.config;

/**
 * ClassName: SpringConfig
 * date: 2022/10/25 10:34
 *
 * @author DingJiaxiong
 */


public class SpringConfig {
}

【运行类】

package com.dingjiaxiong;

import com.dingjiaxiong.config.SpringConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * ClassName: App
 * date: 2022/10/25 10:33
 *
 * @author DingJiaxiong
 */

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        String[] beans = ctx.getBeanDefinitionNames();

        for (String bean : beans) {
            System.out.println(bean);
        }
    }
}

直接运行,效果可以猜到了,几个长的,一个SpringConfig

在这里插入图片描述

OK,没问题

1.11.3 加载控制

先来个importselector 类

package com.dingjiaxiong.bean;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * ClassName: MyImportSelector
 * date: 2022/10/25 10:38
 *
 * @author DingJiaxiong
 */

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.dingjiaxiong.bean.Cat"};
    }
}

修改配置类

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.MyImportSelector;
import org.springframework.context.annotation.Import;

/**
 * ClassName: SpringConfig
 * date: 2022/10/25 10:34
 *
 * @author DingJiaxiong
 */

@Import(MyImportSelector.class)
public class SpringConfig {
}

OK,再次运行

在这里插入图片描述

OK, 上来了,给Cat 加个id名

package com.dingjiaxiong.bean;

import org.springframework.stereotype.Component;

/**
 * ClassName: Cat
 * date: 2022/10/25 10:32
 *
 * @author DingJiaxiong
 */

@Component("tom")
public class Cat {
}

再次运行

在这里插入图片描述

假设一个场景,如果我的环境中有Mouse,那我就加载Cat

package com.dingjiaxiong.bean;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * ClassName: MyImportSelector
 * date: 2022/10/25 10:38
 *
 * @author DingJiaxiong
 */

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        try {
            Class<?> clazz = Class.forName("com.dingjiaxiong.bean.Mouse");

            if (clazz != null){ //说明加载上了老鼠
                return new String[]{"com.dingjiaxiong.bean.Cat"}; //有老鼠就加载猫
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

直接运行

在这里插入图片描述

所以猫出来了

如果 现在有狼,猫就不要加载了

package com.dingjiaxiong.bean;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * ClassName: MyImportSelector
 * date: 2022/10/25 10:38
 *
 * @author DingJiaxiong
 */

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        try {
            Class<?> clazz = Class.forName("com.dingjiaxiong.bean.Wolf");

            if (clazz != null){ 
                return new String[]{"com.dingjiaxiong.bean.Cat"}; 
            }
        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
            return new String[0];
        }
        return null;
    }
}

在这里插入图片描述

可以看到这次就没有加载猫

又改成老鼠

在这里插入图片描述

这样又出来了,现在我们就可以根据自己的需要来控制某个bean 的加载与否了

回顾一下

根据任意条件确认是否加载bean

在这里插入图片描述

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

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

相关文章

[附源码]Python计算机毕业设计高校辅导员工作管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

现代密码学导论-15-多明文加密

目录 3.4更强的安全观念 3.4.1 多明文加密安全 多消息窃听实验 DEFINITION 3.18 多明文加密下的不可区分性 PROPOSITION 3.19 定义3.18强于定义3.8的事实证明 PROPOSITION 3.19 的证明 概率加密的必要性 THEOREM 3.20 3.4更强的安全观念 到目前为止&#xff0c;我们一…

MySQL 慢查询日志 使用方法浅析 日志定位与优化技巧

目录 前言 1、如何开启使用慢查询日志&#xff1f; 1.1 开启慢查询日志 1.2 设置慢查询阈值 1.3 确定慢查询日志的文件名和路径 1.3.1 查询MySQL数据目录 1.3.2 查询慢查询日志文件名 1.3.3 查询全局设置变量 1.3.4 查询单个变量命令 1.3.5 其他注意事项 2、如何定位并优…

备战2023蓝桥国赛-重新理解Prim和Kruskal算法

备战2023蓝桥国赛-重新理解Prim和Kruskal算法Prim算法Kruskal算法Prim算法 题目描述&#xff1a; 解析&#xff1a; prim算法跟dijkstra的朴素解法有很多相像部分&#xff0c;他们都是枚举中继节点来更新下一个节点&#xff0c;都是选最小的dist值来更新&#xff0c;时间复杂…

【线性表】—动态顺序表的增删查改实现

小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan&#xff08;所有的原码都放在了我上面的gitee仓库里&#xff09; 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努…

【网页设计】期末大作业html+css(动漫网站)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【机器学习项目实战10例】(十):DataCastle-租金预测

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、DataCastle-租金预测二、数据集介绍三、导入相关库四、读取数据五、删除缺失值过多的列六、填补缺失数据七、特征编码八、简单跑一下九、可视化数据分布9.1 箱线图9.2 直方图和Q-Q图一、DataCastle-租金预测 本项目任务…

【ASM】字节码操作 工具类与常用类 AnalyzerAdapter 工作原理

文章目录 1.概述2.xx3.工作原理3.1初始状态3.2中间状态3.2.1顺序执行3.2.2发生跳转.2.3特殊情况: new对象3.3结束状态4.示例:打印方法的Frame4.2 编码实现5.总结1.概述 在上一篇文章: 【ASM】字节码操作 工具类与常用类 AnalyzerAdapter初步介绍 我们知道 AnalyzerAdapter 主…

Android开发java调用C简单示例

目录下载NDK和CMake新建NDK项目写入C代码&#xff0c;并运行本文使用的Android Studio版本是windows版Android Studio Bumblebee | 2021.1.1 Patch 2 先看下最终效果&#xff1a; 下载NDK和CMake 检查NDK和CMake是否已经下载了&#xff0c;这一步不难&#xff0c;具体步骤就…

工业动态界面设计 GLG Toolkit 4.2 Crack-GlgCE.4.2_x64

GLG Toolkit是为开发高级图形的动态界面而设计的框架&#xff1a;不只是简单的按钮和选单&#xff0c;而且是完全动画的图形对象&#xff0c;它能够显示动态数据和作出与用户交互的反应。它不仅是一个能够创建很多“漂亮的图片”绘图工具&#xff0c;而且它的图形引擎允许开发人…

Spring Boot 使用Docker构建运行

Docker 容器化 Spring Boot 应用 在应用容器化、容器编排大行其道的当下。今天来学习下如何使用Docker技术打包、构建、运行Spring Boot 应用程序&#xff0c;从最简单的Dockerfile开始&#xff0c;一步步的学习Docker 容器的使用过程。 Spring Boot 应用系统 创建项目 使用…

[足式机器人]Part3机构运动微分几何学分析与综合Ch02-3 平面机构离散运动鞍点综合——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch02-3 平面机构离散运动鞍点综合2.4 鞍滑点2.4.1 鞍线与二副连架杆P-R2.4.2 鞍线误差2.4.3 三位置鞍线2.4.4 四位置鞍线2.4 鞍滑点 在平面机构运动综合时&#xff…

实验七 循环神经网络(2)梯度爆炸实验

目录6.2 梯度爆炸实验6.2.1 梯度打印函数【思考】什么是范数&#xff0c;什么是L2范数&#xff0c;这里为什么要打印梯度范数&#xff1f;6.2.2 复现梯度爆炸现象6.2.3 使用梯度截断解决梯度爆炸问题【思考题】梯度截断解决梯度爆炸问题的原理是什么&#xff1f;6.2 梯度爆炸实…

基于遗传算法的风电储能蓄电池容量优化配置matlab优化程序

基于遗传算法的风电储能蓄电池容量优化配置 风电储能蓄电池微电网配置&#xff08;基于matlab的遗传算法微电网配置优化程序&#xff09; 参考文献&#xff1a;基于遗传算法的风电储能蓄电池容量优化配置 摘要&#xff1a;为了降低独立风力发电系统中储能装置的生命周期费用&a…

【数据物语系列】 漫谈数据分布可视化分析

【数据物语系列】 漫谈数据分布可视化分析 FesianXu 20221125 at Baidu Search Team 前言 在实际工作中&#xff0c;我们经常会遇到一堆数据&#xff0c;对数据的有效分析至为关键&#xff0c;而数据的分布就是一种非常重要的数据属性&#xff0c;需要通过合适的可视化手段进行…

【创建springboot-maven项目搭建mybatis框架】(超详细)

目录 1. 创建Spring Boot项目&#xff0c;相关参数 2. 创建数据库 3. 在IntelliJ IDEA中配置Database面板 4. 添加数据库编程的依赖 5. 关于Mybatis框架 6. Mybatis编程&#xff1a;插入相册数据 1. 创建Spring Boot项目&#xff0c;相关参数 项目名称&#xff1a;csmall…

[附源码]java毕业设计中小企业人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

javaEE飞机航班信息查询网站系统

本系统主要包含了订票管理、航班信息管理、站内新闻管理、活动信息管理、用户信息管理、留言等多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块&#xff1a;管理员登录系统后台对本系统其他管理模块进行管理。 添加管理员模块&#xff1a;向本系统中…

UE5笔记【十】第一个蓝图项目:bluePrint。

我们将上升的斜坡或者楼梯隐藏&#xff0c;往下移动&#xff0c;使其隐藏在地面以下。然后将方块也向下移动&#xff0c;漏出一点来。我们要模拟的场景是&#xff1a;当人移动到蓝色方块上时&#xff0c;踩在方块上&#xff0c;上升的楼梯升起来。然后人可以上楼。 将蓝色方块…

HTML静态网页作业——电影介绍-你的名字 5页 无js 带音乐

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…