写了个切面, 如果切点定义声明在Controller上面的方法,这对应的通知能够执行, 如果不是Controller直接调用的则通知无法执行.
切面声明:
@Aspect
@Component
public class SessionAspect {
@Pointcut("execution(* cn.test.service.impl.ShopServiceImpl.myShops(..))")
private void myShops() {
}
@Pointcut("execution(* cn.test.service.impl.ShopServiceImpl.test(..))")
private void test() {
}
@Before("myShops()")
public void doBefore() {
System.out.println("hello");
}
@Before("test()")
public void doBefore() {
System.out.println("test");
}
}
controller 的方法
@RequestMapping(value = "/my", method = RequestMethod.GET)
public Object myShops(String userSid, ModelMap result) {
return this.shopService.myShops(userSid);
}
因为myShops在controller中直接调用, 通知能够触发执行, 打印出hello, 而test方法没有在controller中显示调用, 所有即便执行了test方法也不会通知也没有被触发执行.
基于Spring MVC.
Spring AOP
只对Bean
进行代理,如果你的实例不是从Spring
获取来的Bean
But it cannot be proxied if it is instantiated by itself.