• 从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它本身的实例。

  • 相关阅读:
    20220215
    20220209
    20220211
    20220208
    todolist3
    OAuth2
    happedbefore
    字符串处理1
    命令模式1
    SpringSecurity与Jwt验证
  • 原文地址:https://www.cnblogs.com/song27/p/9373881.html
Copyright © 2020-2023  润新知