• 6、spring注解学习(组件注册)——使用spring提供的FactoryBean(工厂bean)注入组件


    1、创建一个Color类

     2、再创建自定义工厂类(实现FactoryBean接口)

    //创建一个spring定义的FactoryBean
    public class ColorFactoryBean implements FactoryBean<Color> {
        
        //返回一个Color对象,这个对象会添加到容器中
        @Override
        public Color getObject() throws Exception {
            return new Color();
        }
    
        @Override
        public Class<?> getObjectType() {
            return Color.class;        //返回对象的类型
        }
        
        //设置这个返回的bean是单例还是多例,true:单例;false:多例
        @Override
        public boolean isSingleton() {
            return true;
        }
    
    }

    3、在spring配置类中注入自定义的工厂类

    @Configuration        //告诉Spring这是配置类
    public class MainConfig {
        
        /*
         * 这里注入的是colorFactoryBean
         * 在容器中通过id为colorFactoryBean获得bean时为该工厂的getObject返回的对象
         * 如果想获得这个工厂bean,则需要在查询时的id前面加一个&,即&colorFactoryBean
         */
        @Bean("colorFactoryBean")
        public ColorFactoryBean colorFactoryBean() {
            return new ColorFactoryBean();
        }
    }

    4、进行测试

        /**
         * 测试通过FactoryBean方式注入组件
         */
        @Test
        public void test03() {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
            Object bean = applicationContext.getBean("colorFactoryBean");
            System.out.println("bean的类型:"+bean.getClass());
        }

    输出结果:

    因为查询id为 colorFactoryBean所以默认是获取colorFactoryBean的getObject返回的对象,所以返回对象类型是com.atguigu.bean.Color

    若就是想获得这个colorFactoryBean工厂bean,则在查询id前加一个&

    即测试方法改为:

        /**
         * 测试通过FactoryBean方式注入组件
         */
        @Test
        public void test03() {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
            Object bean = applicationContext.getBean("&colorFactoryBean");
            System.out.println("bean的类型:"+bean.getClass());
        }

    输出结果为:

     加&后获得的是com.atguigu.bean.ColorFactoryBean

    再修改测试方法

        /**
         * 测试通过FactoryBean方式注入组件
         */
        @Test
        public void test03() {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
            Object bean1 = applicationContext.getBean("colorFactoryBean");
            Object bean2 = applicationContext.getBean("colorFactoryBean");
            System.out.println(bean1 == bean2);
        }

    输出

     因为在colorFactoryBean里面的isSingleton方法返回的是true,所以获得的对象是单例的

  • 相关阅读:
    BATJ面试必会之 Spring 篇(一)
    BATJ面试必会之Java IO 篇
    BATJ面试必会之并发篇
    如何学习JavaEE,项目又该如何做?
    面试官问你“有什么问题问我吗?”,你该如何回答?
    表单输入实时检测
    HTML5实现摇一摇
    加载音频Audio
    关于meta标签
    JS倒计时
  • 原文地址:https://www.cnblogs.com/lyh233/p/12439135.html
Copyright © 2020-2023  润新知