使用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