- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试找出如何在第三方Java类上的方法调用中添加缓存。我正在为我的应用程序使用Spring Boot。
我尝试使用此类来实现缓存工作。
package test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.CacheOperation;
import org.springframework.cache.interceptor.CacheProxyFactoryBean;
import org.springframework.cache.interceptor.CacheableOperation;
import org.springframework.cache.interceptor.NameMatchCacheOperationSource;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
@SpringBootApplication
@EnableCaching
@Configuration
public class MyApp {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(MyApp.class, args);
Greeter greeter = context.getBean(Greeter.class);
System.out.println(new Date() + " : " + greeter.getGreeting("Bob"));
System.out.println(new Date() + " : " +greeter.getGreeting("Fred"));
System.out.println(new Date() + " : " +greeter.getGreeting("Bob"));
System.out.println(new Date() + " : " +greeter.getGreeting("Fred"));
System.out.println(new Date() + " : " +greeter.getGreeting("Bob"));
System.out.println(new Date() + " : " +greeter.getGreeting("Fred"));
}
@Bean
public Greeter greeter() {
final NameMatchCacheOperationSource nameMatchCacheOperationSource = new NameMatchCacheOperationSource();
Collection<CacheOperation> cacheOperations = new HashSet<CacheOperation>();
cacheOperations.add(new CacheableOperation.Builder().build());
nameMatchCacheOperationSource.addCacheMethod("*", cacheOperations);
CacheProxyFactoryBean cacheProxyFactoryBean = new CacheProxyFactoryBean();
cacheProxyFactoryBean.setTarget(new MySlowGreeter());
cacheProxyFactoryBean.setProxyInterfaces(new Class[] {Greeter.class});
cacheProxyFactoryBean.setCacheOperationSources(nameMatchCacheOperationSource);
cacheProxyFactoryBean.afterPropertiesSet();
return (Greeter) cacheProxyFactoryBean.getObject();
}
interface Greeter {
String getGreeting(String name);
}
class MySlowGreeter implements Greeter {
public String getGreeting(String name) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello " + name;
}
}
}
Greeter.getGreeting(..)
的调用包装起来并返回缓存的结果(如果存在)。但是,不会进行缓存。
最佳答案
好吧,我有更多信息给您。但是首先,我想在上面的代码中解决一些问题。
1)第一个问题涉及在应用程序o.s.cache.interceptor.CacheProxyFactoryBean
类(即“ MyApp”)的“ greeter” @Bean
定义中使用@Configuration
。
每当您使用Spring的FactoryBeans
中的1个(例如CacheProxyFactoryBean
)或自己实现时,从@Bean
方法返回的是FactoryBean
本身,而不是FactoryBean
的乘积。因此,您将返回return factoryBean.getObject()
而不是FactoryBean
,就像这样...
@Bean
GreeterFactoryBean greeter() {
GreeterFactoryBean factoryBean = new GreeterFactoryBean();
factoryBean.set...
return factoryBean;
}
GreeterFactoryBean
实现
o.s.beans.factory.FactoryBean
。
FactoryBean
的乘积(例如[Singleton]
Greeter
实例)而不是
FactoryBean
本身,作为Spring容器中的“已定义” bean为此
@Bean
方法。如果未使用
@Bean
明确定义(例如
@Bean
),则bean的名称将是
@Bean("Greeter")
方法的名称。
FactoryBean
还实现了Spring的生命周期回调接口(例如
o.s.beans.factory.InitializingBean
或
o.s.beans.factory.DisposableBean
等),则Spring容器将知道在Spring容器的初始化过程中的“适当”时间调用这些生命周期回调。
CacheProxyFactoryBean.afterPropertiesSet()
定义内调用
CacheProxyFactoryBean.getObject()
或
@Bean
。这样做实际上违反了Spring容器的初始化约定,因此您可能会遇到过早的“初始化”问题,尤其是如果提供的
FactoryBean
实现了其他Spring容器接口(例如
BeanClassLoaderAware
或
EnvironmentAware
等),则尤其如此。 )。
Greeter
)时,以上使用的方法才适用。
TestConfigurationOne
实际上与您采用的相同方法
5.0.1.RELEASE
)。
CacheProxyFactoryBean
一起使用,我需要
extend the CacheProxyFactoryBean
class。除了
extending和
CacheProxyFactoryBean
之外,我还需要对
implement和
SmartInitializingSingleton
interface进行
BeanFactoryAware
interface,其原因很快就会显现出来。有关
9,请参见
complete implementation。
o.s.cache.interceptor.CacheProxyFactoryBean
是
o.s.cache.interceptor.CacheInterceptor
的
making use。它还将“初始化”此
CacheInterceptor
实例
here和
here。但是,由于
CacheInterceptor
也通过
implements
SmartInitializingSingleton
间接地
extending
CacheAspectSupport
接口,所以这还不能完成初始化。如果从未调用
SmartInitializingSingleton
实现的
CacheInterceptor.afterSingletonsInstantiated()
method,则永远不会触发
initialized
bit,并且不会执行任何可缓存的操作
will not be cached,从而导致
cacheable operation being invoked every single time(因此,忽略任何引入的缓存行为)。
CacheProxyFactoryBean
扩展到
capture“ mainInterceptor”(即
CacheInterceptor
),然后在Spring容器的初始化阶段的适当时候调用
afterSingletonsInstantiated()
method的确切原因,这就是为什么我的
SmartCacheProxyFactoryBean
扩展实现
SmartInitializingSingleton
委托给
CacheInterceptor.afterSingletonsInstantiated()
方法的原因。
CacheInterceptor
是
BeanFactoryAware
,而
requires是Spring
BeanFactory
来执行其功能,因此,我检查此“ mainInterceptor”并适当设置
BeanFactory
的原因是
here。
TestConfigurationTwo
。
CacheInterceptor
),是从
@Bean
定义方法“ cacheInterceptor”返回的,该方法允许Spring容器适当地调用生命周期回调。
Greeter
”)。
cacheInterceptor
” bean定义创建的bean传递到“
greeter
” bean定义
like so。如果要从bean“
cacheInterceptor
” bean定义中调用“
greeter
” bean定义方法,就像许多用户不恰当地执行(
for example)一样,那么您将放弃Spring容器生命周期回调!不要这样!
here说明了其原因。
ProgrammaticCachingWithSpringIntegrationTests
”)。随时尝试使用它,如果您有任何后续问题,请告诉我。
关于java - 如何使用Java Config手动添加Spring CacheInterceptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47665485/
我已经实现了一个自定义的 CacheInterceptor,它允许通过通配符逐出缓存: public class CustomCacheInterceptor extends CacheInterce
在全局配置缓存后,如 docs ,如果我在 app.module 之外使用 CacheInterceptor,它会抛出错误。 app.module.ts const cacheConfig = {
我正在尝试找出如何在第三方Java类上的方法调用中添加缓存。我正在为我的应用程序使用Spring Boot。 我尝试使用此类来实现缓存工作。 package test; import org.spri
我已经尝试了下面的代码,但是它不起作用: @Component @Aspect @Order(Integer.MAX_VALUE) public class CacheAspect { @Ar
我是一名优秀的程序员,十分优秀!