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

网友投稿 237 2022-12-04


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坐标

xmlns:xsi="http://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">

4.0.0

com.mingqi

SpringIOC

pom

1.0-SNAPSHOT

org.springframework

spring-context

5.0.2.RELEASE

org.aspectj

aspectjweaver

1.8.7

junit

junit

4.12

test

xmlns:xsi="http://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">

4.0.0

com.mingqi

SpringIOC

pom

1.0-SNAPSHOT

org.springframework

spring-context

5.0.2.RELEASE

org.aspectj

aspectjweaver

1.8.7

junit

junit

4.12

test

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配置文件

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:aop="http://springframework.org/schema/aop"

xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/aop

http://springframework.org/schema/aop/spring-aop.xsd">

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:aop="http://springframework.org/schema/aop"

xsi:schemaLocation="http://springframework.org/schema/beans

http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/aop

http://springframework.org/schema/aop/spring-aop.xsd">

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();

}

}

总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java使用反射创建并操作对象的方法
下一篇:详细分析java 动态代理
相关文章

 发表评论

暂时没有评论,来抢沙发吧~