小编在博文《Spring Bean是什么》中介绍了Bean的基本概念,这里详细地介绍如何注册bean。

1、包扫描@ComponentScan+组件标注注解

  适用场景:可以通过该方式把我们自己写的组件加载到容器中。使用注解@CompentScan进行包扫描,将带有@Controller、@Service、@Respository和@Compent注解的类扫描到IoC容器中。

  包扫描不是必须的,指定包名后以指定的包名为准,比如指定包名为a:@ComponentScan("a"),即使b包中有标注@Controller等注解的bean,它也不注册。包扫描注解除了默认的方法value(),还包括如下方法:

basePackages(): 指定扫描的包名(前缀)。

basePackageClasses():如果指定为A.class,那么会扫描A类所在包的类。

includeFilters():将所指定的类注入容器。

excludeFilters():将所指定的类排除。

2、通过@Bean导入组件

  适用于导入第三方组件的类。 可以放在方法和注解上,一般放在标有@Configuration类中的方法上。更多详细信息请戳我

3、通过@Import导入组件

  需要注意的是,被导入组件的ID默认是全类名。

3.1、导入类

@Configuration @Import(value = {Person.class, Car.class})
public class MainConfig {
}

3.2、导入ImportSeletor类实现组件

public class MyImportSelector implements ImportSelector {
//可以获取导入类的注解信息
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.my.testimport.compent.Car"};
}
} @Configuration
@Import(value = {Person.class, Car.class, MyImportSelector.class})
public class MainConfig {
}

  Spring Boot的自动注入就是用了这种方式。

3.3、导入实现 ImportBeanDefinitionRegister接口类的组件

public class MyBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//创建一个bean定义对象
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Cat.class);
//把bean定义对象导入到容器中
registry.registerBeanDefinition("cat",rootBeanDefinition);
}
}
@Configuration
@Import(value = {Person.class, Car.class, MyImportSelector.class, MyBeanDefinitionRegister.class})
public class MainConfig {
}

  AOP的实现注册类AutoProxyRegistrar就是实现了ImportBeanDefinitionRegister类。

4、通过实现FacotryBean接口注册组件

@Component
public class CarFactoryBean implements FactoryBean<Car> {
//返回bean的对象
@Override
public Car getObject() throws Exception {
return new Car();
}
//返回bean的类型
@Override
public Class<?> getObjectType() {
return Car.class;
}
//是否为单利
@Override
public boolean isSingleton() {
return true;
}
}

  Spring获取对象时,返回的是getObject方法返回的对象,要想返回fanctoryBean对象,需要在获取对象名前加上&符号,即 getBean("carFactoryBean" )返回car对象,getBean("&carFactoryBean" )返回CarFactoryBean 对象。

public class App {
public static void main(String[] args) {
//读取注解
ApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(MyConfig2.class);
String[] names= applicationContext1.getBeanDefinitionNames();
for (String name:names){
System.out.println(name); //这里输出的类的全类名
}
}
}

结束语

  那么大家对于这件事都是怎么看的呢?欢迎在文章下方留言讨论!三人行必有我师焉!小编每条都会仔仔细细地看。

