切面编程(三)

一、XML实现AOP编程

  spring提供了注解的形式实现aop编程,同时也提供xml配置的形式实现,形式不同,最终实现的效果是一致的,下面进行xml实现aop编程的demo具体实现

  步骤1.编写切面和切入点

package com.jyk.spring.aop2;

import org.aspectj.lang.ProceedingJoinPoint;

public class UserAop {

    //前置通知,执行目标方法前执行
    public void begin()
    {
        System.out.println("开启事务");
    }

    //后置通知,执行目标方法后执行
    public void commit()
    {
        System.out.println("结束事务");
    }

    //返回后通知,目标方法调用结束后执行,出现异常不执行
    public void afterRunning()
    {
        System.out.println("目标方法调用结束后执行");
    }

    //异常通知,目标方法调用发生异常时执行
    public void throwException()
    {
        System.out.println("执行目标方法出现了异常");
    }

    //环绕通知,环绕目标方法执行
    public void arround(ProceedingJoinPoint pj)throws Throwable
    {
        System.out.println("环绕前");
        //执行目标方法
        pj.proceed();
        System.out.println("环绕后");
    }
}

  步骤2.编写业务接口和实现

package com.jyk.spring.aop2;

public interface UserInterface {

    public void add();

    public void delete();
}
package com.jyk.spring.aop2;

public class UserImpl implements UserInterface{

    @Override
    public void add() {
        System.out.println("核心业务1");
    }

    @Override
    public void delete() {
        System.out.println("核心业务2");
    }
}

  步骤3.在配置文件中将切面和业务实现类加入IOC容器,并配置切入点表达式

<?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/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
        ">

    <!-- 将切面类加入IOC容器 -->
    <bean id="userAop" class="com.jyk.spring.aop2.UserAop"></bean>

    <!-- 将业务实现类加入IOC容器 -->
    <bean id="userImpl" class="com.jyk.spring.aop2.UserImpl"></bean>

    <!-- Aop配置 -->
    <aop:config>
        <!-- 定义一个切入点表达式: 拦截哪些方法 -->
        <!-- com.jyk.spring.aop2.*.*(..)意为拦截该包下所有类的所有方法 -->
        <aop:pointcut expression="execution(* com.jyk.spring.aop2.*.*(..))"
            id="pt" />
        <!-- 切面 -->
        <aop:aspect ref="userAop">
            <!-- 环绕通知 -->
            <aop:around method="arround" pointcut-ref="pt" />
            <!-- 前置通知: 在目标方法调用前执行 -->
            <aop:before method="begin" pointcut-ref="pt" />
            <!-- 后置通知: -->
            <aop:after method="commit" pointcut="execution(* com.jyk.spring.aop2.*.*(..))" />
            <!-- 返回后通知 -->
            <aop:after-returning method="afterRunning"
                pointcut-ref="pt" />
            <!-- 异常通知 -->
            <aop:after-throwing method="throwException"
                pointcut-ref="pt" />
        </aop:aspect>
    </aop:config>
</beans> 

  步骤4.验证结果,结果参见切面编程(二),效果与注解实现一致。

ApplicationContext ac = new ClassPathXmlApplicationContext("aop_xml.xml");

    //目标对象有实现接口,Spring会默认使用JDK代理
    @Test
    public void testJDK()
    {
        UserInterface ui = (UserInterface) ac.getBean("userImpl");
        System.out.println(ui.getClass());
        ui.add();
        ui.delete();
    }

二、切入点表达式

  切入点表达式的使用丰富多样,可以对指定的“方法”进行拦截;  从而给指定的方法所在的类生层代理对象,下面简单介绍常见的切入点表达式

<!-- Aop配置 -->
    <aop:config>

        <!-- 定义一个切入点表达式: 拦截哪些方法 -->
        <aop:pointcut expression="execution(* com.jyk.spring.aop2.*.*(..))" id="pt"/>

        <!-- 【拦截所有public方法】 -->
        <aop:pointcut expression="execution(public * *(..))" id="pt"/>

        <!-- 【拦截所有save开头的方法 】 -->
        <aop:pointcut expression="execution(* add*(..))" id="pt"/>

        <!-- 【拦截指定类的指定方法, 拦截时候一定要定位到方法】 -->
        <aop:pointcut expression="execution(public * com.jyk.spring.aop2.UserImpl.add(..))" id="pt"/>

        <!-- 【拦截指定类的所有方法】 -->
        <aop:pointcut expression="execution(* com.jyk.spring.aop2.UserImpl.*(..))" id="pt"/>

        <!-- 【拦截指定包,以及其自包下所有类的所有方法】 -->
        <aop:pointcut expression="execution(* com.jyk.spring..*.*(..))" id="pt"/>

        <!-- 【多个表达式】 -->
        <aop:pointcut expression="execution(* com.jyk.spring.aop2.UserImpl.add()) || execution(* com.jyk.spring.aop2.StudentImpl.add())" id="pt"/>
        <aop:pointcut expression="execution(* com.jyk.spring.aop2.UserImpl.add()) or execution(* com.jyk.spring.aop2.StudentImpl.add())" id="pt"/>

        <!-- 【取非值】 -->
        <aop:pointcut expression="!execution(* com.jyk.spring.aop2.UserImpl.add())" id="pt"/>
        <aop:pointcut expression=" not execution(* com.jyk.spring.aop2.UserImpl.add())" id="pt"/>

        <!-- 切面 -->
        <aop:aspect ref="aop">
            <!-- 环绕通知 -->
            <aop:around method="around" pointcut-ref="pt"/>
        </aop:aspect>
    </aop:config>

