Spring @Configuration和FactoryBean

考虑使用FactoryBean通过Spring配置文件定义缓存:
<cache:annotation-driven /><context:component-scan base-package='org.bk.samples.cachexml'></context:component-scan><bean id='cacheManager' class='org.springframework.cache.support.SimpleCacheManager'><property name='caches'><set><ref bean='defaultCache'/></set></property></bean><bean name='defaultCache' class='org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean'><property name='name' value='default'/></bean>

工厂bean ConcurrentMapCacheFactoryBean是一个依次负责创建Cache bean的bean。

我第一次尝试将此设置转换为@Configuration样式:

@Bean
public SimpleCacheManager cacheManager(){SimpleCacheManager cacheManager = new SimpleCacheManager();List<Cache> caches = new ArrayList<Cache>();ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean();cacheFactoryBean.setName('default');caches.add(cacheFactoryBean.getObject());cacheManager.setCaches(caches );return cacheManager;
}

但是,这没有用,原因是我在这里完全绕过了一些Spring bean生命周期机制。 事实证明,ConcurrentMapCacheFactoryBean还实现了InitializingBean接口,并在InitializingBean的'afterPropertiesSet'方法中对缓存进行了急切的初始化。 现在,通过直接调用factoryBean.getObject(),我完全绕过了afterPropertiesSet方法。

有两种可能的解决方案:
1.以与在XML中定义的相同方式定义FactoryBean:

@Bean
public SimpleCacheManager cacheManager(){SimpleCacheManager cacheManager = new SimpleCacheManager();List<Cache> caches = new ArrayList<Cache>();caches.add(cacheBean().getObject());cacheManager.setCaches(caches );return cacheManager;
}@Bean
public ConcurrentMapCacheFactoryBean cacheBean(){ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean();cacheFactoryBean.setName('default');return cacheFactoryBean;
}

在这种情况下,从@Bean方法返回一个显式的FactoryBean,Spring将负责在此bean上调用生命周期方法。

2.复制相关生命周期方法中的行为,在此特定实例中,我知道FactoryBean在afterPropertiesSet方法中实例化ConcurrentMapCache,我可以通过以下方式直接复制此行为:

@Bean
public SimpleCacheManager cacheManager(){SimpleCacheManager cacheManager = new SimpleCacheManager();List<Cache> caches = new ArrayList<Cache>();caches.add(cacheBean());cacheManager.setCaches(caches );return cacheManager;
}@Bean
public Cache  cacheBean(){Cache  cache = new ConcurrentMapCache('default');return cache;
}

将FactoryBean从xml转换为@Configuration时要记住的一点。

注意:
可以根据需要进行一页有效的测试:

package org.bk.samples.cache;import static org.hamcrest.MatcherAssert.assertThat;import static org.hamcrest.Matchers.equalTo;import java.util.ArrayList;import java.util.List;import java.util.Random;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.Cache;import org.springframework.cache.annotation.Cacheable;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean;import org.springframework.cache.support.SimpleCacheManager;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.stereotype.Component;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes={TestSpringCache.TestConfiguration.class})public class TestSpringCache {@Autowired TestService testService;@Testpublic void testCache() {String response1 = testService.cachedMethod('param1', 'param2');String response2 = testService.cachedMethod('param1', 'param2');assertThat(response2, equalTo(response1));}@Configuration@EnableCaching@ComponentScan('org.bk.samples.cache')public static class TestConfiguration{@Beanpublic SimpleCacheManager cacheManager(){SimpleCacheManager cacheManager = new SimpleCacheManager();List<Cache> caches = new ArrayList<Cache>();caches.add(cacheBean().getObject());cacheManager.setCaches(caches );return cacheManager;}@Beanpublic ConcurrentMapCacheFactoryBean cacheBean(){ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean();cacheFactoryBean.setName('default');return cacheFactoryBean;}}}interface TestService{String cachedMethod(String param1,String param2);}@Componentclass TestServiceImpl implements TestService{@Cacheable(value='default', key='#p0.concat('-').concat(#p1)')public String cachedMethod(String param1, String param2){return 'response ' + new Random().nextInt();}}

