`
jinnianshilongnian
  • 浏览: 21435357 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2405208
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997857
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631575
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257590
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593252
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248993
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847698
Group-logo
跟我学Nginx+Lua开...
浏览量:698206
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780544
社区版块
存档分类
最新评论

类继承/接口实现时Spring AOP切入点注意事项

阅读更多

最近好多人问我说我的我的切入点没有错误啊,怎么不起作用?而且大部分情况都是写AOP切入点时带有类继承或接口实现时出现的问题。在此总结一下,方便后人查阅。而且建议使用如IntelliJ IDEA、STS或者Eclipse装AspectJ插件自动显示切入点是否匹配目标对象/目标方法。

 

1、相关类

1.1、抽象基类

我们在写一些项目时,都会抽象一些基类,比如DAO、Service等。

 

//基础接口
package com.sishuok.common;
public interface BaseService {
    public void save();
}

//基础实现
package com.sishuok.common;
public abstract class BaseServiceImpl implements BaseService {
    @Override
    public void save() {
    }
}

 

 

1.2、实现类

 

//业务接口
package com.sishuok.user;
import com.sishuok.common.BaseService;
public interface UserService extends BaseService {
    public void saveUser();//额外添加的接口
}


//业务实现
package com.sishuok.user;
import com.sishuok.common.BaseService;
import com.sishuok.common.BaseServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends BaseServiceImpl implements UserService {
    @Override
    public void saveUser() {//此处只实现了业务接口,没有覆盖基础实现
    }
}

 

 

2、错误的切入点

2.1、"execution(* com.sishuok.user.UserService.*())"  如果这样写切入点,只能匹配到UserService实现类中的直接实现的方法。即只能匹配saveUser方法,而无法匹配save方法。当然你可以在UserServiceImpl中再覆盖下save方法也可以,但是这样基类就没有意义了。

2.2、”execution(* com.sishuok.user.UserServiceImpl.*())“ 如果想只对UserServiceImpl中的方法进行匹配,这样写也是和上边有一样的问题。

 

3、正确的切入点

3.1、"execution(* com.sishuok.common.BaseService+.*())"  或者"within(com.sishuok.common.BaseService+)" 或者"this/target(com.sishuok.common.BaseService)" 有朋友会想到,既然这样,反正是对BaseService的所有子类进行匹配,那么就可以按照上边的写法,即匹配BaseService的所有实现类。这样也是可以的。

3.2、"target(com.sishuok.user.UserServiceImpl) && execution(* *())" 这样即可匹配save和saveUser两个方法。

 

从以上可以总结出:要从基类开始匹配,或者使用target直接匹配具体类。

 

对于没有接口的,直接类继承实现的,可以参考https://github.com/zhangkaitao/es/tree/master/web/src/main/java/com/sishuok/es/extra/aop

 

相关Spring AOP问题:

 

5
0
分享到:
评论
4 楼 lanhuai 2013-12-20  
jinnianshilongnian 写道
lanhuai 写道
Spring研究的很深入了,加油

嘿嘿,你回天津了?


是呢,回来很久了
3 楼 jinnianshilongnian 2013-11-28  
lanhuai 写道
Spring研究的很深入了,加油

嘿嘿,你回天津了?
2 楼 lanhuai 2013-11-28  
Spring研究的很深入了,加油
1 楼 jinnianshilongnian 2013-11-24  
有任何相关问题 可以留言探讨

相关推荐

Global site tag (gtag.js) - Google Analytics