zoukankan      html  css  js  c++  java
  • 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()方法.

  • 相关阅读:
    Hashmap
    string字符串分词
    关于链表的几道经典例题
    【C语言】链表(LinkedList)的建立与基本操作
    01迷宫
    2019 数学联赛 题解 / 游记
    一种简单方法构造 n 元有限域
    Python逆向某网站之 AES解密数据
    我发现了一个网站Bug,然后反馈了
    在多线程中使用静态方法是否有线程安全问题
  • 原文地址:https://www.cnblogs.com/xingjia/p/11210826.html
Copyright © 2011-2022 走看看