采用Annotation方式完成AOP示例

作者: 小小蒜头 | 来源:发表于2017-11-17 22:08 被阅读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");
        }
    }
    

    相关文章

      网友评论

        本文标题:采用Annotation方式完成AOP示例

        本文链接:https://www.haomeiwen.com/subject/jkqsvxtx.html