SpringBoot SpringBoot 原理篇 1 自动配置 1.5 proxyBeanMethod

news2025/8/9 9:10:23

SpringBoot

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

SpringBoot 原理篇

文章目录

      • SpringBoot
      • SpringBoot 原理篇
      • 1 自动配置
        • 1.5 proxyBeanMethod
          • 1.5.1 @ImportResource
          • 1.5.2 proxyBeanMethod

1 自动配置

1.5 proxyBeanMethod

1.5.1 @ImportResource

之前我们又完成了使用“工厂” 去创建bean 对象

现在有个新问题又来了

在这里插入图片描述

现在的加载方式,有xml 配置文件,也有配置类,如果说我现在有一个十年前写的程序,它是用的配置文件加载的bean, 但是现在要上新功能,用注解写的,如果不能修改配置文件,那咋办?【典型的系统迁移问题:如何在一个新的注解开发的项目中使用老的配置文件的方式?可以实现吗?】

【答案是当然的】

来一个新的配置类

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.DogFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;

/**
 * ClassName: SpringConfig32
 * date: 2022/10/24 13:40
 *
 * @author DingJiaxiong
 */


public class SpringConfig32 {
    
}

其实啥也没有

来一个新的运行类去加载32 这个配置类

package com.dingjiaxiong.app;

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

/**
 * ClassName: App3
 * date: 2022/10/24 13:42
 *
 * @author DingJiaxiong
 */

public class App32 {

    public static void main(String[] args) {

        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig32.class);

        String[] names = ctx.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        
    }

}

直接运行看看效果

在这里插入图片描述

OK,没啥问题

现在就来修改32 这个配置类,让它可以去加载到我们使用 xml 配置文件的方式做的bean

其实特简单,一个注解

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.DogFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;

/**
 * ClassName: SpringConfig32
 * date: 2022/10/24 13:40
 *
 * @author DingJiaxiong
 */

@ImportResource("applicationContext1.xml")
public class SpringConfig32 {

}

这是啥意思呢?就是说假定我们32 这个配置类还没写完,我现在就想拿xml 配置中的东西放到我们的配置类中

OK,直接运行

在这里插入图片描述

效果很明显,都上来了

这就是在现在的配置类中导入原始的配置文件的做法

回顾一下

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

在这里插入图片描述

1.5.2 proxyBeanMethod

之前我们提了一下,@Configuration 这个注解和 @Component 这个注解很像,但是是假的

看看两个注解的源码:

@Component :

在这里插入图片描述

@Configuration:

在这里插入图片描述

注意看这最后一个【研究一下】

再来一个新的配置类

package com.dingjiaxiong.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

/**
 * ClassName: SpringConfig33
 * date: 2022/10/24 13:40
 *
 * @author DingJiaxiong
 */

@Configuration
public class SpringConfig33 {

}

还是一个空壳

再来一个新的运行类

package com.dingjiaxiong.app;

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

/**
 * ClassName: App33
 * date: 2022/10/24 13:42
 *
 * @author DingJiaxiong
 */

public class App33 {

    public static void main(String[] args) {

        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig33.class);

        String[] names = ctx.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }

    }

}

直接运行看看效果

在这里插入图片描述

OK, 没啥问题

看看这个bean 的类型

System.out.println("=========================");
System.out.println(ctx.getBean("springConfig33"));

直接运行看看

在这里插入图片描述

这一串什么玩意儿

意思就是SpringConfig33 其实是一个代理对象

现在修改一下33 配置类

在这里插入图片描述

再次运行

在这里插入图片描述

效果很明显,那一串东西没了,就说明现在这个对象,已经不是一个代理对象了,就成了一个原始对象

【所以这玩意儿的作用是什么?】

我们在33 配置类中定义一个 bean

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.Cat;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

/**
 * ClassName: SpringConfig33
 * date: 2022/10/24 13:40
 *
 * @author DingJiaxiong
 */

@Configuration(proxyBeanMethods = false)
public class SpringConfig33 {

    @Bean
    public Cat cat(){
        return new Cat();
    }

}

直接再次运行

在这里插入图片描述

OK, 这没啥,上来了一个bean 对象

现在我们直接用33 这个配置类,去调用这个方法

package com.dingjiaxiong.app;

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

