zoukankan      html  css  js  c++  java
  • spring AOP 的几种实现方式(能测试)

    我们经常会用到的有如下几种
    1、基于代理的AOP
    2、纯简单Java对象切面
    3、@Aspect注解形式的
    4、注入形式的Aspcet切面

    一、需要的java文件

    public class ChenLliNa implements Sleepable {  
          
        @Override  
        public void sleep() {  
            // TODO Auto-generated method stub  
            System.out.println("乖,该睡觉了!s");  
        }
        
        public void sleep2() {  
            // TODO Auto-generated method stub  
            System.out.println("乖,该睡觉了!2222");  
        }  
    }  
    public interface Sleepable {  
          
        /** 
         * 睡觉方法 
         * @author demo 
         * @version 2015年5月31日上午9:17:14 
         */  
        void sleep();  
    } 
    import java.lang.reflect.Method;
    
    import org.springframework.aop.AfterReturningAdvice;
    import org.springframework.aop.MethodBeforeAdvice;
    
    public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {  
          
        @Override  
        public void afterReturning(Object returnValue, Method method,  
                Object[] args, Object target) throws Throwable {  
             System.out.println("睡觉前要敷面膜");  
        }  
          
        @Override  
        public void before(Method method, Object[] args, Object target)  
                throws Throwable {  
            System.out.println("睡觉后要做美梦");  
        }  
      
    }  
    public class SleepHelper02 {  
        public void beforeSleep(){  
            System.out.println("睡觉前要敷面膜");  
        }  
        public void afterSleep(){  
            System.out.println("睡觉后要做美梦");  
        }  
    } 
    import org.aspectj.lang.annotation.AfterReturning;
    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 SleepHelper03 {      
          
        @Pointcut("execution(* *.sleep2(..))")  
        public void sleep2point(){}  
          
        @Before("sleep2point()")  
        public void beforeSleep(){  
            System.out.println("睡觉前要敷面膜dddd");  
        }  
          
        @AfterReturning("sleep2point()")  
        public void afterSleep(){  
            System.out.println("睡觉后要做美梦dd");  
        } 
    }

    二、application.xml

    <!--  applicationContext01.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">
    
        <!-- 创建一个增强 advice -->
        <bean id="sleepHelper" class="com.ideal.spdb.common.demo.SleepHelper" />
    
        <bean id="lina" class="com.ideal.spdb.common.demo.ChenLliNa" />
        <!-- 定义切点 匹配所有的sleep方法 -->
        <bean id="sleepPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
            <property name="pattern" value=".*sleep"></property>
        </bean>
    
        <!-- 切面 增强+切点结合 -->
        <bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
            <property name="advice" ref="sleepHelper" />
            <property name="pointcut" ref="sleepPointcut" />
        </bean>
    
        <!-- 定义代理对象 -->
        <bean id="linaProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="lina" />
            <property name="interceptorNames" value="sleepHelperAdvisor" />
            <!-- <property name="proxyInterfaces" value="com.tgb.springaop.service.Sleepable"/> -->
        </bean>
    
    </beans>
    <!-- applicationContext02.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">
    
        <!-- 创建一个增强 advice -->
        <bean id="sleepHelper" class="com.ideal.spdb.common.demo.SleepHelper" />
        <!-- 目标类 -->
        <bean id="lina" class="com.ideal.spdb.common.demo.ChenLliNa" />
    
        <!-- 配置切点和通知 -->
        <bean id="sleepAdvisor"
            class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
            <property name="advice" ref="sleepHelper"></property>
            <property name="pattern" value=".*sleep" />
        </bean>
    
        <!-- 自动代理配置 -->
        <bean
            class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
    </beans>
    <!-- applicationContext03.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:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    
        <!--扫描包 -->  
         <context:component-scan base-package="com.ideal.spdb.*.*" annotation-config="true"/>   
         <!-- ASPECTJ注解 -->  
         <aop:aspectj-autoproxy  proxy-target-class="true" />    
           
         <!-- 目标类 -->  
          <bean id="lina" class="com.ideal.spdb.common.demo.ChenLliNa"/>
    
    </beans>
    <!-- applicationContext04.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">
    
        <!-- 目标类 -->  
        <bean id="lina" class="com.ideal.spdb.common.demo.ChenLliNa"/>  
        <bean id ="sleepHelper" class="com.ideal.spdb.common.demo.SleepHelper02"/>  
          
        <aop:config>  
            <aop:aspect ref="sleepHelper">  
                 <aop:before method="beforeSleep" pointcut="execution(* *.sleep(..))"/>  
                 <aop:after method="afterSleep" pointcut="execution(* *.sleep(..))"/>  
            </aop:aspect>  
        </aop:config>  
    </beans>

    三、测试

    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.ideal.spdb.common.demo.ChenLliNa;
    import com.ideal.spdb.common.demo.Sleepable;
    
    public final class Boot {
    
        @Test
        public void test0() {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            FooService foo = (FooService) ctx.getBean("fooService");
            foo.getFoo("Pengo", 12);
            foo.setFoo("d", 1);
    
        }
    
    //    通过代理 
        @Test
        public void test1() {
            ApplicationContext ct = new ClassPathXmlApplicationContext("applicationContext01.xml");
    
            Sleepable sleeper = (Sleepable) ct.getBean("linaProxy");
    
            sleeper.sleep();
    
        }
    //    简答的java对象
        @Test
        public void test2() {
            ApplicationContext ct = new ClassPathXmlApplicationContext("applicationContext02.xml");
            
            Sleepable sleeper = (Sleepable) ct.getBean("lina");
            
            sleeper.sleep();
            
        }
    //    通过aspect注解 
        @Test
        public void test3() {
            ApplicationContext ct = new ClassPathXmlApplicationContext("applicationContext03.xml");
    
            ChenLliNa sleeper = (ChenLliNa) ct.getBean("lina");
    
            sleeper.sleep2();
        }
    //    通过apsect配置文件
        @Test
        public void test4() {
            ApplicationContext ct = new ClassPathXmlApplicationContext("applicationContext04.xml");
            Sleepable sleeper = (Sleepable) ct.getBean("lina");
    
            sleeper.sleep();
        }
    }

    四、环绕模式

    public class DefaultFooService implements FooService {
    
        public Foo getFoo(String name, int age) {
            try {
                new Thread().sleep(1000);
            } catch (Exception e) {
                
            }
            return new Foo(name, age);
        }
    
        @Override
        public Foo setFoo(String fooName, int age) {
            return null;
        }
    }
    public class Foo {
        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
    
        /**
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
    
        /**
         * @return the age
         */
        public int getAge() {
            return age;
        }
    
        /**
         * @param age the age to set
         */
        public void setAge(int age) {
            this.age = age;
        }
    
        private String name;
        private int age;
    
        public Foo(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
    }
    public interface FooService {
        Foo getFoo(String fooName, int age);
        Foo setFoo(String fooName, int age);
    }
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.springframework.util.StopWatch;
    public class SimpleProfiler {
    
        public void monit(ProceedingJoinPoint call) throws Throwable {
            StopWatch clock = new StopWatch();
            try {
                System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
                clock.start(call.toShortString());
                call.proceed();
                System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            } finally {
                clock.stop();
                System.out.println(clock.getLastTaskName());
                System.out.println(clock.getTotalTimeSeconds());
            }
        }
    }
    <!-- 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">
    
        <bean id="fooService" class="com.ideal.spdb.common.demo.DefaultFooService" />
    
        <bean id="profiler" class="com.ideal.spdb.common.demo.SimpleProfiler" />
    
        <aop:config>
            <aop:aspect ref="profiler">
                <aop:pointcut id="theExecutionOfSomeFooServiceMethod"
                    expression="execution(* com.ideal.spdb.*.*.*.*(..))" />
                <aop:around pointcut-ref="theExecutionOfSomeFooServiceMethod"
                    method="monit" />
            </aop:aspect>
        </aop:config>
    
    
    </beans>

    测试在上面的

    Boot -> method = test0
    点我下载
  • 相关阅读:
    HDU5732 Subway【树重心 树哈希】
    HDU6311 Cover【欧拉路径 | 回路】
    HDU6370 Werewolf 【基环内向树】
    HDU6321 Dynamic Graph Matching【状压DP 子集枚举】
    HDU6331 Problem M. Walking Plan【Floyd + 矩阵 + 分块】
    HDU6403 Card Game【基环树 + 树形DP】
    HDU5691 Sitting in Line【状压DP】
    Codeforces Round #650 (Div. 3)
    2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest
    Codeforces Round #649 (Div. 2)
  • 原文地址:https://www.cnblogs.com/sprinng/p/5581552.html
Copyright © 2011-2022 走看看