ewProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
}
可以看到底层是通过JDK动态代理Proxy生成的,InvocationHandler是MapperProxy类。
清楚原理之后,我们对上面的实例做下改造,把Mybatis的引用简化。
@Configuration
public class DemoConfiguraion {
@Bean
public FactoryBean<DemoMapper> getDemoMapper() {
return new FactoryBean<DemoMapper>() {
@Override
public DemoMapper getObject() throws Exception {
InvocationHandler invocationHandler = (proxy, method, args) -> {
System.out.println("调用动态代理方法" + method.getName());
return Collections.singletonList(new HashMap<String, Object>());
};
return (DemoMapper) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] {DemoMapper.class}, invocationHandler);
}
@Override
public Class<?> getObjectType() {
return DemoMapper.class;
}
@Override
public boolean isSingleton() {
return true;
}
};
}
}
上面的代码可达到与Mapper同样的效果,大家可以本地随便玩哈。