Spring IoC容器添加组件的方式的更多相关文章

  1. spring IOC容器实例化Bean的方式与RequestContextListener应用

    spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...

  2. SpringBoot系列之Spring容器添加组件方式

    SpringBoot系列之Spring容器添加组件方式 本博客介绍SpringBoot项目中将组件添加到Spring容器中的方法,SpringBoot项目有一个很明显的优点,就是不需要再编写xml配置 ...

  3. 整理在Spring IOC容器初始化后可以处理特定逻辑的多种实现方式

    Spring框架的核心是依赖注入.切面:Spring Boot是在Spring框架的基础上为其提供许多默认配置.默认约定(约定优于配置),从而达到减少或减化配置进而可开箱即用.快速上手:Spring ...

  4. Spring IOC容器装配Bean_基于注解配置方式

    bean的实例化 1.导入jar包(必不可少的) 2.实例化bean applicationContext.xml(xml的写法) <bean id="userDao" cl ...

  5. 对Spring IoC容器实现的结构分析

    本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...

  6. Spring IOC 容器源码分析

    声明!非原创,本文出处 Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 S ...

  7. Spring源码剖析2:Spring IOC容器的加载过程

    spring ioc 容器的加载流程 1.目标:熟练使用spring,并分析其源码,了解其中的思想.这篇主要介绍spring ioc 容器的加载 2.前提条件:会使用debug 3.源码分析方法:In ...

  8. Spring源码剖析3:Spring IOC容器的加载过程

    本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

  9. Spring IOC容器源码分析

    注:本文转自https://javadoop.com/post/spring-ioc Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容 ...

  10. 纯注解快速使用spring IOC容器

    使用spring的ioc容器实现对bean的管理与基本的依赖注入是再经典的应用了.基础使用不在详述. 这里主要介绍下使用注解实现零配置的spring容器.我相信你也会更喜欢使用这种方式.Spring ...

随机推荐

  1. PHP开发技巧:如何实现数据过滤功能

    输入过滤 输出过滤 1.输入过滤 1.1前端验证 JavaScript的方式,正则等,(略) 1.2后端验证 1.2.1 使用filter_var函数 PHP提供了filter_var函数用于过滤和验 ...

  2. kubeadm安装kubernetes

    kubeadm安装kubernetes kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具. 这个工具能通过两条指令完成一个 kubernetes 集群的部署: $ k ...

  3. 如何通过物理备份将线下SQL Server迁移到阿里云RDS for SQL Server

    简介   物理备份迁移是将SQL Server数据库迁移至阿里云RDS的推荐方法.此方案能够确保数据完整性,同时显著降低迁移过程中的风险及停机时间.相较于逻辑导出导入或第三方工具等其他迁移方式,物理备 ...

  4. IntelliJ IDEA 社区版没有 Spring Initializr

    RT 解决办法 打开文件 - 设置 - 插件 输入 Spring 找到插件 Spring Assistant 并安装 下载可能会需要一点点时间. 重启 IDEA 后,新建项目就可以看见 Spring ...

  5. 学习unigui【23】uniDBGrid的使用摘要

    Unidbgrid自动调整列宽 UniDBGrid1 -> ClientEvents -> ExtEvents [Ext.data.Store[store] ] add store.loa ...

  6. TCP延迟调优之PSH参数与passt延迟问题修复

    qemu中使用passt来作为虚拟机的网卡NAT实现,希望能够利用它IP地址与host一致的优点.这本来是没有啥问题的,但是不知道为什么它的TCP入口流量的延迟很严重. 好吧,反正以后总是要改pass ...

  7. 自动驾驶 | 为CarLA添加一辆小米SU7 Part I

    自动驾驶 | 为CarLA添加一辆小米SU7 Part I 导言 什么是CarLA? CarLA是一款基于虚幻引擎4(Unreal Engine 4)构建的开源自动驾驶仿真平台,为自动驾驶算法的研发. ...

  8. c流程控制

    关于流程控制,一般来说,计算机使用有着三种流程:一就是正常走,按照预先设定的语句序列执行,二就是重复做那么几个动作,直到满足条件,三就是有几条分支走向,根据目前条件去选择分支序列执行. 一.C中的循环 ...

  9. DHCP介绍与实现方法

    简介:动态主机配置协议(Dynamic Host Configuration Protocol,缩写:DHCP)是 RFC 1541(已被 RFC 2131 取代)定义的标准协议,该协议允许服务器向客 ...

  10. [笔记]image对象如何添加class

    1.image对象可以添class,但不能以属性.class的方法添加,而因该把他当成一个节点 2.JS添加和删除class名 添加:节点.classList.add("类名"): ...