zoukankan      html  css  js  c++  java
  • 从SqlSessionFactoryBean的引用浅谈spring两种bean模式

    mybatis是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory可以通过SqlSessionFactoryBuilder获得实例。使用mybatis-spring时,session创建,可以让SqlSessionFactoryBean来替代。

    <bean name="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="*"/>
            <property name="configLocation" value="classpath:/*.xml"/>
        </bean>

    普通自定义bean

    <bean name="demoService" class="com.***.*"/>

    虽然通过<bean>标签标识,但与自己定义的bean有很大区别。spring的bean分为二种普通bean和工厂bean,即FactoryBean。二者都有是由spring容器管理。SqlSessionFactoryBean就属于第二种bean,

    SqlSessionFactoryBean是一个实现了spring的FactoryBean接口(implements FactoryBean<SqlSessionFactory>)的类。

    接口FactoryBean只有三个方法
    T getObject()
    Class<?> getObjectType();
    boolean isSingleton(); 设置是否为单例

    区别是:工厂bean返回并不是指定类的实例,而是FactoryBean的方法getObejct()返回的实例。

    这就说明了由 Spring 最终创建的 bean 不是 SqlSessionFactoryBean 本身 。 而是工厂类的 getObject()返回的方法的结果。正确的引用是 private SqlSessionFactory sqlSessionFactoryBean。

    参考以下代码:

    @Component("demoService")
    public class DemoService implements FactoryBean<Demo>{
        @Override
        public Demo getObject() throws Exception {
            return new Demo();
        }

        @Override
        public Class<?> getObjectType() {
            return Demo.class;
        }

        @Override
        public boolean isSingleton() {
            return true;
        }
    }

    public static void main(String[] args) {
            ApplicationContext context=new AnnotationConfigApplicationContext("com.test");
            Object obj1 = context.getBean("demoService");
            Object obj2 = context.getBean("&demoService");
            System.out.println(obj1.getClass());//class com.test.Demo
            System.out.println(obj2.getClass());//class com.test.DemoService
        }

     当使用ApplicationContext的getBean()方法获取FactoryBean实例本身而不是它所产生的bean,则要使用&符号+id。比如,现有FactoryBean,它有id,在容器上调用getBean("demoService")将返回FactoryBean所产生的bean,调用getBean("&demoService")将返回FactoryBean它本身的实例。

  • 相关阅读:
    git rebase 还是 merge的使用场景最通俗的解释
    漏洞复现:Struts2 远程代码执行漏洞(S2-033)
    linux临时网络配置
    漏洞复现:Struts2 S2-032 漏洞环境
    XXE攻击学习
    启用了不安全的HTTP方法【转】
    HTTP参数污染【转】
    逻辑漏洞挖掘方式
    大漏洞时代下的僵尸网络追踪-笔记
    markdown入门杂记
  • 原文地址:https://www.cnblogs.com/song27/p/9373881.html
Copyright © 2011-2022 走看看