Spring中基于xml的AOP的详细步骤

1、Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同一维护的一种技术。Aop是oop的延续,是软件开发中的 一个热点,也是Spring框架中一个重要的内容。是函数式编程的一个衍生范例,利用Aop可以对业务逻辑各个部分进行分割,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用行,提高了开发效率。简单的说就是把我们程序中的重复代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上已有的方法进行增强,(使用动态代理的方式实现)

相关术语

JoinPoint:链接点 那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点

Pointcut:切入点 是指我们要对哪些JoinPont进行拦截的定义

Advice:通知/增强 拦截到Joinpoint之后所要做的事情就是通知

通知类型:前置通知、后置通知、异常通知、最终通知、环绕通知

Introduction:引介 是一种特殊的通知,在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法或field

Target:目标对象,代理的目标对象

Weaving织入 是指把增强应用到目标对象来创建新的代理对象的过程,spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入

Proxy:代理,一类类被Aop织入增强后,就产生一个结果代理类

Aspect:切面 是切入点和通知(引介)的结合

在 spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。

基于XMl的AOP步骤

1、创建Maven项目引入spring坐标

<?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">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.mingqi</groupId>
 <artifactId>SpringIOC</artifactId>
 <packaging>pom</packaging>
 <version>1.0-SNAPSHOT</version>
 <dependencies>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.0.2.RELEASE</version>
 </dependency>
 <dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.7</version>
 </dependency>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
 </dependency>
 </dependencies>
</project>

2、创建业务层接口:

package com.mingqi.services;
public interface IAccountService {
 /**
 * 模拟登陆账户
 */
 void saveAccount();

 /**
 * 模拟更新账户
 * @param id
 */
 void updateAccount(int id);

 /**
 * 模拟删除账户
 * @return
 */
 int deleteAccount();

}

3.创建业务层实现类

package com.mingqi.services.impl;
import com.mingqi.services.IAccountService;
public class AccountServicesImpl implements IAccountService {
 public void saveAccount() {
 System.out.println("执行了保存");
 }

 public void updateAccount(int id) {
 System.out.println("执行了更新"+id);
 }

 public int deleteAccount() {
 System.out.println("执行了删除");
 return 0;
 }
}

4、创建工具类

package com.mingqi.utils;
import org.aspectj.lang.ProceedingJoinPoint;
/**
 * 用户记录日志的工具类,里面提供公共的代码
 */
public class Logger {
 /**
 * 用于打印日志:计划让其在切入点方法执行前执行(切入点方法就是业务层方法)
 */
 public void beforePrintLog(){
 System.out.println("Logger类中的pringLog方法开始记录日志了。。。");
 }
 public void afterReturningPrintLog()
 {
 System.out.println("后置通知Logger类中的beforePrintLog方法开始记录日志了。。。");
 }
 /**
 * 异常通知
 */
 public void afterThrowingPrintLog()
 {
 System.out.println("异常通知Logger类中的afterThrowingPrintLog方法开始记录日志了。。。");

 }
 /**
 * 最终通知
 */
 public void afterPrintLog()
 {
 System.out.println("最终通知Logger类中的afterPrintLog方法开始记录日志了。。。");
 }

 /**
 * 环绕通知
 * 问题 当我们配置了环绕通知以后,切入点方法没有执行,而通知方法执行了
 * 分析: 通过对比动态代理中的环绕通知代码,发现动态代理中的环绕通知有明确的切入点方法调用,而我们的代码中没有
 * 解决: Spring 框架为我们提供了一个接口:ProceedingJoinPoint。该接口有一个方法proceed(),此方法就相当于明确调用切入点的方法
 * 该接口可以作为环绕通知的参数方法,在程序执行时,spring框架会为我们提供该接口的实现类供我们使用
 * spring中的环绕通知
 * 他是spring框架为我们提供的一种可以在代码中手动控制增强方法何时会执行的方式
 * @param pjp
 * @return
 */
 public Object aroundPringLog(ProceedingJoinPoint pjp){
 Object rtValue = null;
 try{
  Object[] args = pjp.getArgs();//得到方法执行所需的参数

  System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。前置");

  rtValue = pjp.proceed(args);//明确调用业务层方法(切入点方法)

  System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。后置");

  return rtValue;
 }catch (Throwable t){
  System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。异常");
  throw new RuntimeException(t);
 }finally {
  System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。最终");
 }
 }
}

5、创建bean配置文件

