给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
AAA{id=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);
    }

运行结果

原文地址:https://www.cnblogs.com/mingyuan1031/p/11302274.html

时间: 2024-10-08 02:03:21

给spring容器注册组件的相关文章

spring注解之组件注册

1.组件注册是什么? spring组件有十几种,但核心的只有三个:Context.Core和Bean. 那么这三个组件的关系是什么呢? -Context:容器 -Core :关系 -bean:实物 -一句话:在springIOC运行容器(Context)中,通过Core建立维护各个bean之间的关系. 我们所说的组件注册其实就是:把bean对象交给ioc容器管理 2.组件注册几种方式: [email protected]给容器注册组件 @Configuration public class My

(转)Spring读书笔记-----使用Spring容器(二)

一.使用ApplicationContext 前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFactory的功能. ApplicationContext允许以声明式方式操作容器,无须手动创建它.在Web应用启动时自动创建ApplicationContext.当然,也可以采用编程方式创建ApplicationContext. 除了提供BeanFactory所支持的全部功能外,Applicatio

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

spring容器中注册组件的两种方式: xml配置文件方式 注解方式 1.xml配置文件方式 编写bean类 使用xml文件配置bean注入到spring容器 通过ClassPathXmlApplicationContext类获取bean 1.1.编写bean类 package com.jcon.entity; /** * @author Jcon * @version V1.0 * @Description: (用户实体类) * @date 2019年01月28日 */ public clas

Spring应用于组件注册的注解(一)

在将Spring框架应用于项目开发中时,繁多的xml配置文件会使项目的维护升级变得困难,特别是项目很大时,有时候会花掉大量的时间去定位相应的组件配置.为了解决这个问题,引入Spring框架中的强大注解变得很重要,同时,注解的学习更是为后期学习Spring Boot做好了铺垫. @Configuration @Configuration注解用于定义配置类,并用于构建bean定义,初始化Spring容器,被标注的类类似于Spring的xml配置文件中的标签. @Bean 给容器注册一个Bean:类型

【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十)(未更新) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一)(未更新) 对于IOC的原理,我们曾经写过一篇博文,[SSH进阶之路

对象无法注册到Spring容器中,手动从spring容器中拿到我们需要的对象

当前对象没有注册到spring容器中,此时无法new object()  的方式创建对象,否则所有@Autowired 注入的对象都为null; 处理方式: 手动创建一个类@Component注册到Spring容器  并实现ApplicationContextAware 接口,实现对象方法,完成获取spring容器的通道,再通过通道获取我们所需要的对象,此对象里面关联注入的其他对象都正常,可以正常使用了 /** * 用于手动获取spring无法注册的对象 */ @Component public

springBoot中怎么减少if---else,怎么动态手动注册类进入Spring容器

由于业务中经常有需要判断的if--eles操作,层层嵌套,看起来程序的可读性太差,结合策略模式进行改造 方法一.一般有策略模式  +  工厂模式进行代码的优化,减少 if---else: 方法二.还有就是利用策略模式  +  SpringBoot提供的某些类  进行包装 本次介绍采用方法二的方式,大概的思路是: 1.策略模式:将所有同类型的操作抽象出来一个接口(这个接口包含一个动作方法) 和 一个实现了接口的抽象类(不实现方法):2.根据需求,将同类型的操作抽象成一个一个产品,继承第一步的抽象类

Ioc容器Autofac系列(3)-- 三种注册组件的方式

简单来说,所谓注册组件,就是注册类并映射为接口,然后根据接口获取对应类,Autofac将被注册的类称为组件. 虽然可像上篇提到的一次性注册程序集中所有类,但AutoFac使用最多的还是单个注册.这种注册共有三种方式,其中最简单的就是用As方法,例如,ArrayList继承了IEnumerable接口,若将其注册到Autofac中,写法如下所示: 双击代码全选 1 2 3 4 5 ContainerBuilder builder = new ContainerBuilder();         

基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - 静态资源.视图和消息器>两篇博文的介绍,我们已经配置好了Spring所需的基本配置.在这边博文中,我们将介绍怎么使用这些配置到实际项目中,并将web.xml文件替换为一个Java类. 我们使用Java代码来配置Spring,目的就是使我们的这些配置能够复用,对于这些配置的复用,我们采用继承和引入来实现