Mybatis和Spring主流框架结合

  • Mybatis:
    • 整合过程:
      • 在application.properties中填写datasource:

      • 在mybatis—config.xml中填写具体设置信息:

      • dao层写接口和sql语句,加入@Mapper
    • @Mapper 只要是为mapper或者dao产生了一个代理对象,代理对象实现了dao,从而实现里代理接口方法,主要就是查询数据,被代理对象实际方法就是@Insert其中的语句。

    • Mybatis实现:
      • java.lang.reflect.Proxy#newProxyInstance之中有三个参数

        • ClassLoader loader,dao只是一个接口,并没有直接提供类,只用当前类的加载器加载字节码 ,通过反射机制获取对象 当前类.class.getClassLoader();
        • Class<?>[] interfaces,代理对象到底实现那个类的接口,new Class[]{dao.class}
        • Proxy通过使用InvocationHandler对象生成具体的代理代理对象,每个dao的被代理都有一个像关联的InvocationHandler,当被代理的对象方法调用,代理会转发给内部的InvocationHandler实现类,调用invoke方法处理(1、得到数据库连接JDBC;2、拿到注解对象的sql语句)

        • InvocationHandler h:上面的整个InvocationHandler的实现类;
      • Spring容器如何管理系统自动生成的代理对象,依赖注入(加注解和xml都是把一个类交给spring去管理,然后系统new,交给自己使用;即使交给spring处理,他也不会帮你生成代理对象)
        • @bean
        • ac.getBeanFactory.registerSington("xxx",dao)
        • 一个springBean必须有你spring的完整生命周期
          • 只要一个类满足spring的注解规范(@Service;@Compent。。。。。),就会在Spring容器上下文初始化的过程中扫描所有符合的类@SpringBootApplication()
          • 当其扫描到符合条件的类的时候, spring会在内部new一个GenericBeanDefiinition对象存储扫描到的类的信息,会将这个GenericBeanDefiinition,放入到DefaultListableBeanFactory的beanDefinitionMap中,再判断是否调用了一些后置处理器对BeanDefiinition进行修改或者扩展,然后更新map,调用preInstantiateSingletons() 方法调用BeanDefiinitionmap中的对象信息,完成对象实例化,放在spring容器中。
        • FactoryBean的实现类,会重写两个方法getObject(在整个方法中new 出来的对象会直接交给spring容器进行管理)和getObjectType,当直接冲beanFactory中getbean,只会返回getObject中的对象,加一个&,才会现实FactoryBean的实现类对象。dao的代理对象就正在创建出来可以被使用了。
        • FactoryBean的实现类通过在sping中通过@Component注入容器,其中有MapperFactoryBean来完成上述功能,但就是来一个dao,就要被指一个MapperFactoryBean
        • 搜索多个dao,就不能将MapperFactoryBean写死, 而直接传入一个参数进行不同dao的实例注入;但就不能@Component-,因为spring管理直接new的化就不能传入参数,此时使用Spring.xml进行参数实例注入。但多个dao还是需要多个xml的配置。

        • 这就是需要扫描,就不需要再xml中配置MapperFactoryBean,此时ImportBeanDefinitonRegisStart这个接口的实现类(由@Import(ImportBeanDefinitonRegisStart实现类.Class))来完成,其中需要重写的方法registerBeanDefinitions; 需要将MapperFactoryBean注册到BeanDefiinition,此时spring容器就可以实例化MapperFactoryBean。动态参数怎么传入?
        • 给MapperFactoryBean提供构造方法传参,但spring无法知道传什么样的class文件给这个构造函数;需要在ImportBeanDefinitonRegisStart实现类指定构造方法的参数,BeanDefiinition在创建的过程中,会得到今后可能实例化需要传入构造方法的参数 (两个一定参数,只需要循环dao包下的class类就可以了)

        • 由@Import(ImportBeanDefinitonRegisStart实现类.Class),实现MapScan

  • @SpringBootApplication
    • 1、@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。
    • 2、@EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。
    • 3、@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。

猜你喜欢

转载自blog.csdn.net/wzEminem/article/details/94437203