think

利用set进行动态实现值的注入


控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。

在spring中实现控制反转的是ioc容器,其实现方法是依赖注入


使用spring来创建对象,在spring这些称为bean


Bean工厂 BeanFactory ----它负责了对象的整个生命周期--创建、装配、销毁

ApplicationContext是BeanFactory的子接口

在基于Spring的Java EE应用中,所有的组件都被当成Bean处理,包括数据源,Hibernate的SessionFactory、事务管理器等。

一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文

ApplicationContext容器会在容器初始化时,会将其中的所有对象一次性装配好,以后用这些对象时只需要在内存中直接调用即可

应用程序上下文(Application Context)是Spring更先进的容器


xml配置的方式配置bean和建立bean之间的协作关系

然后通过应用上下文将配置加载到IOC容器,让Spring替我们管理对象,待我们需要使用对象的时候,再从容器中获取bean就ok了

//加载项目中的spring配置文件到容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取对象实例
Man man = context.getBean(Man.class);

bean对象什么时候初始化的?、

BeanFactory :这是一个工厂,用于生成任意bean。

采取延迟加载,第一次getBean时才会初始化Bean

ApplicationContext:是BeanFactory的子接口,功能更强大。(国际化处理、事件传递、Bean自动装配、各种不同应用层的Context实现)。当配置文件被加载,就进行对象实例化。


MyBatis - 映射配置文件 :

Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心

Mybatis 提供了 Mapper接口的代理对象,在执行 Mapper接口方法时,实际执行的是Mybatis的代理对象,代理对象在 invoke 方法内获取 Mapper接口类全名+方法全名 作为statement的ID,然后通过ID去Statement匹配注册的SQL,然后使用 SqlSession 执行这个 SQL。

https://www.jb51.net/article/116402.htm

 实现这样的功能前提是映射文件和接口主文件名相同,且在同一个包下,映射文件的命名空间是接口的全限定名。

<!-- 注册映射文件(批量注册映射文件,注册com.ghq.model.dao下的所有配置文件) -->
<mappers>
    <package name="com.ghq.model.dao"/>
</mappers>

https://www.cnblogs.com/ghq120/p/8322302.html


<!--加载mybatis映射配置的扫描,将其作为spring的bean进行管理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.itheima.dao"/>
</bean>

项目会自动帮我们扫描配置的包名下的接口来生成映射器,并且完成映射,也就是自己组装bean

猜想:应该是dao接口和映射文件一起生成

basePackage 属性是让你为映射器接口文件设置基本的包路径


  <!--spring整合mybatis后控制的创建连接用的对象-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.itheima.domain"/>
    </bean>

     <!--加载mybatis映射配置的扫描,将其作为spring的bean进行管理-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.itheima.dao"/>
    </bean>

对比

 is = Resources.getResourceAsStream("MyBatisConfig.xml");
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
            sqlSession = factory.openSession(true);
            //获取StudentMapper接口的实现类对象
            //获取对应的Mapper,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。
            //操作数据库主要是通过SQL语句,那么只要找到SQL语句然后执行不就可以
            //sqlSession.getMapper()的内部产生了StudentMapper的实现类,那怎么产生的呢?
            //动态代理
            /*
                被代理对象:真实的对象
                代理对象:内存中的一个对象
             */
            StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
            /*
                类加载器:和被代理对象使用相同的类加载器
                接口类型Class数组:和被代理对象使用相同接口
                代理规则:完成代理增强的功能
             */
            //通过代理对象调用方法,接收结果
            list = mapper.selectAll();
posted @ 2020-08-25 01:47  风冰水  阅读(241)  评论(0编辑  收藏  举报