mybatis为什么用的是mapper接口
接口》想要注册代理类》构建一个工厂类实现beandefinition,通过getobject方法返回代理类》想要增强 构建一个处理类实现invocationhandler通过invoke方法增强》注册器》spring容器
接口>beandefinition》工厂模式getobject生成代理类>invoke增强》beandefinition>注册器》spring容器
userMapper 接口,mybeanfactory impl beanfactory > getobject return proxy.newproxyInstance(userMapper.class,,myinvocation)
beandefinition.setbeanclass( mybeanfacotry)
registry.registerBeanDefinition(beandefinition)

把接口的代理类生成bean定义放到spring容器中怎么弄?如下图:
public class MyfactoryBean implements FactoryBean {
private Class clazz;
public MyfactoryBean(Class clazz){
this.clazz = clazz;
}
@Override
public Object getObject() throws Exception {
Class[] clazzes = new Class[]{this.clazz};
//proxy.newProxyInstance生成代理类
Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(),clazzes,new MyInvocation());
return proxy;
}
@Override
public Class<?> getObjectType() {
return this.clazz;
}
@Override
public boolean isSingleton() {
return false;
}
}
public class MyInvocation implements InvocationHandler {
public MyInvocation(){
}
// invocationHandler 的invoke方法作用是动态代理增强
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("This is a proxy of ImportTestDao");
return null;
}
}
代理实例参数的意义:
Proxy.newProxyInstance 是 Java 反射机制中的一个方法,用于创建一个动态代理实例。动态代理允许你在运行时创建一个实现了一个或多个接口的代理类,并在调用方法时进行自定义的处理逻辑。这个方法有三个参数,每个参数的意义如下:
ClassLoader loader:
这个参数指定了由哪个类加载器来加载代理类。通常会传入目标接口的类加载器,可以使用目标类的getClass().getClassLoader()方法来获取。
例如:MyClass.class.getClassLoader()。
Class<?>[] interfaces:
这个参数是一个接口数组,指定了代理类需要实现的接口。通常你会传入目标对象所实现的接口。
例如:new Class<?>[] { MyInterface.class }。
InvocationHandler h:
这个参数是一个实现了InvocationHandler接口的对象,定义了代理实例的方法调用的实际处理逻辑。当你调用代理对象的方法时,调用会被转发到这个处理器的invoke方法。
InvocationHandler接口有一个invoke方法签名是 Object invoke(Object proxy, Method method, Object[] args) throws Throwable,你可以在这个方法中添加自定义的处理逻辑。
例如:new MyInvocationHandler(targetObject),其中targetObject是你希望代理的实际对象。
orderService o = (orderService)Proxy.newProxyInstance(
orderService.getClass().getClassLoader(),
orderService.getClass().getInterfaces(),
new myProxy(orderService));
————————————————

浙公网安备 33010602011771号