<?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"
 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">
 <!-- 配置spring的IOC,把service对象配置进来-->
 <bean id="accountSevice" class="com.mingqi.services.impl.AccountServicesImpl"></bean>
 <!-- spring 中基于xml的Aop配置步骤
  1、把通知Bean也交给spring来管理
  2、使用aop:config标签表名开始aop的配置
  3、使用aop:aspect标签表明配置切面
  id属性:是给切面提供一个唯一标识
  ref属性:是指定通知类的id
  4、在aop:aspect标签的内部使用对应的标签来配置通知的类型
  我们现在的示例是让printlog方法在切入点方法执行之前执行,所以是前置通知
  aop:before:标识前置通知
  method属性: 用于指定Logger类中的方法哪个是前置通知
  pointcut属性: 用于指定切入点表达式,该表达式的含义指的是对业务层中的哪些方法增强
  切入点表达式的写法:
   关键字:execution(表达式)
   表达式: 访问修饰符 返回值 包名.包名.包名....类名.方法名(参数列表)
   标准的写法: public void com.mingqi.service.impl.AccountServiceImpl.saveAccount()
   访问修饰符可以省略:void com.mingqi.service.impl.AccountServiceImpl.saveAccount()
   返回值可以使用通配符,标识任意返回值:* com.mingqi.service.impl.AccountServiceImpl.saveAccount()
   包名可以使用通配符,表示任意包,但是有几级包就需要写几个* *.*.*.*.*.AccountServiceImpl.saveAccount()
   包名可以使用..代表当前包及其子包:* *.AccountServiceImpl.saveAccount()
   类名和方法名都可以使用*来实现统配 * *..*.*();
   参数列表: 可以直接写数据类型:
     基本类型直接写名称:int
     引用类型写包名.类名的方式: java.lang.String
    可以使用通配符来标识任意类型,单必须有参数
    可以使用..标识有无参数均可,有参数可以是任意类型

   全通配写法:
   * *..*.*(..)
   实际开发中 切入点表达式的通常写法:
    切到业务层实现类的所有方法,* com.mingqi.service.impl.*.*(..);
  -->
 <!-- 配置Logger类-->
 <bean id="logger" class="com.mingqi.utils.Logger"></bean>
 <!--使用aop:config标签表名开始aop的配置-->
 <aop:config>
  <aop:pointcut id="pt1" expression="execution(* com.mingqi.services.impl.*.*(..))"></aop:pointcut>
  <!--使用aop:aspect标签表明配置切面-->
  <aop:aspect id="LogAdvice" ref="logger">
   <!-- 配置前置通知:在切入点方法执行之前执行
   <aop:before method="beforePrintLog" pointcut-ref="pt1"></aop:before>-->

   <!-- 配置后置通知:在切入点方法正常执行之后值。它和异常通知永远只能执行一个
    <aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>-->
   <!-- 配置异常通知:在切入点方法执行产生异常之后执行。它和后置通知永远只能执行一个
    <aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing>-->
   <!-- 配置最终通知:无论切入点方法是否正常执行它都会在其后面执行
   <aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>-->
   <!-- 配置环绕通知 详细的注释请看Logger类中-->
   <aop:around method="aroundPringLog" pointcut-ref="pt1"></aop:around>
   </aop:aspect>
  </aop:config>
 </beans>

6、创建测试类

package com.mingqi.test;
import com.mingqi.services.IAccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringIoc {
 @Test
 public void TestAccount()
 {
 ApplicationContext ac= new ClassPathXmlApplicationContext("beam.xml");
 IAccountService accountService=(IAccountService) ac.getBean("accountSevice");
 accountService.saveAccount();
 accountService.updateAccount(22);
 accountService.deleteAccount();
 }
}

总结