原文地址:https://www.cnblogs.com/jiyukai/p/9385840.html

时间: 2024-08-30 04:58:44

切面编程(三)的相关文章

详解Spring面向切面编程(AOP)三种实现

一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合.不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能.日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性.异常处理和透明的持续性也都是如此,这

三、面向切面编程

第八讲  面向切面编程--aop 1.aop:aspect oriented programming 面向切面编程 2.aop在spring中作用 提供声明式事务服务(声明式事务) 允许用户实现自定义切面 3.aop:在不改变原有代码的情况下增加新的功能. 传统的编程模式: Aop的编程模式:横向的编程 aop的好处:(代理的好处就是aop的好处) a)使得真实角色处理的业务更加纯粹,不再去关注一些公共的事情. b)公共的业务由代理来完成---实现业务的分工 c)公共业务发生扩展时变得更加集中和

spring框架学习(三)——AOP( 面向切面编程)

AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 所谓的周边功能,比如性能统计,日志,事务管理等等 周边功能在Spring的面向切面编程AOP思想里,即被定义为切面 在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发 然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP 原理图 1. 功能分两大类,辅助功能和

Spring(三)--AOP【面向切面编程】、通知类型及使用、切入点表达式

1.概念:Aspect Oriented Programming 面向切面编程 在方法的前后添加方法 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 -- 3.情景举例 ①数学计算器接口[MathCalculator] int add(int i,int j); int sub(int i,int j); int mul(int i, int j); int div(int i,int j); 因为后面的通知方法需要返回值,所以在这里类型声明为 int 类型 public

利用多态,实现一般处理程序(ashx)中的AOP(切面编程)

本文是对工作中的项目进行代码优化(完善登陆验证的AOP切面编程)时,所遇到的各种解决方案思考过程. 项目背景:由ashx+nvelocity构建的简单B/S问卷系统,现需要优化登录验证环节(时隔若干个月在回顾代码果然是一个痛苦的过程~) nvelocity是velocity框架针对.net的版本,核心是拼html字符串后返回客户端,与MVC的前后端代码隔离有异曲同工之妙.加之一般处理程序ashx不需要像asp.net那样走生成控件树的过程,执行上更是省时省力.故简单系统用ashx+nveloci

Spring面向切面编程(AOP)

1 spring容器中bean特性 Spring容器的javabean对象默认是单例的. 通过在xml文件中,配置可以使用某些对象为多列. Spring容器中的javabean对象默认是立即加载(立即实例化:spring加载完成,立即创建对象) scope:属性 singleton:默认值为单例,默认也是立即加载,在加载完成spring容器的时候,bean对象已经创建完成 prototype:多例的,默认懒加载,spring容器加载完成的时候,不会创建bean的对象,只有从容器获得bean对象的

Java实战之03Spring-03Spring的核心之AOP(Aspect Oriented Programming 面向切面编程)

三.Spring的核心之AOP(Aspect Oriented Programming 面向切面编程) 1.AOP概念及原理 1.1.什么是AOP OOP:Object Oriented Programming面向对象编程 AOP:Aspect Oriented Programming面向切面编程 1.2.代理 充分理解:间接 主要作用:拦截被代理对象执行的方法,同时对方法进行增强. 1.2.1.静态代理 特点:代理类是一个真实存在的类.装饰者模式就是静态代理的一种体现形式. 1.2.2.动态代

Spring进阶之路(11)-使用Aspectj切面配置和XML配置文件方式实现切面编程

异常 在使用的时候,遇到了部分的异常,我用的是最新的Spring版本,Spring-4.2.5版本的,首先确保你的配置文件中引入了下面红色部分. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <span style="color:#ff0000;">

Python装饰器与面向切面编程

今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 1. 装饰器入门 1.1. 需求是怎么来的? 装饰器的定义很是抽象,我们来看一个小例子. 1 2 3 4 def foo():     print 'in foo()' foo() 这是一个很无聊的函数没错