• 设计模式(五) 注解方式实现AOP


    1.1、

        Aop  aspect object programming  面向切面编程

                        功能: 让关注点代码与业务代码分离!

                关注点,

                      重复代码就叫做关注点;

                切面,

                       关注点形成的类,就叫切面()

                       面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候往业务方法上动态植入“切面类代码”。

                切入点,

                      执行目标对象方法,动态植入切面代码。

                      可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类在运行的时候植入切面类代码。

    代码示例如下:

    UserDao  目标对象

    package com.murong.aop;
    
    import org.springframework.stereotype.Component;
    
    /**
     * 目标对象
     */
    @Component // 加入IOC容器
    public class UserDao
    {
        public void save()
        {
            System.out.println("-----核心业务:保存!!!------");
        }
    }

    Aop  切面类

    package com.murong.aop;
    
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    
    /**
     *切面类
     */
    @Component // 加入IOC容器
    @Aspect
    public class Aop
    {
        @Pointcut("execution(* com.murong.aop.UserDao.*(..))")//切入点
        public  void testPointCut(){
    
        }
        @Before("testPointCut()")
        public void begin()
        {
            System.out.println("事务开启123");
        }//关注点代码
    
        @After("testPointCut()")
        public void end()
        {
            System.out.println("事务结束456");
        }//关注点代码
    }

    ApplicationContext  sping配置文件

    <?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:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           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"
           default-autowire="byType">
    
        <!-- 开启注解扫描 -->
        <context:component-scan base-package="com.murong.aop"></context:component-scan>
    
        <!--开启注解扫描-->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    
    
    
    </beans>

    App  测试类

    package com.murong.aop;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class App
    {
        private ApplicationContext ac = new ClassPathXmlApplicationContext("com/murong/aop/applicationContext");
        @Test
        public void test()
        {
            UserDao dao = (UserDao) ac.getBean("userDao");
            dao.save();
        }
    }

    使用总结:

    步骤:

    1) 先引入aop相关jar文件 aspectj  aop优秀组件)

    spring-aop-3.2.5.RELEASE.jar   【以spring3.2版本jar为例

    aopalliance.jar   spring2.5源码/lib/aopalliance

    aspectjweaver.jar   spring2.5源码/lib/aspectj】或【aspectj-1.8.2lib

    aspectjrt.jar   spring2.5源码/lib/aspectj】或【aspectj-1.8.2lib

    注意: 用到spring2.5版本的jar文件,如果用jdk1.7可能会有问题。

    需要升级aspectj组件,即使用aspectj-1.8.2版本中提供jar文件提供。

    2 bean.xml中引入aop名称空间(文件头引入)

      

    3) 开启aop注解

        如上图。

    4) 使用注解

    @Aspect 指定一个类为切面类

    @Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")  指定切入点表达式

    @Before("pointCut_()") 前置通知: 目标方法之前执行

    @After("pointCut_()") 后置通知:目标方法之后执行(始终执行)

    @AfterReturning("pointCut_()")     返回后通知: 执行方法结束前执行(异常不执行)

    @AfterThrowing("pointCut_()") 异常通知:  出现异常时候执行

    @Around("pointCut_()") 环绕通知: 环绕目标方法执行

  • 相关阅读:
    我的第一个Django项目
    MVC和MTV设计模式
    Linux下安装MySQL
    UEditor演变的迷你版编辑器
    PHP+Mysql+jQuery实现文件下载次数统计
    PHP+JQUEY+AJAX实现分页
    PHP高手之路(一)
    nginx别名alias支持PHP fastcgi解析
    免费的FRP--windows 内网使用Argo Tunnel打洞到 Cloudflare
    拾得他人闲话 DNS 的牙慧
  • 原文地址:https://www.cnblogs.com/yuanchaoyong/p/6416512.html
Copyright © 2020-2023  润新知