jdk的动态代理(基于接口实现)
实现InvocationHandler接口重写里面的invoke方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
Method类中的invoke方法
Object result = method.invoke(rent, args);
//method:代表的就是Rent接口中的rent方法
//rent:接口对象
//args:可以指定rent方法中的参数值
返回对象
return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
//注意:rent代表的就是接口实例(因此jdk动态代理是基于接口实现的)
package com.my.demo03;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//使用这个类,来自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
//被代理的接口
private Rent rent;
public void setRent(Rent rent) {
this.rent = rent;
}
// Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
// new Class>[] { Foo.class },
// handler);
//定义一个getProxy方法:该方法用来创建代理类和实例
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
}
//处理代理类,并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
seeHouse();
Object result = method.invoke(rent, args);
payMoney();
return result;
}
public void seeHouse(){
System.out.println("中介带我们看房子!");
}
public void payMoney(){
System.out.println("客户支付房租定金!");
}
}
jdk动态代理是基于接口实现的,cglib动态代理是基于class类实现的
JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架(用来操控字节码的)写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低
JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高


@Transactional 注解修饰的业务方法抛出的异常不是spring的事务支持的异常,需要使用注解的rollbackFor 属性来指定@Transactional 注解所在的类没有被spring管理public class RefreshTokenInterceptor implements HandlerInterceptor {
//注意:LoginInterceptor类没有被Spring Boot管理,所以不能使用SpringBoot的自动装配功能
private StringRedisTemplate stringRedisTemplate;
public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {
this.stringRedisTemplate = stringRedisTemplate;
}
}



索引分类
普通索引
create index 索引名称 on 表名(字段名)
alter table 表名 add index 索引名称(字段名)
唯一索引
create unique index 索引名称 on 表名(字段名)
alter table 表名 add unique (字段名)
主键索引:唯一索引和主键索引的区别就是主键索引不能为空值
组合索引
create index 索引名称 on 表名(字段1,字段2,...)
注意:创建一个组合索引,本质上创建了多个索引,最左匹配原则
删除索引
dorp index 索引名称 on 表名