参考: all和其他博客中来自我们JCG合作伙伴 Biju Kunjummen的Spring @Configuration和FactoryBean 。


翻译自: https://www.javacodegeeks.com/2012/08/spring-configuration-and-factorybean.html

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

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

相关文章

cookie解决 未登录加入购物车 第一次访问弹出新手引导页面

浏览器携带cookie到服务器, 点击加入购物车-->后台检查-->是否登录(有没有sessionid) 没有登录--->secookie()返回给浏览器,把传递过来的商品id, 属性(多个属性逗号拼接),数量存起来,(序列号成字符串_不同属性用下划线拼接) 转载于:https://www.cnblogs.com/bj-tony/p…

REST + Spring Security会话问题

REST &#xff0c; 会话 ..等待。 REST应用程序中没有会话&#xff0c;对吗&#xff1f; 好吧&#xff0c;那是真的。 如果我们可以避免会议&#xff0c;我们应该这样做。 REST是无状态的 。 有关无状态性的主要问题是身份验证。 在通常的Web应用程序中&#xff0c;我们习惯于在…

程序猿果真有前端后端client吗

前端 后端 client DBA OP 程序猿有分这么细的吗?入行时候有区别. 殊途同归 吾道一以贯之, 假设作为程序猿不能领悟一贯, 则永远不清楚.转载于:https://www.cnblogs.com/blfbuaa/p/6970139.html

HarmonyOS硬件创新合作伙伴,【HarmonyOS】HarmonyOS智能硬件开发学习指南 - HDC2020

2020年9月10日&#xff0c;华为HarmonyOS 2.0版本正式官宣&#xff01;这一次&#xff0c;借助 HarmonyOS 全场景分布式系统和设备生态&#xff0c;将定义全新的硬件、交互和服务体验&#xff0c;打开焕然一新的全场景世界&#xff0c;不愧是HarmonyOS&#xff01; 那HarmonyOS…

处于RUNNABLE状态的Java线程未真正运行

最近&#xff0c;我在Java应用程序服务器安装上进行了分析/调整&#xff0c;以识别瓶颈并修复它们。 在此过程中&#xff08;调整&#xff09;&#xff0c;最常见的操作是在系统加载时检索许多线程转储。 请记住&#xff0c;重载&#xff08;在某些情况下&#xff09;可能会产生…

2.3 关系完整性

关系模型的完整性规则是对关系的某种约束条件。 也就是说关系的值随着时间变化时应该满足一些约束条件。 &#xff08;这些约束条件实际上是现实世界的要求。任何关系在任何时刻都要满足这些语义约束&#xff09; 关系模型中有三类完整性约束&#xff1a; 实体完整性 &#xff…

Android 颜色大全color.xml

使用方法&#xff1a; 将color.xml文件拷到res/values目录下后我们只需要R.xml文件名称.name名称就可以调用了(例如:R.color.red) <?xml version"1.0" encoding"utf-8"?><resources> <color name"white">#FFFFFF</color&…

鸿蒙系统华为论坛,2020中国汽车论坛上 华为三大鸿蒙车载OS系统

在今天的2020中国汽车论坛上&#xff0c;华为公布了三大鸿蒙车载OS系统&#xff0c;同时还宣布已经有大量合作伙伴基于鸿蒙OS进行开发。根据智能汽车解决方案BU总裁王军所说&#xff0c;这三大鸿蒙OS分别是——鸿蒙座舱操作系统HOS、智能驾驶操作系统AOS和智能车控操作系统VOS&…

只读ViewObject和声明性SQL模式

介绍 声明式SQL模式被认为是基于实体的视图对象的最有价值的优点之一。 在此模式下&#xff0c;根据UI中显示的属性在运行时生成VO的SQL。 例如&#xff0c;如果某个页面包含一个只有两列EmployeeId和FirstName的表&#xff0c;则查询将生成为“从Employees中选择Employee_ID&a…

android 360加固 例子,[原创]利用VirtualApp实现360加固的soHook简单例子

简单demo&#xff0c;为抛砖引玉吧&#xff01;360的加固我们先写一个最简单的so&#xff0c;带导出函数。这已经足够简单了&#xff0c;界面上打印这个值。运行起来就这样。简单的简直过分。好了&#xff0c;现在我们让360加固一下。拿下来自己签名下&#xff0c;安装好&#…

