zoukankan      html  css  js  c++  java
  • JavaEE---------Spring之AOP实现两种方式

    首先说明一下,两种方式是Annotation与XML


    先看Annotation实现办法

    在Spring配置文件中设置自动扫描和自动代理如下

    beans.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:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
               http://www.springframework.org/schema/aop
               http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
        <context:annotation-config />
        <!-- 自动扫描 -->
        <context:component-scan base-package="com.bq" />
        <!-- 自动代理 -->
        <aop:aspectj-autoproxy />
    
    </beans>

    被委托类(不太规范的命名)

    UserDAO.java

    package com.bq;
    
    import org.springframework.stereotype.Component;
    
    @Component("userDAO")
    public class UserDAO {
        
        public void add(){
            System.out.println("添加用户成功");
        }
        
        public void update(){
            System.out.println("更新用户成功");
        }
    }

    委托类

    MyInterceptor.java

    package com.bq;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    //切面和组合注解
    @Aspect
    @Component
    public class MyInterceptor {
        /*
         * 设置一个切入点,注意execution的语法, 它的意思是在com.bq包及子包当有任何返回类型的任何方法的任何参数执行时调用切面
         */
        @Pointcut("execution(public * com.bq..*.*(..))")
        public void myMethod() {
        };
    
        // 标记在切面之前执行
        @Before("myMethod()")
        public void before() {
            System.out.println("method before");
        }
    
        // 环绕切面执行
        @Around("myMethod()")
        public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("method around start");
            // 被委托的方法会在这个面执行
            pjp.proceed();
            System.out.println("method around end");
        }
    }

    测试类Index.java

    package com.bq;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Index {
    
        public static void main(String[] args) {
            ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("beans.xml");
            UserDAO userDAO = (UserDAO) cpx.getBean("userDAO");
            userDAO.add();
            userDAO.update();
        }
    }

    下面来看一下XML实现方式,这个比较常用

    修改配置文件beans.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:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
               http://www.springframework.org/schema/aop
               http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
        <context:annotation-config />
        <context:component-scan base-package="com.bq"/>
        <!-- 定义委托类即拦截器 -->
         <bean id="logInterceptor" class="com.bq.MyInterceptor"></bean>
         <!-- AOP配置标签 -->
        <aop:config>
            <!-- 标记一个切面,指定ref即拦截器对象 -->
            <aop:aspect id="logAspect" ref="logInterceptor">
                <!-- 切面上的两个方法,各自扫描各自的,它们 -->
                <aop:before method="before" pointcut="execution(public * com.bq..*.add(..))" />
                <aop:around method="aroundMethod" pointcut="execution(public * com.bq..*.update(..))"/>
            </aop:aspect>
        </aop:config>
    </beans>

    自定义委托类,不需要再要注解了

    package com.bq;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    public class MyInterceptor {
    
        public void before() {
            System.out.println("method before");
        }
    
        public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("method around start");
            pjp.proceed();
            System.out.println("method around end");
        }
    }

    UserDAO.java还是一样

    package com.bq;
    
    import org.springframework.stereotype.Component;
    
    @Component("userDAO")
    public class UserDAO {
        
        public void add(){
            System.out.println("添加用户成功");
        }
        
        public void update(){
            System.out.println("更新用户成功");
        }
    }

    测试类也一样

    Index.java

    package com.bq;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Index {
        
        public static void main(String [] args){
            ClassPathXmlApplicationContext cpx=new ClassPathXmlApplicationContext("beans.xml");
            UserDAO userDAO=(UserDAO) cpx.getBean("userDAO");
            userDAO.add();
            userDAO.update();
        }
    }

    慢慢再学习,Spring这个东西很好很强大

  • 相关阅读:
    合并区间
    编译与运行
    传递信息
    划分字母区间
    无重叠区间
    用最少数量的箭引爆气球
    根据身高重建队列
    二叉树展开为链表
    动态添加按钮
    基础知识
  • 原文地址:https://www.cnblogs.com/bq12345/p/3244332.html
Copyright © 2011-2022 走看看