spring aop
来源:互联网 发布:学西班牙语的软件 编辑:程序博客网 时间:2024/05/17 12:46
代理:
静态代理:(一个代理工具只能代理实现相同接口的目标对象)
接口:
publicinterface IUserManager {
publicvoid adduser();
publicvoid deleuser();
}
目标类:
publicclass UserManagerImplimplements IUserManager {
@Override
publicvoid adduser() {
System.out.println("add");
}
@Override
publicvoid deleuser() {
System.out.println("deleuser");
}
}
代理工具类:
publicclass UserManagerProxyimplementsIUserManager {
private IUserManagerusermanager;//需要一个接口类型一个成员属性
public UserManagerProxy() {
super();
}
public UserManagerProxy(IUserManager usermanager) {
super();
this.usermanager = usermanager;
}
@Override
publicvoid adduser() {
addlog();
usermanager.adduser();
}
@Override
publicvoid deleuser() {
}
publicvoid addlog(){
System.out.println("addlog");
}
}
使用:
IUserManager usermanagerproxy=new UserManagerProxy(newUserManagerImpl());
usermanagerproxy.adduser();
JDK动态代理:(一个代理工具可以代理多个目标对象)
JDK动态代理工具类:
publicclass ProxyClassimplements InvocationHandler {//实现InvocationHandler接口
private Objecttargetobject;//1.定义一个Object类型目标成员属性
public Object getproxyobject(Object targetobject){//2.提供返回目标代理对象的方法(参数为目标对象实例)
this.targetobject = targetobject;//
//返回一个代理对象
return Proxy.newProxyInstance(targetobject.getClass().getClassLoader(),targetobject.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[]args)
throws Throwable {
Object result = null;
if(method.getName().indexOf("add")>=0){
addlog();//加入执行的代码
result = method.invoke(targetobject, args); //调用目标对象方法
}else{
result = method.invoke(targetobject, args);
}
return result;
}
//需要添加的代码:横切性关注点
publicvoid addlog(){
System.out.println("addlog");
}
}
使用:
ProxyClass proxy =newProxyClass();//实例化生成代理对象的工具类
IUserManager usermanager = (IUserManager)proxy.getproxyobject(newUserManagerImpl());//获取目标对象代理对象
usermanager.adduser();//然后通过调用代理对象去调用目标的对象方法
System.out.println(usermanager.deleuser());
IUserTest usertest = (IUserTest)proxy.getproxyobject(new UserTestImpl());
usertest.addtest();
spring aop:
引入:
spring-framework-2.0-with-dependencies\lib\aspectj\aspectjrt.jar+
aspectjweaver.jar+
cglib-nodep-2.2.jar到工程中
aspectj注解形式:
定义一个切面类:
/**
* 定义切面类
*/
@Aspect
publicclass MyAspect {
@Before("addlog()")//将代码加入到addlog()切点之前
publicvoid addlogimpl(){
System.out.println("addlog");
}
/**
* 定义切点
*/
@Pointcut("execution(*com.etc.service.impl.UserServiceImpl.add*(..))")
publicvoid addlog(){}
@After("checkuser()")//将代码加入到checkuser()切点之后
publicvoid checkuserimpl(){
System.out.println("checkuser");
}
@Pointcut("execution(*com.etc.service.impl.UserServiceImpl.dele*(..))")
publicvoidcheckuser(){}
}
applicationContext.xml:
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean class="com.etc.util.MyAspect" /><!-- 注册切面类 -->
Aop配置形式:
切面类:
publicclass MyAspect {
publicvoid addlogimpl(){
System.out.println("addlog");
}
publicvoid checkuserimpl(){
System.out.println("checkuser");
}
}
applicationContext.xml配置:
<beanid="aspectclass"class="com.etc.util.MyAspect"/><!-- 注册切面类叫aspectclass -->
<aop:config><!--配置切面类中执行方法 -->
<aop:aspectref="aspectclass"><!—使用注册的切面 -->
<aop:pointcutexpression="execution(*com.etc.service.impl.UserServiceImpl.add*(..))"id="add"/><!--定义切点 -->
<aop:beforemethod="addlogimpl"pointcut-ref="add"/><!-- method:切面类中方法名 pointcut-ref配置切点的id属性-->
</aop:aspect>
</aop:config>
配置多个pointcut表达式
<aop:config><!--配置切面类中执行方法 -->
<aop:aspectref="aspectclass">
<aop:pointcutexpression="(execution(*com.etc.service.*.*.add*(..)))||(execution(* com.etc.service.*.add*(..)))"id="add"/><!--定义切点 -->
<aop:beforemethod="addlogimpl"pointcut-ref="add"/><!-- method:切面类中方法名 pointcut-ref配置切点的id属性-->
</aop:aspect>
</aop:config>
- AOP、Spring的AOP
- AOP--Spring AOP
- Spring AOP 嵌套AOP
- spring AOP
- Spring AOP
- Spring AOP
- spring aop
- Spring AOP
- spring AOP
- spring aop
- Spring aop
- Spring-AOP
- Spring AOP
- spring aop
- spring aop
- Spring AOP
- Spring AOP
- Spring Aop
- centOS下如何使用 中文输入法
- selenium webdriver 学习总结-元素定位
- Mahout 系列之----共轭梯度
- 【LeetCode题解】Single Number II
- 驳论读书无用之说
- spring aop
- AliasedResultTransformer hibernate的结果集转换
- 【Android】菜单功能的实现:弹出Popup菜单 以及小结
- 基于Solr的LBS(地理位置搜索)实现原理
- git使用详解
- spring 3.0 应用springmvc 构造RESTful URL 详细讲解
- Android应用开发之即时通信
- 一个数转化成1的最小步数
- Jenkins自动打tag报错