@Configuration(proxyBeanMethods = false)

news/2024/10/31 0:31:25/

结论:标注@Configuration(proxyBeanMethods = false)注解的配置类,类中被@Bean标注的方法将不会被spring通过CGLB代理,但是spring容器中还是有这个bean的,在spring容器中获取的bean(getBean()、@Autowired等方式获取)还是单例的,但是你通过直接调用方法,获取到的就会是一个新的bean

(1)先看 proxyBeanMethods = true (默认是true)的情况

java">@Configuration(proxyBeanMethods = true)
public class RedisConfig {@Bean("redisTemplate")public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);// key 的 String 序列化采用 StringRedisSerializerStringRedisSerializer stringRedisSerializer = new StringRedisSerializer();template.setKeySerializer(stringRedisSerializer);template.setHashKeySerializer(stringRedisSerializer);// 使用 FastJsonRedisSerializer 来序列化和反序列化redis 的 value的值FastJsonRedisSerializer<Object> serializer = new FastJsonRedisSerializer<>(Object.class);FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setCharset(StandardCharsets.UTF_8);serializer.setFastJsonConfig(fastJsonConfig);template.setValueSerializer(serializer);template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;}
}
java"> @Autowiredprivate RedisTemplate<Object, Object> redisTemplate;@Autowiredprivate ApplicationContext applicationContext;@AutowiredRedisConnectionFactory redisConnectionFactory;@GetMapping("/sec")public void secKill() {System.out.println("spring容器中获取=====>" + redisTemplate);RedisConfig bean = applicationContext.getBean(RedisConfig.class);System.out.println( "spring容器中获取=====>" + bean);RedisTemplate<Object, Object> objectObjectRedisTemplate = bean.redisTemplate(redisConnectionFactory);System.out.println( "调用方法获取=====>" + objectObjectRedisTemplate);}

结果:

java">spring容器中获取=====>org.springframework.data.redis.core.RedisTemplate@1306c4b0
spring容器中获取=====>com.example.simplejobdemo.config.RedisConfig$$SpringCGLIB$$0@3410f434
调用方法获取=====>org.springframework.data.redis.core.RedisTemplate@1306c4b0
spring容器中获取=====>org.springframework.data.redis.core.RedisTemplate@1306c4b0
spring容器中获取=====>com.example.simplejobdemo.config.RedisConfig$$SpringCGLIB$$0@3410f434
调用方法获取=====>org.springframework.data.redis.core.RedisTemplate@1306c4b0
spring容器中获取=====>org.springframework.data.redis.core.RedisTemplate@1306c4b0
spring容器中获取=====>com.example.simplejobdemo.config.RedisConfig$$SpringCGLIB$$0@3410f434
调用方法获取=====>org.springframework.data.redis.core.RedisTemplate@1306c4b0

(2)将proxyBeanMethods = true 由 true 改成false

结果:

java">spring容器中获取=====>org.springframework.data.redis.core.RedisTemplate@2bc37a0a
spring容器中获取=====>com.example.simplejobdemo.config.RedisConfig@b18f3e8
调用方法获取=====>org.springframework.data.redis.core.RedisTemplate@7eb173e6
spring容器中获取=====>org.springframework.data.redis.core.RedisTemplate@2bc37a0a
spring容器中获取=====>com.example.simplejobdemo.config.RedisConfig@b18f3e8
调用方法获取=====>org.springframework.data.redis.core.RedisTemplate@4fbb2cfd
spring容器中获取=====>org.springframework.data.redis.core.RedisTemplate@2bc37a0a
spring容器中获取=====>com.example.simplejobdemo.config.RedisConfig@b18f3e8
调用方法获取=====>org.springframework.data.redis.core.RedisTemplate@68627132

可以看出从Spring容器中获取的依旧是单例Bean,而通过方法获取的是多实例的


http://www.ppmy.cn/news/1543225.html

相关文章

SpringBoot的自动装配原理详解

详细地探讨 Spring Boot 的自动装配原理&#xff0c;包括其工作机制、内部实现、示例代码以及最佳实践。 1. 什么是自动装配 自动装配是 Spring Boot 的核心功能之一&#xff0c;旨在根据项目的依赖和配置自动配置 Spring 应用的 Beans&#xff0c;避免繁琐的手动配置。这种机…

软件性能测试有哪些方法?上海软件测试中心分享

软件的性能是该软件的一种非功能性&#xff0c;关注的不是软件能否完成特定功能&#xff0c;而是在完成该功能时所展现出的及时性。软件性能是衡量某项工作完成效果的一个重要因素&#xff0c;也是衡量软件质量的重要指标之一&#xff0c;因此软件性能测试十分重要。软件性能测…

Three.js Shader 与自定义材质—深入理解与应用

开发领域&#xff1a;前端开发 | AI 应用 | Web3D | 元宇宙 技术栈&#xff1a;JavaScript、React、ThreeJs、WebGL、Go 经验经验&#xff1a;6 年 前端开发经验&#xff0c;专注于图形渲染和 AI 技术 开源项目&#xff1a;github 晓智元宇宙、数字孪生引擎、前端面试题 大家好…

「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用

在鸿蒙应用开发中,Image 组件用于加载和显示图片资源,并提供多种属性来控制图片的显示效果和适配方式。本篇将带你学习如何在鸿蒙应用中加载本地和远程图片、设置图片样式以及实现简单的图片轮播功能。 关键词 Image 组件图片加载本地资源远程图片图片轮播一、Image 组件基础…

【Linux】 su 和 sudo 的区别剖析

目录 一、概述 二、su 命令介绍及主要用法 2.1 参数- 2.2 切换到指定用户 2.3 参数-c 三、sudo 命令介绍及主要用法 3.1 主要用法 3.2 sudo 工作原理 四、二者的差异对比 一、概述 Linux 中新建用户的命令是 useradd &#xff0c;一般系统中这个命令对应的路径都在 PA…

Linux初阶——线程(Part1)

一、线程概念 1、如何理解线程 说到线程&#xff0c;那么我们就要回到进程了。 1.1. 再谈进程 对一个进程来说&#xff0c;它在内存中是这样的&#xff1a; 图1.1-a 其中一个 task_struct 独享一个进程地址空间和一个页表。 而线程其实和进程差不多&#xff0c;是这样的&…

Go 语言的函数参数传递

在编程中,函数参数的传递是一个基本概念,它决定了函数如何接收输入并如何影响原始数据。Go 语言以其简单明了的语法和高效的性能受到开发者的喜爱,而其参数传递机制在这方面尤为重要。本文将详细探讨 Go 语言中的参数传递方式,包括值传递、引用传递、可变参数和实际应用示例…

【Python数据分析系列】json.loads和json.dumps的用法和区别(案例+源码)

这是我的第370篇原创文章。 一、引言 json.loads 和 json.dumps 是 Python 标准库 json 模块中的两个函数&#xff0c;用于处理 JSON 格式数据。 二、实现过程 2.1 json.loads() json.loads&#xff1a;将 JSON 格式的字符串&#xff08;即 JSON 对象的文本表示&#xff09;转…