与 spring 框架中的提交有关https://github.com/spring-projects/spring-framework/commit/5aefcc802ef05abc51bbfbeb4a78b3032ff9eee3
初始化设置为从afterPropertiesSet()到afterSingletonsInstantiated()的后期阶段
简而言之:这可以防止缓存在 @PostConstruct 用例中使用时起作用。
更长的版本:这可以防止您使用的用例
在 methodB 上使用 @Cacheable 创建 serviceB
使用@PostConstruct 调用 serviceB.methodB 创建 serviceA
@Component public class ServiceA{ @Autowired private ServiceB serviceB; @PostConstruct public void init() { List<String> list = serviceB.loadSomething(); }
这导致 org.springframework.cache.interceptor.CacheAspectSupport 现在没有被初始化,因此没有缓存结果。
protected Object execute(CacheOperationInvoker invoker, Object target, Method method, Object[] args) {
// check whether aspect is enabled
// to cope with cases where the AJ is pulled in automatically
if (this.initialized) {
//>>>>>>>>>>>> NOT Being called
Class<?> targetClass = getTargetClass(target);
Collection<CacheOperation> operations = getCacheOperationSource().getCacheOperations(method, targetClass);
if (!CollectionUtils.isEmpty(operations)) {
return execute(invoker, new CacheOperationContexts(operations, method, args, target, targetClass));
}
}
//>>>>>>>>>>>> Being called
return invoker.invoke();
}
我的解决方法是手动调用初始化方法:
@Configuration
public class SomeConfigClass{
@Inject
private CacheInterceptor cacheInterceptor;
@PostConstruct
public void init() {
cacheInterceptor.afterSingletonsInstantiated();
}
这当然解决了我的问题,但除了被调用 2 次(1 次手动和 1 次按预期由框架调用)之外,它是否有副作用
我的问题是:“这是一个安全的解决方法吗,因为最初的提交者似乎只使用 afterPropertiesSet() 有问题”