Javaweb学习笔记(Spring AOP)

本文详细介绍了Spring AOP的概念,包括AOP的术语如切面、连接点、切入点和通知等。接着讲解了JDK动态代理和CGLIB代理的实现原理与区别,展示了如何创建代理对象和目标对象。最后,探讨了基于代理类的AOP实现,包括Spring的通知类型和ProxyFactoryBean的使用,以及AspectJ的XML声明式和注解式配置。通过对Spring AOP的学习,有助于提高代码的可维护性和开发效率。
摘要由CSDN通过智能技术生成

SpringAOP简介

什么是AOP

AOP是面向切面编程,他是面向对象的一种补充。AOP的使用使开发人员在编写业务逻辑时可以专业与核心业务么人不用过多地赶住其他业务的实现,提高了开发效率,增强了代码的可维护性。
最流行的AOP框架有两个分别为Spring AOP和AspectJ。

AOP术语

1.Aspect(切面):在实际应用中,切面通常是指封装的用于荷香插入系统功能(如事务、日志等)的类。需要在配置文件< bean>元素指定。
2.Joinpoint(连接点):在程序执行过程中的某个阶段点,实际上是对象的一个操作。在SpringAOP中,连接点就是指方法的调用。
3.Pointcut(切入点):是指且面与程序流程的叫差点,即那些需要处理的连接点。切入点一般是指类或者方法名。
4.Advice(通知/增强处理):AOP框架在特定的切入点执行的增强处理,即在定义号的且入点出所要执行的程序代码。
5.Target Object(目标对象):是指所有被通知的对象,也称为被增强对象,如果AOP框架采用的是动态的AOP实现,那么该对象就是一个被代理的对象。
6.Proxy(代理):江同志应用到目标对象之后,被动态创建的对象
7.Weaving(织入):将切面代码插入到目标对象上,从而生成代理对象的过程。

动态代理

JDK动态代理

JDK动态代理,是通过java.lang.reflect.Proxy类进行实现的,调用Proxy类的newProxyInstance()方法来创建代理对象。
示例:
(1)创建一个AOP的Web项目,导入Spring框架所需的包,
(2)在src目录下创建一个com.itheima,jdk包,该包下创建接口UserDao,并在接口中编写添加和删除的方法。

package com.itheima.jdk;

public interface UserDao {
	public void addUser();
	public void deleteUser();
}

(3)在com.itheima.jdk包下创建UserDao接口实现类UserDaoImpl。

package com.itheima.jdk;
public class UserDaoImpl implements UserDao {
	public void addUser(){
		System.out.println("添加用户...");
	}
	public void deleteUser(){
		System.out.println("删除用户...");
	}
}

(4)在src目录下创建一个com.itheima.aspect包,并在该包下创建切面类MyAspect,该类中定义一个模拟权限检查的方法和一个模拟记录日志的方法。

package com.itheima.aspect;

public class MyAspect {
	public void check_Premisson(){
		System.out.println("模拟检查权限");
	}
	public void log(){
		System.out.println("删除用户");
	}
}

(5)在com.itheima.jdk包下创建代理类该类需要实现InvocationHandler接口,并编写代理方法。

package com.itheima.jdk;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import com.itheima.aspect.MyAspect;;
public class JdkProxy implements InvocationHandler{
	private UserDao userDao;
	Object createProxy(UserDao userdao){
		this.userDao=userdao;
		ClassLoader classloader=JdkProxy.class.getClassLoader();
		Class [] clazz=userDao.getClass().getInterfaces();
		return Proxy.newProxyInstance(classloader,clazz,this);
	}
	@Override
	public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{
		MyAspect myAspect =new MyAspect();
		myAspect.check_Premisson();
		Object obj=method.invoke(userDao, args);
		myAspect.log();
		return obj;
	}
}

(6)在com.itheima.jdk包下,创建测试类JDKTest,用来创建代理对象和目标对象,然后从代理对象中获得目标对象userDao增强后的对象,最后调用该对象的添加和删除方法。

package com.itheima.jdk;
public class JdkTest {
	public static void main(String []args){
	JdkProxy jdkProxy=new JdkProxy();
	UserDao userDao=new UserDaoImpl();
	UserDao userDao1=(UserDao)jdkProxy.createProxy(userDao);
	userDao1.addUser();
	userDao1.deleteUser();
	}
}

在这里插入图片描述

CGLIB代理

CGLIB是一个高性能开源代码生成包,采用了底层的字节码技术,对指定的目标类生成的一个子类,并对子类进行则增强。在Spring的核心包中已经集成CGLIB所需要的包,所以开发中不需要另外导入JAR包。
示例:
(1)在src目录下创建一个com.itheima.cglib包,在该包下创建一个UserDao,UserDao不需要实现任何接口,只需定义一个添加用户的方法和删除用户的方法。

package com.itheima.cglib;

public class UserDao {
	public void addUser(){
		System.out.println("添加用户");
	}
	public void deleteUser(){
		System.out.println("删除用户");
	}
}

(2)在com.itheima.cglib包中创建一个CglibProxy,该代理需要实现MethodInterceptor接口,并实现接口中的intercept()方法。

package com.itheima.cglib;
import java.lang.reflect.*;
import org.springframework.cglib.proxy.*;
import com.itheima.aspect.*;
public class CglibProxy implements MethodInterceptor{
	public Object createProxy(O
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值