springboot beanfactory与factorybean


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)

                  

                      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值