本方法适用于main()方法调用,但是web环境的解决方案应该差不多。
首先在spring-config.xml中加入如下代码:
<context:load-time-weaver />
<context:component-scan base-package="xin.uply.dao"/>
<cache:annotation-driven cache-manager="cacheManager" mode="aspectj"/>
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="defalut"/>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="users"/>
</set>
</property>
</bean>
注意<cache:annotation-driven cache-manager="cacheManager" mode="aspectj"/>中的mode属性。
然后在JVM configuration中加入:
-javaagent:E:\repo\org\springframework\spring-instrument\5.0.5.RELEASE\spring-instrument-5.0.5.RELEASE.jar
-javaagent:E:\repo\org\aspectj\aspectjweaver\1.8.13\aspectjweaver-1.8.13.jar
记得要加两个。
最后在类路径下放/META-INF/aop.xml,如下:
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
<weaver options="-verbose -showWeaveInfo">
<include within="xin.uply.mixdao.UserService"/>
</weaver>
</aspectj>
测试代码如下:
public User getUserById2(String userId) {
return getUserById(userId);
}
@Cacheable(cacheNames={"users"})
public User getUserById(String userId) {
System.out.println("real query user" + userId);
return hibernateTemplate.get(User.class, userId);
}
main方法调用:
public static void main(String[] args) throws IOException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc-config.xml");
UserService userService = (UserService)ctx.getBean("userService");
System.out.println("1");
userService.getUserById2("somebody");
System.out.println("2");
userService.getUserById2("somebody");
}