spring-AOP-xml-实现aop方式快速入门-spring整个juint测试

 

 

 

---动态代理 jdk动态代理

jar文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>Spring</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring03-aop</artifactId>
    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <!--实现aop配置jar包-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>


    </dependencies>


</project>

--创建方法接口com.liuboss.proxy.jdk.TargetInterface

package com.liuboss.proxy.jdk;

public interface TargetInterface {
    public void save();
}

---实现接口方法com.liuboss.proxy.jdk.Target

package com.liuboss.proxy.jdk;

public class Target implements TargetInterface{
    public void save() {
        System.out.println("TargetInterface...save running");
    }
}

com.liuboss.proxy.jdk.Advice 创建前置对象和后置对象方法

package com.liuboss.proxy.jdk;

public class Advice {
    public void before(){
        System.out.println("before---前置增强");
    }
    public void after(){
        System.out.println("after---后置增强");
    }

}

---实现方法com.liuboss.proxy.jdk.ProxyText

package com.liuboss.proxy.jdk;

import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;

import java.lang.reflect.Method;

public class ProxyText {
    public static void main(String[] args) {
        //创建目标对象
        final Target target = new Target();
        //增强对象
        final Advice advice = new Advice();
        //返回值 就是动态生成的代理对象
        TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    //调用代理对象的任何方法
                    public Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {
                        Object invoke = method.invoke(target, objects);
                        advice.before();
                        advice.after();
                        return invoke;
                    }
                }
        );
        proxy.save();
    }

}

基于cglib 动态代理

--创建方法类com.liuboss.proxy.cglib.Target

package com.liuboss.proxy.cglib;


public class Target  {
    public void save() {
        System.out.println("TargetInterface...save running");
    }
}

--前置对象--后置对象方法

package com.liuboss.proxy.cglib;

public class Advice {
    public void before(){
        System.out.println("before---前置增强");
    }
    public void after(){
        System.out.println("after---后置增强");
    }
}

--测试类实现  动态代理com.liuboss.proxy.cglib.ProxyText

package com.liuboss.proxy.cglib;

import com.liuboss.proxy.jdk.TargetInterface;
import org.springframework.cglib.proxy.*;
import org.springframework.jndi.JndiObjectTargetSource;

import java.lang.reflect.Method;

public class ProxyText {
    public static void main(String[] args) {
        //创建目标对象
        final Target target = new Target();
        //增强对象
        final Advice advice = new Advice();
        //返回值 就是动态生成的代理对象 基于cglib
        //1.创建增强器
        Enhancer enhancer = new Enhancer();
        //2.创建父类(目标)
        enhancer.setSuperclass(Target.class);
        //3.设置回掉
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                advice.before();
                advice.after();
                Object invoke = method.invoke(target,objects);
                return invoke;
            }
        });
        //4.创建代理对象
        Target proxy = (Target) enhancer.create();
        proxy.save();

    }

}



---xml实现aop快速入门案例

创建接口com.liuboss.aop.TargetInterface

package com.liuboss.aop;

public interface TargetInterface {
    public void save();
}

---前置后置方法 com.liuboss.aop.MyAspect

package com.liuboss.aop;

public class MyAspect {
    public void before(){
        System.out.println("前值增强");
    }
    public void after(){
        System.out.println("后置增强");
    }

}

--创建接口实现方法com.liuboss.aop.Target

package com.liuboss.aop;

public class Target implements TargetInterface {
    public void save() {
        System.out.println("TargetInterface...save running");
    }
}

在spring配置文件中进行配置   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:p="http://www.springframework.org/schema/p"
       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.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">


    <!--配置目标对象-->
    <bean id="target" class="com.liuboss.aop.Target"/>
    <!--切面对象-->
    <bean id="myAspect" class="com.liuboss.aop.MyAspect">
    </bean>
    <!--配置织入,告诉spring哪些方法需要那些增强-->
    <aop:config>
        <!--声明切面-->
        <aop:aspect ref="myAspect">
            <!--切面,切点+通知|-->
            <aop:before method="before" pointcut="execution(public void com.liuboss.aop.Target.save())"/>
        </aop:aspect>
    </aop:config>


</beans>

---测试类中进行测试    测试采用juint方法测试 重点   

package com.liuboss.demo;

