mybatis MapperFactoryBean模拟
时间:2020-04-17
本文章向大家介绍mybatis MapperFactoryBean模拟,主要包括mybatis MapperFactoryBean模拟使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
模拟MapperFactoryBean实现对接口的代理,相关代码如下:
@Data
public class PersonInfo {
private int id;
private String name;
private int age;
}
public interface PersonMapper {
@Results(id = "personMap", value = {@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"), @Result(property = "age", column = "age")})
@Select("select * from person where name=#{name}; ")
public PersonInfo selectByName(String personName);
@Select("select * from person;")
@ResultMap(value = "personMap")
public List<PersonInfo> selectAll();
}
@Retention(RetentionPolicy.RUNTIME)
@Import(MyBeanDefinitionRegistrar.class)
public @interface MyBatisMonitor {}
@Configuration
@ComponentScan(value = "xyz.xxx.demo.config")
@MyBatisMonitor
public class DemoConfig {}
public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition();
AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
beanDefinition.setBeanClass(MyMapperFactoryBean.class);
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(PersonMapper.class);
registry.registerBeanDefinition("personMapper", beanDefinition);
}
}
public class MyMapperFactoryBean implements FactoryBean, InvocationHandler {
public Class clazz;
public MyMapperFactoryBean(Class clazz) {
this.clazz = clazz;
}
@Nullable
@Override
public Object getObject() throws Exception {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] {clazz}, this);
}
@Nullable
@Override
public Class<?> getObjectType() {
return clazz;
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.println(clazz.getName() + ">>>>>>>>>>>>>>>>>>>>>>>>>>>> proxy invoke!");
return clazz;
}
}
public class MybatisDemoApplication {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext annotationConfigApplicationContext =
new AnnotationConfigApplicationContext(DemoConfig.class);
PersonMapper personMapper = (PersonMapper)annotationConfigApplicationContext.getBean("personMapper");
System.out.println(">>>>>>>>>");
}
}
原文地址:https://www.cnblogs.com/leifonlyone/p/12720323.html
- TEST LAB V8在线渗透实验室教程(三)
- CMQ请求域名
- 在Entity Framework中使用存储过程(一):实现存储过程的自动映射
- 在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?
- 表单控件的副产品——查询控件
- 表单控件续(1)——应用接口来简化和分散代码
- 通过自定义配置实现插件式设计
- 让IoC动态解析自定义配置(提供基于Unity的实现)
- 如何让ASP.NET默认的资源编程方式支持非.ResX资源存储
- 在VS中通过建立依赖关系使文件结构更清晰
- 一个关于ConfigurationManager.GetSecion方法的小问题
- 追踪记录每笔业务操作数据改变的利器——SQLCDC
- 一个完整的用于追踪数据改变的解决方案
- C# 4.0新特性-"协变"与"逆变"以及背后的编程思想
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释