赞
踩
spring6.0 2022年11月。新一代框架带jdk17&jakarta ee9
https://www.graalvm.org/
通过预编译方式和运行期动态 代理实现程序功能的统一维护的一种技术。
使用场景:
权限的校验
日志记录
事务处理
性能检测
常用代理方式
jdk动态代理:Proxy类,该类中有一个静态方法,可以创建代理对象
/** *classloader:类加载器,加载代理对象,Class对象就可以获取类加载器 * *Class<?>[] interfaces 接口的字节码数组对象,通过该参数,生成代理对象,可以知道该接口*有那些方法 * *InvocationHandler h :执行句柄,也是一个接口; 当生成代理对象后,调用原目标方法的时候,自动进入到InvocationHandler中invoke方法; * *invoke(Object proxy,Method method,Object[] args): * Object proxy:代理对象 * Method method:代理对象目前正在调用的方法,invoke(Object ...param) * Object[] args:目标方法参数 * */ @CallerSensitive public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) { Objects.requireNonNull(h); @SuppressWarnings("removal") final Class<?> caller = System.getSecurityManager() == null ? null : Reflection.getCallerClass(); /* * Look up or generate the designated proxy class and its constructor. */ Constructor<?> cons = getProxyConstructor(caller, loader, interfaces); return newProxyInstance(caller, cons, h); }
Cglib动态代理
Enhance cglib的核心类,主要作用是先设置属性,再创建代理对象
自定义实现cglib动态代理:
1.导入cglib依赖库
<!--使用Cglib动态代理,需要导入spring-context-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>6.1.3</version>
</dependency>
2.代码实现:
package com.spring; public class PersonService { public void work(){ System.out.println("我爱上班"); } } package com.spring; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * 创建代理对象 */ public class ProxyBeanFactoryCglib { //1.定义代理对象 private PersonService target; //2.构造方法初始化代理对象 public ProxyBeanFactoryCglib(PersonService target){ this.target=target; } //3.编写一个获取代理对象的方法 public Object getProxy(){ //1.创建enchance Enhancer enhancer=new Enhancer(); //2.给enhancer对象设置setSuperclass enhancer.setSuperclass(target.getClass()); //3.给enhancer设置回调函数 enhancer.setCallback(new MethodInterceptor() { /** * * @param proxy 代理对象 * @param method 代理对象正在调用的方法对象 * @param args 代理对象方法传递的参数 * @param methodProxy 方法的代理对象 * @return */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //1.通过method对象,反射调用原始类的方法 method.invoke(target); //2.补充一个记录日志的功能 System.out.println("记录日志,记录工作状态。。"); return null; } }); //4.调用enhancer的create方法,创建代理对象 return enhancer.create(); } } package com.spring; /** * 测试类 */ public class PersonServiceTest { public static void main(String[] args) { //1.创建PersonService 这个的被代理对象 PersonService personService=new PersonService(); //2.创建ProxyBeanFactoryCglib ProxyBeanFactoryCglib proxyBeanFactoryCglib=new ProxyBeanFactoryCglib(personService); //3.调用ProxyBeanFactoryCglib的getProxy方法 PersonService proxy= (PersonService) proxyBeanFactoryCglib.getProxy(); //4.调用work方法,看是否有日志 proxy.work(); } }
事务的特性(ACID):
并发操作数据库会出现问题:
脏读:一个事务读到了另一个事务的还没有提交数据。
不可重复读:一个事务中多次读到的数据不一致。一个事务读到了另一个事务修改后的数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。