• SSM-Spring-18:Spring中aspectJ的XML版


    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

    aspectJ的xml版是开发中最常用的:

    下面直接已案例入手,毕竟繁琐的日子不多了

    案例:两个接口,俩个实现类,一个实现增强的普通类

      ISomeService接口:

    package cn.dawn.day20aspectjxml;
    
    /**
     * Created by Dawn on 2018/3/8.
     */
    public interface ISomeService {
        public void insert();
        public void delete();
        public void select();
        public void update();
    }

      SomeServiceImpl类,上方类的实现类:

    package cn.dawn.day20aspectjxml;
    
    
    /**
     * Created by Dawn on 2018/3/8.
     */
    public class SomeServiceImpl implements ISomeService {
    
        public void insert() {
            System.out.println("insert ok");
        }
    
        public void delete() {
            System.out.println("delete ok");
    
        }
    
        public void select() {
            System.out.println("select ok");
    
        }
    
        public void update() {
            System.out.println("update ok");
        }
    }

      IBookService接口

    package cn.dawn.day20aspectjxml;
    
    /**
     * Created by Dawn on 2018/3/12.
     */
    public interface IBookService {
        public void selectAllBooks();
    }

      BookServiceImpl类,上面那个接口的实现类

    package cn.dawn.day20aspectjxml;
    
    /**
     * Created by Dawn on 2018/3/12.
     */
    public class BookServiceImpl implements IBookService {
        public void selectAllBooks() {
            System.out.println("selectbooks ok");
    
            int a=5/0;
            System.out.println(a);
        }
    }

      实现增强的普通类:

    package cn.dawn.day20aspectjxml;
    
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    
    /**
     * Created by Dawn on 2018/3/12.
     */
    public class MyAspectJ {
        /*最后增强,无论是否出现异常都会执行*/
        public void myAfter(){
            System.out.println("最终增强");
        }
        /*后置增强*/
        public void myAfterReturning(){
            System.out.println("后置增强");
        }
        /*前置增强*/
        public void myBefore(){
            System.out.println("前置增强");
        }
        /*前置增强,这种写法可以一会调用出切点表达式,在console打印出来:当然xml文件中另外需要配置一道*/
        public void myBefore1(JoinPoint jp){
            System.out.println("前置通知方法jp = " + jp);
        }
        /*异常增强*/
        public void myAfterThrowing(){
            System.out.println("异常增强");
        }
        /*环绕增强*/
        public void myAround(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("环绕增强前");
            pjp.proceed();
            System.out.println("环绕增强后");
        }
    
    }

      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: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">
        <!--要增强的对象-->
        <bean id="service" class="cn.dawn.day20aspectjxml.SomeServiceImpl"></bean>
        <bean id="bookservice" class="cn.dawn.day20aspectjxml.BookServiceImpl"></bean>
        <!--增强的内容-->
        <bean id="MyAspectJ" class="cn.dawn.day20aspectjxml.MyAspectJ"></bean>
        <!--aspectjxml的自动代理-->
        <aop:config>
            <aop:pointcut id="mypointcut1" expression="execution(* *..day20aspectjxml.*.select(..))"></aop:pointcut>
            <aop:pointcut id="mypointcut2" expression="execution(* *..day20aspectjxml.*.update(..))"></aop:pointcut>
            <aop:pointcut id="mypointcut3" expression="execution(* *..day20aspectjxml.*.select*(..))"></aop:pointcut>
            <aop:pointcut id="mypointcut4" expression="execution(* *..day20aspectjxml.*.delete(..))"></aop:pointcut>
            <aop:aspect ref="MyAspectJ">
                <aop:before method="myBefore" pointcut-ref="mypointcut2"></aop:before>
                <aop:before method="myBefore1(org.aspectj.lang.JoinPoint)" pointcut-ref="mypointcut2"></aop:before>
                <aop:after method="myAfter" pointcut-ref="mypointcut1"></aop:after>
                <aop:around method="myAround(org.aspectj.lang.ProceedingJoinPoint)" pointcut-ref="mypointcut4"></aop:around>
                <aop:after-throwing method="myAfterThrowing" pointcut-ref="mypointcut3"></aop:after-throwing>
                <aop:after-returning method="myAfterReturning" pointcut-ref="mypointcut1"></aop:after-returning>
            </aop:aspect>
        </aop:config>
    
    </beans>

      这儿的method方法中加了(参数)会报红,不需理会,一会执行没有错误就行

      写法的格式就是这样

      单测:

    package cn.dawn.day20aspectjxml;
    
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
     * Created by Dawn on 2018/3/3.
     */
    public class test20180312 {
        @Test
        /*aop代理工厂bean异常增强*/
        public void t01(){
            ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext-day20aspectjxml.xml");
            ISomeService service = (ISomeService) context.getBean("service");
            IBookService bookservice = (IBookService) context.getBean("bookservice");
    
            try {
                bookservice.selectAllBooks();
            }catch(Exception e){
                e.printStackTrace();
            }
            System.out.println("================观察==================");
            service.update();
            System.out.println("================观察==================");
            service.delete();
            System.out.println("================观察==================");
            service.select();
            System.out.println("================观察==================");
        }
    }

      繁琐的东西结束了

      我记得我的老师说过一句话,java核心,java能不死,能辉煌这么多年的原因就是Spring,学会Spring可以赚3000,如果你搞java不会Spring,你连3000都赚不到

      其中IOC(控制反转)值1000,AOP(面向切面编程)值2000,至此,3000块的东西讲的差不多了,aop也结束了,

      下面我还会继续更新博客,Spring的事物,JDBCTemplate,以及整合MyBatis,然后此Spring部分也就差不多完结了,以后有时间再补充更多关于Spring的知识点

  • 相关阅读:
    那些陌生的C++关键字
    从实现装饰者模式中思考C++指针和引用的选择
    单例模式(Singleton)
    命令模式(Command)
    抽象工厂模式(Abstract Factory)
    《Effective C++》读书摘要
    桥接模式(Bridge)
    适配器模式(Adapter)
    设计模式学习心得
    黑客常用WinAPI函数整理
  • 原文地址:https://www.cnblogs.com/DawnCHENXI/p/8550966.html
Copyright © 2020-2023  润新知