4.Spring中的AOP

本文详细介绍了Spring中的AOP(面向切面编程),包括AOP的概念、应用场景、底层实现原理(JDK动态代理和Cglib动态代理)以及Spring中AOP的XML和注解开发方式。通过具体的例子展示了前置、后置、环绕、异常和最终通知的使用,以及切入点表达式和AOP思想的实际应用。
摘要由CSDN通过智能技术生成

一、AOP概述
AOP:Aspect Oriented Programming,面向切面编程,AOP是OOP(OOP即面向对象编程)的扩展和延伸。

AOP的应用场景:
例如下面的代码:

public class UserDao{
   
    public void save(){
   
        //在保存之前有校验代码
        check();
    }
    public void check(){
   
        //对数据进行校验
    }
}

分析:如果有很多想UserDao这样的类都需要包含校验方法check(),对于传统的OOP来说,使用继承的方式,即量check()方法放到一个公共父类中,然后所有想用的类去继承。但是在AOP中,采取的是横向抽取的方式,也即即采用动态代理的方式,需要调用check()方法时,调用一下代理即可。

为什么学习AOP:在不修改源码的情况下对程序进行增强。AOP可以用于进行权限校验、日志记录、性能监控、事务控制等。

AOP底层实现原理:
动态代理
  JDK动态代理:只能对实现了接口的类产生代理;
  Cglib动态代理(类似于Javassist第三方的代理技术):对没有实现接口的类产生代理,生成子类对象。

Spring中使用AspectJ:
AOP思想最先有AOP组织联盟提出,Spring对于AOP的实现有自己的方式,但是比较繁琐,已经被弃用了。目前Spring使用的是基于AspectJ的开发。

二、Spring中AOP的XML开发
1.AOP开发的相关术语

class UserDao{
   
    public void save();
    public void find();
    public void update();
    public void delete();
}

Joinpoint:连接点,可以被拦截到的点。增删改查的方法都可以被增强,这些方法就可以被称为连接点。
Pointcut:切入点,真正被拦截的点。在实际开发中,只对save()方法进行增强,save()方法被称为是切入点。
Advice:通知、增强,方法层面的增强。比如,现在对save()方法进行权限校验,权限校验(checkPri)的方法称为通知。
Introduction:引介。类层面的增强。
Target:被增强的对象。例如,对UserDao进行增强,UserDao则称之为目标。
Weaving:织入。将通知(Advice)应用到目标(Target)的过程。例如,将权限校验的方法的代码应用到UserDao中的save()方法的过程。
Proxy:代理对象。
Aspect:切面,多个通知和多个切入点的组合。

2.AOP的XML入门开发
下面举一个例子作为AOP开发的入门,步骤如下:
1)引入.jar包
AOP开发包含针对于IOC开发基本的几个.jar包如下
com.springsource.org.apache.commons.logging-1.1.1.jar :日志相关包
com.springsource.org.apache.log4j-1.2.15.jar:日志相关包
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar

另外需要引入的.jar包
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar:依赖的aspectj包;
org.apache.servicemix.bundles.aopalliance-1.0-1.0.0-rc1.jar:AOP联盟的包;
spring-aop-4.2.4.RELEASE.jar:Spring的AOP的开发部;
spring-aspects-4.2.4.RELEASE.jar:Spring与aspectj整合的包;
spring-test-4.2.4.RELEASE.jar:测试用的包。

2)测试类代码编写
ProductDao接口

public interface ProductDao {
   
    public void save();
    public void update();
    public void find();
    public void delete();
}

ProductDao接口实现类

public class ProductDaoImpl implements ProductDao{
   
	public void save() {
   
		// TODO Auto-generated method stub
		System.out.println("保存商品。。。");
	}
	public void update() {
   
		// TODO Auto-generated method stub
		System.out.println("修改商品。。。");
		
	}
	public void find() {
   
		// TODO Auto-generated method stub
		System.out.println("查找商品。。。");
		
	}
	public void delete() {
   
		// TODO Auto-generated method stub
		System.out.println("删除商品。。。");
		
	} 
}

功能增强类

public class MyAspect {
   
    public void checkPri()</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值