Spring(十)AspectJ

AspectJ是一个面向切面的框架,他扩展了Java

使用AspectJ实现AOP有两种形式:

一种是通过注解,一种是通过XML

第一种:

接口

package demo19;

/**
 * Created by mycom on 2018/3/12.
 */
public interface IUserService {
    public void select();
    public void update();
    public void insert();
    public void delect();
}

实现类

package demo19;

/**
 * Created by mycom on 2018/3/12.
 */
public class UserServiceimpl implements IUserService {
    public void select() {
        /*int i=2/0;*/
        System.out.println("select  ok!");
    }

    public void update() {
        System.out.println("update  ok!");
    }

    public void insert() {
        System.out.println("insert  ok!");
    }

    public void delect() {
        System.out.println("delect  ok!");
    }
}

MyAspect类

package demo19;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * Created by mycom on 2018/3/12.
 */
@Aspect
public class MyAspect {
    @Pointcut(value = "execution(* demo19.*.update(..))")
    public void update(){

    }

    @Pointcut(value = "execution(* demo19.*.insert(..))")
    public void insert(){

    }


    @Before("execution(* demo19.*.insert(..))")
    public void myBefore(){
        System.out.println("before===");
    }

    /*@AfterReturning("execution(* demo19.*.select(..))")
    public void myAfter(){
        System.out.println("after===");
    }*/
    //环绕增强
    @Around("update()||insert()")
    public void myAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("before=====");
        joinPoint.proceed();
        System.out.println("after===");
    }

    @AfterThrowing(value = "execution(* demo19.*.select(..))",throwing = "error")
    public void myThrows(Exception error){
        System.out.println("出现异常了"+error);
    }

    @After("execution(* demo19.*.select(..))")
    public void myFinally(){
        System.out.println("最终增强");
    }
}

配置文件

<?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:p="http://www.springframework.org/schema/p"
       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/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
">
    <!--1.目标对象-->
    <bean id="service" class="demo19.UserServiceimpl"></bean>

    <!--2.增强/通知-->
    <bean id="beforeAdvice" class="demo19.MyAspect"></bean>

    <!--自动代理-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>

测试类

//Aspectj增强   基于注解版的增强
    @Test
    public void t3() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextAspectj.xml");
        IUserService service =(IUserService) context.getBean("service");
//        try {
//            service.select();
//        }catch (Exception  ex){
//            ex.printStackTrace();
//        }
//        service.delect();
        service.insert();
        service.update();
    }

 

第二种:

接口和实现类和上一种相同,MyAspect类不同

package demoAspectj;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Pointcut;

/**
 * Created by mycom on 2018/3/12.
 */
public class MyAspectj {
    // 前置通知
    public void before(){
        System.out.println("前置通知方法before()");
    }
    public void before(JoinPoint jp){
        System.out.println("前置通知方法before()jp="+jp);
    }

    // 后置通知
    public void afterReturing(){
        System.out.println("后置通知方法");
    }
    public void afterReturing(String result){
        System.out.println("后置通知方法 result = " + result);
    }


    // 环绕通知
    public void around(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("环绕通知方法,目标方法执行之前");
        // 执行目标方法
        Object result = pjp.proceed();
        System.out.println("环绕通知方法,目标方法执行之后");
    }

    // 异常通知
    public void afterThrowing(){
        System.out.println("异常通知方法");
    }


    // 最终通知
    public void after(){
        System.out.println("最终通知方法");
    }
}

配置文件

<?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:p="http://www.springframework.org/schema/p"
       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/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
">
    <!--1.目标对象-->
    <bean id="service" class="demoAspectj.UserServiceImpl"></bean>

    <!--2.增强/通知-->
    <bean id="myAspectj" class="demoAspectj.MyAspectj"></bean>


    <!-- aop配置 -->
    <aop:config>
        <aop:pointcut expression="execution(* demoAspectj.*.select(..))" id="doFirstPointcut"/>
        <aop:pointcut expression="execution(* demoAspectj.*.update(..))" id="doSecondPointcut"/>
        <aop:pointcut expression="execution(* demoAspectj.*.insert(..))" id="doThirdPointcut"/>
        <aop:aspect ref="myAspectj">
            <aop:before method="before" pointcut-ref="doFirstPointcut"/>
            <aop:after-returning method="afterReturing" pointcut-ref="doSecondPointcut"/>
            <aop:around method="around" pointcut-ref="doThirdPointcut" />
        </aop:aspect>
    </aop:config>


</beans>

测试方法

@Test
    public void t2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextAspect.xml");
        IUserService service =(IUserService) context.getBean("service");
        service.select();
        service.update();
        service.insert();
    }

 

posted @ 2018-03-12 21:54  明渃筱曦  阅读(138)  评论(0编辑  收藏  举报