Javaweb学习笔记(Spring AOP)
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