@EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)
@EnableCaching
public class StartupApplication { }
@Service
public class AccountService {
@Cacheable(cacheNames = "accountsActivated", sync = true)
public List<AccountDto> retrieveActivatedCacheable() { }
public AccountDto retrieveActivatedByName(String name) {
// 这里 call retrieveActivatedCacheable() 不会从缓存中查询
}
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public class AccountService
@Autowired
private AccountService self;
@Cacheable(cacheNames = "accountsActivated", sync = true)
public List<AccountDto> retrieveActivatedCacheable() { }
public AccountDto retrieveActivatedByName(String name) {
self.retrieveActivatedCacheable().....
java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class demo.usul.dto.AccountDto (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; demo.usul.dto.AccountDto is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @5d339696)
--add-opens=java.base/java.time=ALL-UNNAMED
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
1
leo97 2023-10-17 04:54:41 +08:00 via Android
|
2
wenbinwu 2023-10-17 05:04:09 +08:00 1
> 最终方案,业务关联性强,放不同类没意义
虽然这么说,可整一个 CachedAccountService 放所有 cached 方法不就完了 搁这事死磕浪费时间干啥 |
3
wenbinwu 2023-10-17 05:23:12 +08:00
关于 aspectj-maven-plugin , 用 dev.aspectj 的 https://github.com/dev-aspectj/aspectj-maven-plugin#history
|
4
xuanbg 2023-10-17 07:05:41 +08:00
class java.util.LinkedHashMap cannot be cast to class
|
5
zjp 2023-10-17 08:55:44 +08:00 via Android
自己注入自己,或者从容器手动获取自己都可以,真没必要死磕
|
6
jakes 2023-10-17 09:00:29 +08:00 via iPhone
同意二楼。这是最简单最常用的方法,死磕范式没什么意义。
|
7
banmuyutian 2023-10-17 09:47:12 +08:00
self 加个 @Lazy 就可以了,再不行从 SpringContext 里拿
|
8
bleulucaswu OP @wenbinwu 试过这个 plugin ,花半天搞定了跟 lombok 兼容问题,找了个能支持 java17 的 aspectjrt runtime, 跑起来了,没用,不知道问题在哪... 所以我觉得这种 compile-time weaver 应该是最不推荐的方案
因为有空,就死磕了一下,没法子了,这问题超出我的能力范围了 |