/**
 * ClassName: App33
 * date: 2022/10/24 13:42
 *
 * @author DingJiaxiong
 */

public class App33 {

    public static void main(String[] args) {

        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig33.class);

        String[] names = ctx.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }

        System.out.println("=========================");
        SpringConfig33 springConfig33 = ctx.getBean("springConfig33", SpringConfig33.class);
        System.out.println(springConfig33.cat());
        System.out.println(springConfig33.cat());
        System.out.println(springConfig33.cat());

    }

}

调了三次,而且把proxyBeanMethods 属性值改为了 true

直接运行看看

在这里插入图片描述

可以看到,就是普通的bean对象,而且是单例的,即同一个对象

如果改成false

在这里插入图片描述

好家伙,很明显,现在就不是单例的了【就成了完全不同的三个对象】

意思就是如果proxyBeanMethods 属性为true,我们在运行对应的方法时,这个方法如果曾经在Spring 容器中加载过bean,那么我们再调,就是直接从容器中去拿了,而不是重新创建

如果属性值为false【不创建代理对象】,就是使用当前类对象去执行它里面的方法,所以才有了三个不同的cat 对象【这就是true 和 false 的区别】

【默认是true,即创建代理对象】

看懂了这个,就可以解释我们前面遇到过的一个事情,学mq 的时候

在这里插入图片描述

我把这个注解一关,下面的东西就不能用了,但是我一开

在这里插入图片描述

因为proxyBeanMethods 属性默认为true,所以这就保证了我们每次都操作的 是同一个队列

如果我明着写成配成false

在这里插入图片描述

这样就绑不对了,压根儿都不是同一个了

OK,差不多就是这样

回顾一下

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

在这里插入图片描述

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

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

相关文章

Qt使用QAudioInput、QAudioOutput实现局域网的音频通话

本文旨在介绍一下用Qt来实现局域网音频通话功能 技术实现 QAudioInput、QAudioOutput(Qt采集和播放音频类) QUdpSocket(Qt的UDP通信类) 话不多说,直接上代码链接,想下载的朋友可以直接去gitee下载。 整体…

项目管理范围(上)

