SpringBoot SpringBoot 原理篇 1 自动配置 1.5 proxyBeanMethod
创始人
2024-02-14 00:06:53
0

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 {@Beanpublic 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可以保障调用此方法得到的对象是从容器中获取的而不是重新创建的

在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...