Spring中将BeanDefinition注册到IOC容器中

Spring中将BeanDefinition注册到IOC容器中

  • XML配置元信息

    • <bean name=”…” … />
  • 注解:

    • @Bean,@Component,@Import
  • 命名:

    • BeanDefinitionRegistry#registerBeanDefition
  • 非命名

    • BeanDefinitionReaderUtils#registerWithGeneratedName
  • AnnotatedBeanDefinitionReader#register

RumenzA

package com.rumenz;
public class RumenzA {

    private String id;
    private String name;
    
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "RumenzA{" +
                "id='" + id + '/'' +
                ", name='" + name + '/'' +
                '}';
    }
    public  RumenzA() {
        System.out.println("RumenzA 无参构造方法");
    }

}

XMl配置元信息

<bean id="rumena" class="com.rumenz.RumenzA"/>

@Bean,@Component,@Import 注解

package com.rumenz;


@Import(DemoApplication.Config.class)
public class DemoApplication {
    public static  void main(String[] args) {
       AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();
       ac.register(DemoApplication.class);
       ac.refresh();

       System.out.println("RumenzA类"+ac.getBeansOfType(RumenzA.class));
       System.out.println("Config类"+ac.getBeansOfType(Config.class));
       System.out.println("DemoApplication类"+ac.getBeansOfType(DemoApplication.class));
       ac.close();
    }
    @Component
    public static class Config{
       @Bean
       public RumenzA rumenza(){
          RumenzA r=new RumenzA();
          r.setId("1");
          r.setName("入门小站");
          return r;
       }
    }

}

BeanDefinitionRegistry#registerBeanDefinition

BeanDefinitionReaderUtils#registerWithGeneratedName

package com.rumenz;


@Import(DemoApplication.Config.class) //1.注解方式
public class DemoApplication {
    public static  void main(String[] args) {

       AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();
       //ac.register(DemoApplication.class); //1.注解方式
       // 2.BeanDefinitionReaderUtils#registerWithGeneratedName,BeanDefinitionRegistry#registerBeanDefinition
       registryBeanDefinition(ac,"rumenz");
       registryBeanDefinition(ac,null);
       ac.refresh();

       System.out.println("RumenzA类"+ac.getBeansOfType(RumenzA.class));

       ac.close();
    }

    private static void registryBeanDefinition(BeanDefinitionRegistry reg,String beanName){
        BeanDefinitionBuilder builder= BeanDefinitionBuilder.genericBeanDefinition(RumenzA.class);
        builder.addPropertyValue("id","1").addPropertyValue("name","入门小站");
        if(StringUtils.isEmpty(beanName)){ //非命名
            BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(),reg);

        }else{
            //命名
            reg.registerBeanDefinition(beanName,builder.getBeanDefinition());
        }

    }
    @Component //1.注解方式
    public static class Config{
       @Bean //1.注解方式
       public RumenzA rumenza(){
          RumenzA r=new RumenzA();
          r.setId("1");
          r.setName("入门小站");
          return r;
       }
    }

}

AnnotatedBeanDefinitionReader#register

  • register –>>this.reader.register
  • this.reader –>>private final AnnotatedBeanDefinitionReader reader;
AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext();
ac.register(DemoApplication.class);

Spring中将BeanDefinition注册到IOC容器中

源码: https://github.com/mifunc/Spr…

原文: https://rumenz.com/rumenbiji/Spring-registerBeanDefinition.html

原文 

https://segmentfault.com/a/1190000023031750

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring中将BeanDefinition注册到IOC容器中

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址