scrapy架构解析

转载于:https://www.cnblogs.com/tianboblog/p/6986695.html

华为怎么升级Android11,华为EMUI 11/安卓11升级名单曝光 快来看看你的手机是否支持...

华为EMUI 11/安卓11升级名单曝光 快来看看你的手机是否支持2020年02月10日 16:29作者&#xff1a;NJNR205文章出处&#xff1a;泡泡网原创分享2月10日消息&#xff0c;据外媒报道&#xff0c;华为将于今年3月份的华为开发者大会(HDC)上正式宣布新一代EMUI 11。众所周知&#xf…

Scala安装及开发环境搭建

最近想学习下scala&#xff0c;为后面转大数据做一些沉淀。 1. 首先保证jdk已经成功安装 2. 去官网下载scala安装程序 http://www.scala-lang.org/download/all.html 会列出不同的版本. 3. 安装scala 安装路径记得不要有空格否则可能会出现以下这种状况&#xff0c;还有&am…

简单利用HTTP中的PUT协议拿下SHELL

第一次用方法拿shell,之前遇到的都是没有写入权限的。 站太辣鸡&#xff0c;纯粹练手&#xff0c;就不打码了。 此次实战会用到的HTTP请求方法&#xff1a; OPTIONS&#xff0c;PUT&#xff0c;MOVE/COPPY * 战前准备 0x01 什么是OPTIONS方法&#xff1f; 此方法用于请求获得由…

JSF – PrimeFaces和休眠集成项目

本文介绍了如何使用JSF&#xff0c;PrimeFaces和Hibernate开发项目。 下面是一个示例应用程序&#xff1a; 二手技术&#xff1a; JDK 1.6.0_21 Maven的3.0.2 JSF 2.0.3 PrimeFaces 2.2.1 休眠3.6.7 MySQL Java连接器5.1.17 MySQL 5.5.8 Apache Tomcat 7.0 第1步&#xff1…

android q升级名单,华为升级 Android Q 机型名单敲定 阵容庞大

中关村在线消息&#xff1a;在 5 月份的谷歌 I/O 大会上&#xff0c;谷歌公布了一系列支持下一代安卓系统 Android Q 的机型。除了谷歌自家的 pixel 手机之外&#xff0c;还包括 9 款国产手机&#xff0c;其中华为 Mate20 Pro 成为华为首款支持原生安卓的机型。这也让华为手机的…

mvc UrlHelper

何谓Helper,其实就是在View中为了实现一些灵活功能而写的方法组。 其实ASP.NET MVC的View是Aspx的页面,本身可以声明定义方法,那为什么要有Helper呢&#xff1f; 其实无非是将界面与逻辑分离,而且Asp.net MVC也并不只支持Aspx一种View&#xff08;还可以扩展出来很多&#xff0…

Mockito –使用全局配置的SmartNull在NPE上提供更好的错误消息

编写Mockito参考卡后&#xff0c;我有机会仔细研究了Mockito不太流行但非常有用的功能。 其中一些过于先进或太稀少&#xff0c;无法在refcard中进行描述&#xff0c;因此应简短说明。 其中之一就是SmartNull。 当前&#xff0c;非空方法返回适用于已知类型&#xff08;例如&am…

java使用js引擎时,关于时间的问题getTime()获取为NAN的问题

在java中使用js引擎时&#xff0c;想要去获取两个时间的相差的天数&#xff0c;查找网上的办法&#xff1a; var beginMonth parseInt(beginTime.substring(6,8),10);//2016-05-17 18:51:33 var beginYear parseInt(beginTime.substring(1,5),10); var beginDate parseInt(b…

python——成语接龙小游戏

小试牛刀的简易成语接龙。 思路—— 1、网上下载成语字典的txt版本 2、通过python进行处理得到格式化的成语&#xff0c;并整理成字典&#xff08;python字典查找速度快&#xff09; 3、python程序&#xff0c;查找 用户输入的最后一个字和字典里首字一致的&#xff0c;放入列表…