Spring IoC容器添加组件的方式
小编在博文《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容器添加组件的方式的更多相关文章
- spring IOC容器实例化Bean的方式与RequestContextListener应用
spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...
- SpringBoot系列之Spring容器添加组件方式
SpringBoot系列之Spring容器添加组件方式 本博客介绍SpringBoot项目中将组件添加到Spring容器中的方法,SpringBoot项目有一个很明显的优点,就是不需要再编写xml配置 ...
- 整理在Spring IOC容器初始化后可以处理特定逻辑的多种实现方式
Spring框架的核心是依赖注入.切面:Spring Boot是在Spring框架的基础上为其提供许多默认配置.默认约定(约定优于配置),从而达到减少或减化配置进而可开箱即用.快速上手:Spring ...
- Spring IOC容器装配Bean_基于注解配置方式
bean的实例化 1.导入jar包(必不可少的) 2.实例化bean applicationContext.xml(xml的写法) <bean id="userDao" cl ...
- 对Spring IoC容器实现的结构分析
本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...
- Spring IOC 容器源码分析
声明!非原创,本文出处 Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 S ...
- Spring源码剖析2:Spring IOC容器的加载过程
spring ioc 容器的加载流程 1.目标:熟练使用spring,并分析其源码,了解其中的思想.这篇主要介绍spring ioc 容器的加载 2.前提条件:会使用debug 3.源码分析方法:In ...
- Spring源码剖析3:Spring IOC容器的加载过程
本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...
- Spring IOC容器源码分析
注:本文转自https://javadoop.com/post/spring-ioc Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容 ...
- 纯注解快速使用spring IOC容器
使用spring的ioc容器实现对bean的管理与基本的依赖注入是再经典的应用了.基础使用不在详述. 这里主要介绍下使用注解实现零配置的spring容器.我相信你也会更喜欢使用这种方式.Spring ...
随机推荐
- curl使用总结
1.请求源码 curl http://wttr.in/ 天气网站 2.文件下载 -o :保存文件 -s:禁用进度表 --progress-bar:让进度显示为进度条 -C - :断点连续下载 --l ...
- [解决方案][docker] Http: server gave HTTP response to HTTPS client
前言 用centos运行docker不支持http,需要在daemon.json 里面配置一下 目录 没有daemon.json 需要添加这个文件 在daemon.json 增添配置 重启即可 一.l ...
- [vue系列]-vue+vue-i18n+elementUI 国际化
前言 vue+vue-i18n实现多语言 本文主要内容 安装 多语言配置 element 内置语言国际化 踩到的坑以及解决方案 安装 npm install vue-i18n 配置 1.i18n.js ...
- sql sever查询库中每个表是否存在某个列名 列出表名
select t.TABLE_NAME from information_schema.columns t where t.COLUMN_NAME='列名';
- 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
FRP 是 Github 上开源的一款内网穿透工具,点击前往项目地址,该项目分为 frps 服务端和 frpc 客户端,通过在拥有公网 IP 的服务器上搭建服务端,然后在被穿透的机器上安装客户端,配置 ...
- 编写你的第一个 Django 应用程序,第5部分
本教程从教程 4 停止的地方开始.我们已经构建了一个网络投票应用程序,现在我们将为其创建一些自动化测试. 一.自动化测试简介 1.什么是自动化测试? 测试是检查代码操作的例程. 测试在不同级别运行.一 ...
- windows端5款mysql客户端工具
1. MySQL Workbench 这属于mysql官方出品,免费,功能强大,是首选. 2. HeidiSQL 免费,功能强大,强烈推荐. 3. dbForge Studio for MySQL 收 ...
- [每日算法 - 华为机试] 剑指 Offer 57 - II. 和为s的连续正数序列 「滑动窗口」
入口 力扣https://leetcode.cn/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/ 题目描述 输入一个正整数 target ,输出所 ...
- Quartz.NET - 教程 2: 作业和触发器
译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 2: Jobs And Triggers Quartz API Quartz API 的主要接口和类如下: ISched ...
- Windows7、Windows10跳过创建用户并直接用Administrator身份登录
windows7 windows10跳过创建用户并直接用Administrator身份登录 一.操作方法: 在界面设置按 按 shift+f10 然后输入 lusrmgr.msc 用户管理控制台开启a ...