给spring容器注册组件

Posted mingyuan1031

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给spring容器注册组件相关的知识,希望对你有一定的参考价值。

/**
     * 给容器中注册组件;
     * 1)、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]
     * 2)、@Bean[导入的第三方包里面的组件]
     * 3)、@Import[快速给容器中导入一个组件]
     *         1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
     *         2)、ImportSelector:返回需要导入的组件的全类名数组;
     *         3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中
     * 4)、使用Spring提供的 FactoryBean(工厂Bean);
     *         1)、默认获取到的是工厂bean调用getObject创建的对象
     *         2)、要获取工厂Bean本身,我们需要给id前面加一个&
     *             &colorFactoryBean
     */

 

在spring容器中,给容器注册组件的常用的方式概括起来有四种:

  第一种,使用包扫描的方法注册,使用@ComponentScan注解或者@ComponentScans注解,对使用@Component注解的类进行注册,其中@Controller @Service等注解是组合注解,其内部含有@Component。

  第二种,在配置信息种注册bean,在含有@Configuration的配置类中使用@Bean注解进行注册

  第三种,是通过@Import注解注册,有三种注册方式,1、直接加载类名进行注册,2、实现 ImportSelector接口中的 selectImports方法,3、实现 ImportBeanDefinitionRegistrar接口中的 registerBeanDefinitions方法,我们重点描述后两种,好了,还是直接上代码吧。

public class MyImportSelector implements ImportSelector 
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) 
        return new String[]"com.yuan.model.AAA";
    
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar 
    /*
    AnnotationMetadata:当前的注解信息
    BeanDefinitionRegistry:BeanDefinition的注册类
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) 
        boolean b = registry.containsBeanDefinition("com.yuan.model.AAA");
        if (b)
        
            //制定bean的定义信息 (bean的类型)
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(BBB.class);
            //注册一个bean。制定bean名
            registry.registerBeanDefinition("b",rootBeanDefinition);
        
    
public class MyApp 
    public static void main(String[] args) 
        AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class);
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for (String bean:beanDefinitionNames)
        
            System.out.println(bean);
        
        AAA bean = context.getBean(AAA.class);
        System.out.println(bean);
    

运行结果:

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
myConfig
com.yuan.model.AAA
b
AAAid=1, name=‘123456‘

AAA类和b都已注册到了spring容器中。

  第四种,实现 FactoryBean接口,实现其方法

  

public class CCCFactoryBean implements FactoryBean 

    //返回是否单例
    @Override
    public boolean isSingleton() 
        return true;
    


    //返回一个CCC的对象,加载到容器中
    @Override
    public Object getObject() throws Exception 
        System.out.println("CCCFactoryBean ...");
        return new CCC();
    

    //返回类型
    @Override
    public Class<?> getObjectType() 
        return CCC.class;
    
public class MyConfig 

    @Bean
    public CCCFactoryBean cccFactoryBean()
        return new CCCFactoryBean();
    
 public static void main(String[] args) 
        AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class);
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for (String bean:beanDefinitionNames)
        
            System.out.println(bean);
        
        AAA bean = context.getBean(AAA.class);
        System.out.println(bean);
        Object cCCFactoryBean = context.getBean("cccFactoryBean");
        System.out.println(cCCFactoryBean);
        Object cCCFactoryBean1 = context.getBean("&cccFactoryBean");
        System.out.println(cCCFactoryBean1);
    

运行结果技术图片

技术图片

 

以上是关于给spring容器注册组件的主要内容,如果未能解决你的问题,请参考以下文章

spring组件注册

往Spring容器中注册组件的方式

往Spring容器中注册组件的方式

Spring——往容器中注册组件的方法总结

@Configuration和@bean给容器中注册组件

spring 注解驱动开发组件注册