Spring注解开发(五)——使用FactoryBean注册组件

使用spring提供的FactoryBean注册对象需注意:

1.默认获取到的是工厂bean调用getObject方法创建的对象;

2.如果要获取工厂bean本身,需要给id前加一个&

package com.cjian.bean;

import org.springframework.beans.factory.FactoryBean;

/**
 * @description:
 * @author: CJ
 * @time: 2020/10/28 21:02
 */
public class ColorFactoryBean implements FactoryBean<Color> {
    @Override
    public Color getObject() throws Exception {
        System.out.println("ColorFactoryBean getObject ...");
        return new Color();
    }

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

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

 配置类:

package com.cjian.config;

import com.cjian.bean.Color;
import com.cjian.bean.ColorFactoryBean;
import com.cjian.bean.Person;
import com.cjian.bean.Red;
import com.cjian.condition.LinuxCondition;
import com.cjian.condition.MyImportBeanDefinitionRegistrar;
import com.cjian.condition.MySelector;
import com.cjian.condition.WindowsCondition;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * @description:
 * @author: CJ
 * @time: 2020/10/28 9:32
 */
@Conditional({WindowsCondition.class})
@Configuration //告诉spring这是一个配置类
@ComponentScans(value = {
    @ComponentScan(value = "com.cjian")
})
@Import({Color.class, Red.class, MySelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig {

    @Bean("person")
    public Person person01() {
        return new Person("cjian", 27);
    }

    //@Conditional 按照一定的条件进行判断,满足条件才给容器中注册bean,这也是springboot底层大量使用的注解
    @Bean("Bill")
    public Person person02() {
        return new Person("Bill gates", 62);
    }
    @Conditional({LinuxCondition.class})
    @Bean("linus")
    public Person person03() {
        return new Person("linus", 48);
    }

    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }
}

测试类:

package com.cjian;

import com.cjian.bean.Blue;
import com.cjian.config.MainConfig;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @description:
 * @author: CJ
 * @time: 2020/10/28 9:44
 */
public class Test {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
            MainConfig.class);

        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (String name : beanDefinitionNames) {
            System.out.println("===>"+name);
        }

        System.out.println(annotationConfigApplicationContext.getBean(Blue.class));

        System.out.println("bean的类型1:"+annotationConfigApplicationContext.getBean("colorFactoryBean"));
        System.out.println("bean的类型2:"+annotationConfigApplicationContext.getBean("&colorFactoryBean"));

    }


}

输出:

===>org.springframework.context.annotation.internalConfigurationAnnotationProcessor
===>org.springframework.context.annotation.internalAutowiredAnnotationProcessor
===>org.springframework.context.annotation.internalCommonAnnotationProcessor
===>org.springframework.context.event.internalEventListenerProcessor
===>org.springframework.context.event.internalEventListenerFactory
===>mainConfig
===>personController
===>personDao
===>personService
===>com.cjian.bean.Color
===>com.cjian.bean.Red
===>com.cjian.bean.Blue
===>com.cjian.bean.Yellow
===>person
===>Bill
===>colorFactoryBean
===>rainbow
com.cjian.bean.Blue@d83da2e
ColorFactoryBean getObject ...
bean的类型1:com.cjian.bean.Color@a4102b8
bean的类型2:com.cjian.bean.ColorFactoryBean@11dc3715

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值