- 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
- java.lang.reflect.Proxy#newProxyInstance之中有三个参数
- 整合过程:
- @SpringBootApplication
- 1、@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。
- 2、@EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。
- 3、@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。
Mybatis和Spring主流框架结合
猜你喜欢
转载自blog.csdn.net/wzEminem/article/details/94437203
今日推荐
周排行