• Spring注解驱动第七讲--使用FactoryBean注册组件


    在实际开发中也可以使用Spring提供的工厂bean来注册组件

    首先创建工厂bean的实现

    /**
     * 泛型T即为通过工厂bean获得的bean对象
     *
     */
    public class ColorFactory implements FactoryBean<Color> {
        /**
         * 容器通过工厂bean的getObject方法获得要加载的bean
         */
        public Color getObject() throws Exception {
            return new Color();
        }
        /**
         * 返回要在ioc容器中的bean的类型
         */
        public Class<?> getObjectType() {
            // TODO Auto-generated method stub
            return Color.class;
        }
        /**
         * 设置bean对象在容器里面是否是单例
         * 返回为true:单例的
         * 返回为flase:多例的
         */
        public boolean isSingleton() {
            return false;
        }
    }

    在主配置类中通过@Bean注解将ColorFactory注册到容器中

    @Configuration
    public class MainConfig2 {
        //方法名为默认id
        @Bean
        public ColorFactory getColorFactory() {
            return new ColorFactory();
        }
    }

    在测试类中我们通过获取容器中组件id的方式获取容器中的bean对象

    public class IOCTest {
        @Test
        public void test4() {
            ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
            Object colorFactory = applicationContext.getBean("getColorFactory") ;
            System.out.println(colorFactory);
        }
    }

    运行结果:

    com.wxj.bean.Color@57d5872c

    我们发现容器中存在的并不是ColorFactory对像,而是Color对象.通过观察可知,容器通过工厂bean的getObject()方法返回的对象来进行创建并注册到容器中.

    那么如果非要获取ColorFactory对象,应该怎么获取呢?需要在获取bean的id名称前添加一个"&"符即可.

    public class IOCTest {
        @Test
        public void test4() {
            ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
            Object colorFactory = applicationContext.getBean("&getColorFactory") ;//"&"可获得工厂bean对象
            System.out.println(colorFactory);
            
        }
    
    }

    运行结果:

    com.wxj.ColorFactory@57d5872c

    扩展:

      在使用单实例的时候,getObject方法只会被调用一次,而在多实例的情况下每次获取bean都会调用getObject()方法.

  • 相关阅读:
    Objects类源码详解(基于jdk1.8.0_261)
    Object类源码详解(基于jdk1.8.0_261)
    Collections工具类源码详解(基于jdk1.8.0_261)
    版本控制神器——git的基本使用
    数据结构练习1~插入排序~
    求指错啊急是求幂的
    编完了个代码大家给看看还能不能精简
    关于KMP算法
    有网友建议写一个新手指南或者FAQ一类的置顶你们认为呢
    c语言新手编程错误求解
  • 原文地址:https://www.cnblogs.com/xingjia/p/11210826.html
Copyright © 2020-2023  润新知