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>


原创粉丝点击