带着下面的问题进行学习:
(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