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
点我下载
原文地址:https://www.cnblogs.com/sprinng/p/5581552.html