如何快乐的去玩Spring AOP


一、aop怎么玩?
aop底层原理:动态代理技术 jdk动态代理和cglib动态代理

代理========>经纪人、中介

二、动态代理(重点)
黑客入侵
1)jdk黑客: 只能入侵实现接口的对象。 针对接口实现类
package com.cc.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import javax.management.loading.PrivateClassLoader;

import com.cc.dao.UserDao;

/*
* 黑客类 :(证--规范--接口:一组功能的约定)
*/
public class JdkHk implements InvocationHandler{
//目标对象
private Object target;
public JdkHk() {
}
public JdkHk(UserDao userDao) {
this.target=userDao;
}

public Object getInstance(Class clazz) {
/*
* loader 类加载器
* ClassLoader.getSystemClassLoader() 获取当前程序的类加载器
* interfaces 目标的实现的接口class
* h invocationHandler对象--黑客对象
* 字节码拼接技术
*/
return Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {clazz}, this);
}
/**
* 黑客类入侵的方法
* proxy:代理对象
* method:入侵的目标的方法
* args:入侵的目标的方法的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("1、鉴权成功");
//干坏事
args[0]=11;
args[1]=22;
//调用目标方法
Object result = method.invoke(target, args);
System.out.println("2、保存处理日志成功");
return result;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}



}
 
   

jdk接口:InvocationHandler


==>JDK动态代理技术

【重点】jdk本质: 字节拼接技术为接口自动生成了一个代理类$Proxy0(子类)



2)spring黑客:针对类(aspect包---spring提供的)
aopalliance: MethodInteceptor 当类实现接口内部用的jdk黑客 如果类没有实现接口 使用cglib动态代理
==>可以使用JDK动态代理(实现接口类) 也可以使用Cglib动态代理(类或实现接口类)
package com.cc.proxy;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class SpringHk implements MethodInterceptor{
/*
* invocation : 代理目标对象的目标方法
*/
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object[] args = invocation.getArguments();
//干坏事
args[0]=11;
args[1]=22;

System.out.println("1.鉴权");
//调用目标方法
Object result = invocation.proceed();
System.out.println("1.日志留痕");
return result;
}

}
 
   


【重点】Cglib本质: 生成了一个类的代理类

3)黑客,目标对象的XML文件配置

<!--1.目标对象  -->
<bean id="userDao2" class="com.cc.dao.impl.UserDaoImpl2"></bean>
<bean id="userDaoInter" class="com.cc.dao.impl.UserDaoImpl"></bean>

<!--2.spring 黑客对象 -->
<bean id="springHk" class="com.cc.proxy.SpringHk">
</bean>

<bean id="jdkHk" class="com.cc.proxy.JdkHk">
<!-- <constructor-arg name="target" ref="userDaoInter"></constructor-arg> -->
</bean>
 
   

4)两种动态代理的xml配置

  1.Cglib动态代理
<!--3.代理对象  :Cglib动态代理  -->
<bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 3.1 目标对象 -->
<property name="target" ref="userDao2"></property>
<!-- 3.2 spring 黑客对象 -->
<property name="interceptorNames">
<array>
<value>springHk</value>
</array>
</property>

</bean>
 
   



  2.JDK动态代理
  <!-- JDK动态代理  $Proxy0-->
<bean id="userDaoProxy2" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 3.2 目标对象 -->
<property name="proxyInterfaces" value="com.cc.dao.UserDao"></property>

<!-- 3.1 目标对象 -->
<property name="target" ref="userDaoInter"></property>

<!-- 3.2 spring 黑客对象 -->
<property name="interceptorNames">
<array>
<value>springHk</value>
</array>
</property>
 
   
  三、aop的术语
连接点 可以被增强的方法(spring 的连接点 oop中的方法)
切点 被增强的方法
通知/增强   增强的逻辑
切面 就是切点和通知(增强)的统称
植入 将通知植入到目标方法的过程
目标对象 被增强的对象
代理对象
        aop:将对象的目标方法通过动态代理技术进行植入增强,从而达到
增强方法的目的







posted on 2020-12-17 20:04  茕茕孑立!  阅读(47)  评论(0)    收藏  举报