ThoughtWorks欧亚创新工作室JavaEE 学习专题技术干货

采用Annotation方式完成AOP示例

2017-11-17  本文已影响23人  小小蒜头

整个AOP的执行过程可简单的理解为:切入点(Pointcut)捕获一个对连接点(Joinpoint)的调用,将通知(Advice要我们做的事)加入到调用过程中。

看图原理

首先定义UserManager接口和实现类UserManagerImpl,我们这里只给出UserManager的例子。

UserManager

package cn.itcast.dao;

public interface UserManager {
    public void addUser(String username, String password);

    public void delUser(int userId);

    public String findUserById(int userId);

    public void modifyUser(int userId, String username, String password);
}

UserManagerImpl

package cn.itcast.dao.impl;

import cn.itcast.dao.UserManager;

public class UserManagerImpl implements UserManager {
    @Override
    public void addUser(String username, String password) {
        System.out.println("---------UserManagerImpl.add()--------");
    }

    @Override
    public void delUser(int userId) {
        System.out.println("---------UserManagerImpl.delUser()--------");
    }

    @Override
    public String findUserById(int userId) {
        System.out.println("---------UserManagerImpl.findUserById()--------");
        return "张三";
    }

    @Override
    public void modifyUser(int userId, String username, String password) {
        System.out.println("---------UserManagerImpl.modifyUser()--------");
    }
}

采用配置文件的方式:

1、 导入相应的Spring jar包。
2、将横切性关注的问题模块化,建立安全处理类。在SecurityHandler类中写我们的独立方法,也就是定义Advice(具体实现)。

package cn.itcast.spring;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

//2、将横切性关注点模块化,建立SecurityHandler.java
@Aspect
public class SecurityHandler {

    //第一个*,有无返回值;第二个*,以add开头的方法名。..表示0-n个参数
    @Pointcut("execution(* add*(..))")
    private void addAddMethod() {
        //该方法就只是一个标识,不进行调用
    }


    /*
     *这个advice通过addAddMethod()[不是真的方法调用]找到@Pointcut("execution(* add*(..))")注解
     *就知道到底应用到哪些方法(add*()),而且advice定义before
     * 就会在所有add方法之前进行调用
     * 定义的Advice,应用到哪些PointCut订阅的Joinpoint上
     */
    @Before("addAddMethod()")
    public void checkSecurity() {
        System.out.println("------checkSecrity--------");
    }
}

这里我们使用Annotation的方式,这样可以更直观的看到AOP的各个部分,当然记得在配置文件中启用AOP哦!读者也可以完全使用配置文件方式完成例子。

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

    <!-- @Aspect的注解没有启用,谁也不认识,这里启用Aspectj对Annotation的支持 -->
    <aop:aspectj-autoproxy/>

    <bean id="userManager" class="cn.itcast.dao.impl.UserManagerImpl"/>
    <bean id="securityHandler" class="cn.itcast.spring.SecurityHandler"/>

</beans>

在这里,我们看到了Aspect、Pointcut、Advice。剩下就是Joinpoint。相信读者已经知道它在哪啦!对,例子中UserManager类的addUser方法就是啦!

客户端Client调用代码

package cn.itcast.client;

import cn.itcast.dao.UserManager;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {
    public static void main(String[] args) {
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserManager userManager = (UserManager) factory.getBean("userManager");
        userManager.addUser("张三", "123");
    }
}
上一篇下一篇

猜你喜欢

热点阅读