范围管理概述 产品范围与项目范围的区别: 产品范围是指产品或者服务所应该包含的功能,项目范围是指为了能够交付产品,项目所必须做的工作。 什么是WBS? 工作分解结构(简称WBS, Work Breakdown Structure…

科学孕育:婴幼儿食物过敏怎么办?

近年来,食物过敏的发病率呈明显上升趋势,已成为危害儿童健康的全球性问题。据统计,我国儿童食物过敏的发病率为3%~10%[1]。其中,0~4岁婴幼儿和学龄前儿童食物过敏的发病率最高。婴儿过敏反复发生.具有湿疹和食物过敏史的婴儿易患哮…

热门Java IDE——MyEclipse的数据库和持久化支持

MyEclipse支持开发者使用Java EE、Spring、JPA、Hibernate和POJOs快速开发以数据库为中心的应用程序,通过使用JDBC标准和嵌入式Derby数据库的数十个数据库的连接器,开发人员可以快速启动并运行。从持久性到逆向工程,再到可视化ER模型&#xf…

JS if else语句详解

在正常情况下,JavaScript 脚本是按顺序从上到下执行的,这种结构被称为顺序结构。如果使用 if、else/if 或 switch 语句,可以改变这种流程顺序,让代码根据条件选择执行的方向,这种结构被称为分支结构。 if语句 if 语句…

【微信小程序】实现页面跳转功能

🏆今日学习目标:第十三期——实现页面跳转功能 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰预计时间:20分钟 🎉专栏系列:我的第一个微信小程序 文章目录前言实现效果事件如…

Unity3D占用内存太大怎么解决呢? -下

什么时候才是UnusedAssets?看一个例子: Object obj Resources.Load("MyPrefab"); GameObject instance Instantiate(obj) as GameObject; ......... Destroy(instance); 创建随后销毁了一个Prefab实例,这时候 MyPrefab已经没有被实际的物体…

传奇列表获取失败与登录器太老怎么解决

一.登录器列表读取失败,无法获取登录器远程列表解决方案 1.查看登陆器列表地址是否能正常访问,登陆器读取的列表地址都是一个txt文本格式。如下图: 例如:我们的列表为: http://域名/123.txt,我们把列表复制到浏览器中查看是否能正…

锐捷MPLS跨域方案C1实验配置

目录 配置IPv4的BGP邻居 配置PE之间的Vpnv4邻居 此时配置PE与CE设备对接命令 手工配置为PE地址分配标签 MPLS隧道——跨域解决方案C1、C2讲解_静下心来敲木鱼的博客-CSDN博客https://blog.csdn.net/m0_49864110/article/details/127634890?ops_request_misc%257B%2522requ…

使用backdrop-filter实现elementui官网的模糊滤镜效果的和毛玻璃效果

前置 element-ui官网有一个属性很好看,可以看到,当滚动的时候,文字会被显示白色带阴影背景 你可能有点印象,因为公交车的时候也是类似于这种效果 他们是怎么做的呢?我看到源码使用到了 backdrop-filterbackground-sizebackground-image就实现了,很少的属性,达到了不错的效果,…

鲲鹏devkit训练营——《锁长期等待》项目解析

《锁长期等待》项目解析 通过本次实验学习掌握性能分析工具,利用性能分析工具找出程序中加锁范围不合理的地方并解决 安装web端性能分析工具 获取性能分析工具软件包 1、登录远程服务器 获取鲲鹏性能分析工具软件包上传到远端服务器 2、安装性能分析工具 使用…

【Flink】基本转换算子使用之fliter、flatMap,键控流转换算子和分布式转换算子

文章目录一 Flink DataStream API1 基本转换算子的使用(1)flitera 使用匿名类实现b 使用外部类函数实现b 使用flatMap实现(2)flatMapa 使用匿名类实现b 使用匿名函数实现2 键控流转换算子(1) keyBy&#xf…

mysql InnoDB存储引擎的锁机制

目录 前言 1. 锁的分类 1.1 实现方式 1.2 锁的粒度 2. 查询操作加锁方式 2.1 一致性非锁定读 2.2 一致性锁定读 3. 锁的算法 4. 锁的升级 5. 死锁 6.总结 前言 锁机制的目的是最大程度提高数据库的并发访问,另一方面确保可以以一致的方式读取和修改数据。…

Camunda工作流引擎简记

本文转载自玩转Camunda之实战篇-赶紧收藏起来吧_哔哩哔哩_bilibili 其中部分内容,经过本人修改 一、工作流相关介绍 BPM(BusinessProcessManagement),业务流程管理是一种管理原则,通常也可以代指BPMS(BusinessProcessManagementSuite)&#…

火山引擎 DataTester 应用故事:一个A/B测试,将产品DAU提升了数十万

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 疫情让线下的需求大量转移到线上,催生出了远程办公、网络授课、线上健身等新的生态现象。如何更好地为用户服务,提升用户体验,成…

计算机的组成

文章目录五大部件1) 输入设备2) 存储器3) CPU(中央处理器)4) 输出设备五大部件 所有类型的计算机,其本质都是接收用户输入的原始数据,并将其加工、处理成对用户有用的数据,它们都支持执行如表 1 所示的 5 项基本操作。…

SpringCloud Sentinel 使用

哈喽~大家好,SpringCloud Sentinel 使用。 🥇个人主页:个人主页​​​​​ 🥈 系列专栏:【微服务】 🥉推荐专栏: JavaEE框架 目录 一、前言 1、什么是Sentinel&…

时间复杂度和空间复杂度【一学就会】

目录 🥇1.算法效率 🔎2.时间复杂度 📗2.1 大O渐进表示法 📘2.2 时间复杂度的练习(没有说明即最坏情况) 🔑3.空间复杂度 🌈如何评价一个代码呢?它的效率高不高&#…

美创科技发布数据安全综合评估系统|推进安全评估高效开展

数字化深入的今天,数据价值和风险相伴相生,让数据要素发挥更大价值,提高风险预见预判,数据安全评估日益紧迫和必要。《数据安全法》提出:“重要数据处理者应对其数据处理活动定期开展风险评估,并向有关主管…

精彩回顾|关系网络赋能银行数字化转型的应用与实践

本文是根据11月10日Galaxybase图创课堂:乘金融科技之风:关系网络赋能银行数字化转型的应用与实践整理,错过的小伙伴们可以观看回放:https://uao.so/pct862806 精彩回顾 近年,知识图谱的重要性和实际应用逐步呈上升趋…