zoukankan      html  css  js  c++  java
  • 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();
    
    镜花水月
  • 相关阅读:
    启动窗体的程序控制与动画效果
    在线程中使用定时器
    从oracle9i/92数据库中导出数据至 oracle 8.1.7 数据库中
    收集:PowerDesigner常见问题解决与设置集锦
    [转]C# 2.0新特性与C# 3.5新特性
    COM服务器的创建过程
    [原创] 为什么需要TLS(Thread Local Storage)?
    COM+服务器的.Net组件实现 客户端
    如何在客户端避免繁冗的服务器GUID定义及导入?
    进程、线程、套间和环境
  • 原文地址:https://www.cnblogs.com/fengbingshui/p/13557502.html
Copyright © 2011-2022 走看看