springboot beanfactory与factorybean
************************
相关类与接口
BeanFactory:对象工厂
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String var1) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(String var1, Class<T> var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> var1);
<T> ObjectProvider<T> getBeanProvider(ResolvableType var1);
boolean containsBean(String var1);
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;
String[] getAliases(String var1);
}
ApplicationContext:继承BeanFactory,spring 中常用该接口获取对象实例
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
@Nullable
String getId();
String getApplicationName();
String getDisplayName();
long getStartupDate();
@Nullable
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
ListableBeanFactory:继承BeanFactory接口
public interface ListableBeanFactory extends BeanFactory {
boolean containsBeanDefinition(String var1);
int getBeanDefinitionCount();
String[] getBeanDefinitionNames();
<T> ObjectProvider<T> getBeanProvider(Class<T> var1, boolean var2);
<T> ObjectProvider<T> getBeanProvider(ResolvableType var1, boolean var2);
String[] getBeanNamesForType(ResolvableType var1);
String[] getBeanNamesForType(ResolvableType var1, boolean var2, boolean var3);
String[] getBeanNamesForType(@Nullable Class<?> var1);
String[] getBeanNamesForType(@Nullable Class<?> var1, boolean var2, boolean var3);
<T> Map<String, T> getBeansOfType(@Nullable Class<T> var1) throws BeansException;
<T> Map<String, T> getBeansOfType(@Nullable Class<T> var1, boolean var2, boolean var3) throws BeansException;
String[] getBeanNamesForAnnotation(Class<? extends Annotation> var1);
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> var1) throws BeansException;
@Nullable
<A extends Annotation> A findAnnotationOnBean(String var1, Class<A> var2) throws NoSuchBeanDefinitionException;
}
HierarchicalBeanFactory:继承BeanFactory接口
public interface HierarchicalBeanFactory extends BeanFactory {
@Nullable
BeanFactory getParentBeanFactory();
boolean containsLocalBean(String var1);
}
FactoryBean:自定义对象创建过程
public interface FactoryBean<T> {
String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
@Nullable
T getObject() throws Exception;
//CustomFactoryBean实现FactoryBean接口,实例名称为:customFactoryBean
//getObject返回对象:object
//application.getBean("customFactoryBean")返回object
//application.getBean("&customFactoryBean")返回customFactoryBean实例
@Nullable
Class<?> getObjectType();
default boolean isSingleton() {
return true;
}
}
************************
示例
***************
pojo 层
Person
@Data
public class Person {
private Integer id;
private String name;
private Integer age;
}
***************
config 层
DataConfig
@Configuration
public class DataConfig {
@Bean
public Person initPerson(){
Person person=new Person();
person.setId(1);
person.setName("瓜田李下");
person.setAge(20);
return person;
} //person对象实例name:initPerson
}
CustomfactoryBean
@Component
public class CustomFactoryBean implements FactoryBean<Person> {
@Override
public Class<?> getObjectType() {
return Person.class;
}
@Override
public Person getObject() throws Exception {
Person person=new Person();
person.setId(2);
person.setName("海贼王");
person.setAge(20);
return person;
} //person实例会注入容器中,name:customFactoryBean
}
***************
controller 层
HelloController
@RestController
public class HelloController {
@Resource
private ApplicationContext applicationContext;
@Resource
private List<Person> personList;
@Resource(name = "&customFactoryBean")
private CustomFactoryBean customFactoryBean;
@Resource(name = "customFactoryBean")
private Person person;
@RequestMapping("/hello")
public String hello() throws Exception{
System.out.println(applicationContext.getBean("initPerson"));
//System.out.println(applicationContext.getBean(Person.class));
System.out.println(applicationContext.getBean("customFactoryBean"));
System.out.println(applicationContext.getBean("&customFactoryBean")+"\n");
personList.forEach(System.out::println);
System.out.println(customFactoryBean.getObject());
System.out.println(person);
return "success";
}
}
************************
使用测试
localhost:8080/hello,控制台输出:
Person(id=1, name=瓜田李下, age=20)
Person(id=2, name=海贼王, age=20)
com.example.demo.config.CustomFactoryBean@88aa1a2
Person(id=2, name=海贼王, age=20)
Person(id=1, name=瓜田李下, age=20)
Person(id=2, name=海贼王, age=20)
Person(id=2, name=海贼王, age=20)