Mybatis的初始化和结合Spring Framework后初始化的源码探究

带着下面的问题进行学习:

(1)Mybatis 框架或 Spring Framework 框架对数据层 Mapper 接口做了代理,那是做了 JDK 动态代理还是 CGLIB 代理?

(2)Mapper 接口使用和不使用 @Mapper 注解有什么区别?

(3)Spring Framework 框架引入 Mybatis 的 jar 包后,Spring Framework 是怎么管理的?

(4)@MapperScan注解的作用是什么?

在探究上面的问题前,先了解什么是 FactoryBean,FactoryBean 和 BeanFactory有什么区别?

BeanFactory 是 Spring Framework 中的一个 Bean 工厂(AnnotationConfigApplicationContext、ClassPathXmlApplicationContext等),可以产生类,它有一个 getBean 方法可以获取到类;

FactoryBean 是一个 Bean,受 Spring Framework 管理的一个对象,定义 Bean 有好几种方式,比如 xml 的 标签,注解 @Bean、@Service 等;

下面是案例:实现 FactoryBean 接口,重写方法

public class TempBean {
public void query(){
System.out.println(“TempBean”);
}
}
复制代码
@Configuration(“MyFactroyBean”)
public class MyFactroyBean implements FactoryBean {
public void test() {
System.out.println(“MyFactroyBean MyFactroyBeanTest”);
}

@Override
public Object getObject() throws Exception {
    return new TempBean();
}

@Override
public Class<?> getObjectType() {
    return TempBean.class;
}

@Override
public boolean isSingleton() {
    return true;
}

}
复制代码
复制代码
public static void main(String[] args) {
AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(MyFactroyBean.class);
MyFactroyBean myFactroyBean = (MyFactroyBean) context.getBean("&MyFactroyBean");
myFactroyBean.test();
TempBean tempBean = (TempBean) context.getBean(“MyFactroyBean”);
tempBean.query();
}
//===结果
MyFactroyBean MyFactroyBeanTest
TempBean

复制代码
  如果你的类实现了 FactoryBean,那么 Spring 存在两个对象:

一个是 getObject() 返回的对象:当前类指定的名字;
    一个是当前类:"&"+当前类指定的名字;

当实现了 FactoryBean 后,Spring 在容器实例化过程中,会对项目中的自定义类进行实例化,当前类会被代理成一个 CGLIB 类(使用了@Configuration注解),当你获取当前类时,传递“&xx”,Spring 会进行判断,如果获取是当前类,返回代理类对象,如果是获取 getObject 返回的对象,会直接调用 getObject 方法中的 new xxx();

下面是Spring容器初始化时,在执行一些后置处理器(ConfigurationClassPostProcessor是对项目的 ComponentScan 注解的路径、@Configuration 注解的类进行扫描解析,超级重要的一个类)过程中,对实现了 FactoryBean 接口的子类进行代理:
  USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com

上一篇:Spring 为什么会有 FactoryBean?


下一篇:BeanFactory 和 FactoryBean 的区别