import com.liuboss.aop.TargetInterface;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
    @Autowired
    private TargetInterface target;

    @org.junit.Test
    public void test1() {
        target.save();
    }


}

---增加后置方法执行配置

<?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:p="http://www.springframework.org/schema/p"
       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.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">


    <!--配置目标对象-->
    <bean id="target" class="com.liuboss.aop.Target"/>
    <!--切面对象-->
    <bean id="myAspect" class="com.liuboss.aop.MyAspect">
    </bean>
    <!--配置织入,告诉spring哪些方法需要那些增强-->
    <aop:config>
        <!--声明切面-->
        <aop:aspect ref="myAspect">
            <!--切面,切点+通知|-->
            <!--<aop:before method="before" pointcut="execution(public void com.liuboss.aop.Target.save())"/>-->
            <aop:before method="before" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
            <aop:after-returning method="after" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
        </aop:aspect>
    </aop:config>


</beans>

---增加环绕方法进行测试

com.liuboss.aop.MyAspect

package com.liuboss.aop;

import org.aspectj.lang.ProceedingJoinPoint;

public class MyAspect {
    public void before(){
        System.out.println("前值增强");
    }
    public void after(){
        System.out.println("后置增强");
    }
    //ProceedingJoinPoint 正在执行的连接点-切点
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕前-增强");
        //添加切点方法
        Object proceed = pjp.proceed();
        System.out.println("环绕后-增强");
        return proceed;
    }

}

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:p="http://www.springframework.org/schema/p"
       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.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">


    <!--配置目标对象-->
    <bean id="target" class="com.liuboss.aop.Target"/>
    <!--切面对象-->
    <bean id="myAspect" class="com.liuboss.aop.MyAspect">
    </bean>
    <!--配置织入,告诉spring哪些方法需要那些增强-->
    <aop:config>
        <!--声明切面-->
        <aop:aspect ref="myAspect">
            <!--切面,切点+通知|-->
            <!--<aop:before method="before" pointcut="execution(public void com.liuboss.aop.Target.save())"/>-->
            <!--<aop:before method="before" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
            <aop:after-returning method="after" pointcut="execution(* com.liuboss.aop.*.*(..))"/>-->
            <aop:around method="around" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
        </aop:aspect>
    </aop:config>


</beans>

测试

package com.liuboss.demo;

import com.liuboss.aop.TargetInterface;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
    @Autowired
    private TargetInterface target;

    @org.junit.Test
    public void test1() {
        target.save();
    }


}

 

---

抛出异常增强  
package com.liuboss.aop;

import org.aspectj.lang.ProceedingJoinPoint;

public class MyAspect {
    public void before(){
        System.out.println("前值增强");
    }
    public void after(){
        System.out.println("后置增强");
    }
    //ProceedingJoinPoint 正在执行的连接点-切点
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕前-增强");
        //添加切点方法
        Object proceed = pjp.proceed();
        System.out.println("环绕后-增强");
        return proceed;
    }
    public void agterThrowing(){
        System.out.println("抛出异常增强。。。。。。");
    }

}

进行添加错误

package com.liuboss.aop;

public class Target implements TargetInterface {

    public void save() {
        int i=1/0;
        System.out.println("TargetInterface...save running");
    }
}

配置文件进行配置

<?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:p="http://www.springframework.org/schema/p"
       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.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">


    <!--配置目标对象-->
    <bean id="target" class="com.liuboss.aop.Target"/>
    <!--切面对象-->
    <bean id="myAspect" class="com.liuboss.aop.MyAspect">
    </bean>
    <!--配置织入,告诉spring哪些方法需要那些增强-->
    <aop:config>
        <!--声明切面-->
        <aop:aspect ref="myAspect">
            <!--切面,切点+通知|-->
            <!--<aop:before method="before" pointcut="execution(public void com.liuboss.aop.Target.save())"/>-->
            <!--<aop:before method="before" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
            <aop:after-returning method="after" pointcut="execution(* com.liuboss.aop.*.*(..))"/>-->
            <aop:around method="around" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
            <aop:after-throwing method="agterThrowing" pointcut="execution(* com.liuboss.aop.*.*(..))"/>
        </aop:aspect>
    </aop:config>


</beans>

测试

 

47p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值