到此这篇关于Spring中基于xml的AOP的详细步骤的文章就介绍到这了,更多相关Spring基于xml的AOP内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • spring中aop的xml配置方法实例详解

    前言 AOP:即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等. aop,面向切面编程的目标就是分离关注点,比如:一个骑士只需要关注守护安全,或者远征,而骑士辉煌一生的事迹由谁来记录和歌颂呢,当然不会是自己了,这个完全可以由诗人去歌颂,比如当骑士出征的时候诗人可以去欢送,当骑士英勇牺牲的时候,诗人可以写诗歌颂骑士的一生.那么骑士只需要关注怎么打仗就好了.而诗人也只需要关注写诗歌颂和欢送就好了,那么这样就把功能分离了.所以可以把诗

  • SpringMVC用XML方式实现AOP的方法示例

    1.首先创建web工程,之后导入Spring jar包,目录如下 2.文件代码 2.1AfterAdvice package com.niit.aop; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice; /* * 后置通知 * havingClass方法执行之后才执行. * 输出日记 * */ public class AfterAdvice implements After

  • 详解Spring Aop实例之xml配置

    AOP的配置方式有2种方式:xml配置和AspectJ注解方式.今天我们就来实践一下xml配置方式. 我采用的jdk代理,所以首先将接口和实现类代码附上 package com.tgb.aop; public interface UserManager { public String findUserById(int userId); } package com.tgb.aop; public class UserManagerImpl implements UserManager { publ

  • Spring使用AspectJ注解和XML配置实现AOP

    本文演示的是Spring中使用AspectJ注解和XML配置两种方式实现AOP 下面是使用AspectJ注解实现AOP的Java Project 首先是位于classpath下的applicationContext.xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmln

  • Spring中基于xml的AOP的详细步骤

    1.Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同一维护的一种技术.Aop是oop的延续,是软件开发中的 一个热点,也是Spring框架中一个重要的内容.是函数式编程的一个衍生范例,利用Aop可以对业务逻辑各个部分进行分割,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用行,提高了开发效率.简单的说就是把我们程序中的重复代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上已有的方法进

  • Spring中基于XML的AOP配置详解

    1. 准备工作 1.1 创建工程 day03_eesy_03SpringAOP 1.2 在配置文件pom.xml中添加依赖 <?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"

  • Spring如何基于xml实现声明式事务控制

    一.pom.xml <?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

  • 在Spring中基于Java类进行配置的完整步骤

    前言 JavaConfig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean 的定义信息,在 Spring4 的版本, JavaConfig 已正式成为 Spring4 的核心功能 . 本文将详细介绍关于Spring中基于Java类进行配置的相关内容,下面话不多说了,来一起看看详细的介绍吧 1 定义 Bean 普通的 POJO 只要标注了 @Configuration 注解,就可以为 Spring 容器提供 Bean 的定义信息. @Configuration pub

  • Spring框架基于注解的AOP之各种通知的使用与环绕通知实现详解

    目录 一.基于注解的AOP之各种通知的使用 二.基于注解的AOP之环绕通知 一.基于注解的AOP之各种通知的使用 1.在切面中,需要通过指定的注解将方法标识为通知方法 @Before:前置通知,在目标对象方法执行之前执行 @After:后置通知,在目标对象方法的finally子句中执行 @AfterReturning:返回通知,在目标对象方法返回值之后执行 @AfterThrowing:异常通知,在目标对象方法的catch子句中执行 声明重用写入点表达式 @Pointcut("execution

  • spring中的注解事务演示和添加步骤详情

    目录 添加注解效果事务演示 基于注解的事务添加步骤 添加不回滚属性设置 @Transactional注解参数详解 添加注解效果事务演示 注解我们经常会用到,或者在jdk源码中也会看到,例如: @Deprecated以及我们在spring或者springboot中经常用到@Controller.@Service.@Repository.@Entity等注解. 基于注解的事务添加步骤 1)在applicationContext_service.xml文件中添加事务管理器 <bean id="t

  • IDEA在一个工作空间中管理多个项目的详细步骤

    你身边有没有这种顽固的Eclipse忠实用户:IDEA不能一个窗口管理多个项目!太不方便了! 对于一个窗口同时管理多个项目的需求,在我们日常开发时候是经常需要的.尤其当我们在分布式环境下,在一个窗口中调试起来就能方便很多. 如此强大的IDEA真的不支持吗?!当然不是!是你不会用! 下面我们就来说说如何在一个工作空间中管理多个项目的配置方式: 第一步:先创建一个新的空白工程 在弹出的项目名称和路径输入框中根据你的喜好输入即可. 第二步:添加模块 添加模块的方式有两种: New Module:如果你

  • 详解Spring中使用xml配置bean的细节

    整理总结刚学的关于spring的xml配置bean的知识. 在ApplicationContext.xml文件中使用bean节点配置bean,bean的属性id在IOC容器中必须是唯一的. <bean id="helloWorld" class="com.test.spring.beans.HelloWorld"> <property name="name" value="Spring"></pr

  • linux防火墙配置(基于yum仓的配置)详细步骤

    前言 此实验准备两台虚拟机便于调试,一台CentOs6,一台红帽6 1.首先确保yum仓的配置是否完好(CentOs6) 2.要求在centOs6中安装httpd和mod_ssl软件包 [root@cento211 yum.repos.d]# yum -y install httpd mod_ssl 3.在CentOs6中启用httpd.service并使其开机自启 [root@cento211 ~]# systemctl enable httpd.service Created symlink

  • 在IDEA中Debug调试VUE项目的详细步骤

    调试js代码,每次都在要在代码中写debugger,或者在chrome中打断点,而且chrome的断点信息不人性化.偶然发现idea竟然有这个功能,简直神器啊.研究了半天终于搞定了,哈哈,开心.下面是详细步骤: 1.下载浏览器插件 在chrome应用商店搜索"jetbrains ide support"插件,可能需要FQ(不会百度,老D google host),如下图,这里是我安装好的.这里我试过找下载好的插件,安装但是没有连接成功,总是提示错误,下文会提到.所以别偷懒,老老实实下载

随机推荐