spring boot 给容器中注册组件包括:

1、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【多用于自己写的类】

2、在配置文件中(@Configuration)使用@Bean注解  【多用于导入第三方包里面的组件,或是需要对组件做其他特殊操作】

3、@Import【快速给容器中导入一个组件】

  • @Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
  • ImportSelector:返回需要导入的组件的全类名数组;
  • ImportBeanDefinationRegistrar:手动注册bean到容器中

4、使用spring提供的FactoryBean(工厂Bean)

  • 默认获取的是工厂bean调用getObject创建的对象
  • 要获取工厂Bean本身,我们需要在id前面加一个&  因为在BeanFactory中专门定义了一个符号 &,来区分获取factoryBean本身和它所创建的对象
/*** Used to dereference a {@link FactoryBean} instance and distinguish it from* beans <i>created</i> by the FactoryBean. For example, if the bean named* {@code myJndiObject} is a FactoryBean, getting {@code &myJndiObject}* will return the factory, not the instance returned by the factory.*/String FACTORY_BEAN_PREFIX = "&";

在写spring boot项目时,发现使用了@SpringBootApplication注解后,所有使用组件标注的类已经注册进容器中,但是并没有看到@ComponentScan注解。阅读@SpringBootApplication源码

package org.springframework.boot.autoconfigure;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.core.annotation.AliasFor;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {@AliasFor(annotation = EnableAutoConfiguration.class, attribute = "exclude")Class<?>[] exclude() default {};@AliasFor(annotation = EnableAutoConfiguration.class, attribute = "excludeName")String[] excludeName() default {};@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")String[] scanBasePackages() default {};@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")Class<?>[] scanBasePackageClasses() default {};}

可以看到 @SpringBootApplication = @SpringBootConfiguration(=@Configuration) + @EnableAutoConfiguration + @ComponentScan,因此可以进行自动扫描。

在上述源码中看到频繁出现的@AliasFor注解。如下面所示:

@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")Class<?>[] scanBasePackageClasses() default {};

上述代码的含义就是:

使用@SpringBootApplication(scanBasePackageClasses={xxx.class,xxx.class})和使用@ComponentScan(basePackageClasses={xxx.class,xxx.class})是一样的效果,即在SpringBootApplication中创建了一个scanBasePackageClasses这样的属性,为了让这个属性等同于@ComponentScan属性中的basePackageClasses属性,所以使用@AliasFor标签,分别设置了value(即作为哪个属性的别名)和annotation(即作为哪个注解)

转载于:https://my.oschina.net/wuyiyi/blog/1924945

启动类的@SpringBootApplication探究相关推荐

  1. springboot 启动类注解 @SpringBootApplication 和 @ComponentScan 的问题

    问题: 在启动类Application上使用@ComponentScan 这个注解来扫描第三方的包,然后就会出现报错,异常就是无法加载本地的某些类,例如某些Dao无法注入. 分析: 启动类注解 @Sp ...

  2. SpringBoot无法书写主启动类的情况之一

    由于笔者将SpringBoot项目的主启动类命名为SpringBootApplication.java与里面需要在类头上引入的@SpringBootApplication重名,导致会引用错误,失败,无 ...

  3. 在SpringBoot启动类上添加ComponentScan出现springbootapplication already applies given @ComponentScan

    查看@SpringBootApplication注解源码,可以看到 @SpringBootApplication=@Configuration+@EnableAutoConfiguration+@Co ...

  4. SpringBoot 启动类 @SpringBootApplication 注解 以及执行流程

    @SpringBootApplication  : 是Sprnig Boot项目的核心注解,目的是开启自动配置 目录 @SpringBootApplication  : 是Sprnig Boot项目的 ...

  5. SpringBoot注解--@SpringBootApplication/@MapperScan/自定义启动类注解

    原文网址:SpringBoot注解--@SpringBootApplication/@MapperScan/自定义启动类注解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍SpringBoot启动类 ...

  6. SpringBoot启动类的扫描注解的用法及冲突原则

    背景 SpringBoot 启动类上,配置扫描包路径有三种方式,最近看到一个应用上三种注解都用上了,代码如下: @SpringBootApplication(scanBasePackages ={&q ...

  7. springboot扫描组件_SpringBoot入口类和@SpringBootApplication详解

    SpringBoot项目创建完成之后默认会生成一个*Application的入口类,通过该类的main方法即可启动SpringBoot项目. @SpringBootApplication(exclud ...

  8. spring boot原理_SpringBoot-02-原理初探之主启动类

    2. 原理初探 2.1 pom.xml 父依赖 主要依赖一个父项目,主要管理项目的资源过滤和插件 <parent><groupId>org.springframework.bo ...

  9. main spring启动_SpringBoot学习(一):为什么main方法启动类需要放在项目根目录...

    一.概述 使用SpringBoot的应用是需要将应用代码编译打包成jar包,然后基于main方法的方式来独立启动这个应用,使得该应用作为一个独立进程运行.这是跟传统的将项目打包成war包,然后部署到t ...

最新文章

  1. python tkinter窗口弹出置顶的方法
  2. 只有15亩起源的新发地,却造就了32个亿万商家,1000多个千万商家!
  3. C#获取容器窗体中控件Location问题
  4. linux关机方法有哪些?有何区别_Linux下判断是否正常关机的一个简单方法
  5. Jquery mobile 新手问题总汇
  6. 八年程序员被裁了后,打脸上家公司,连斩六个offer
  7. List.remove(i)报错:问题分析与解决
  8. “我来管管看”系列:如何消除报工数据与入库数据的差异?
  9. Windows内核的基本概念
  10. 电气工程cad实用教程电子版_电气工程CAD教程-PDF
  11. Power BI 简介
  12. Pytho爬虫-4567电影网电影信息爬取
  13. Docker Linux下安装配置及启动
  14. 创业服务资源获取的途径有哪些?
  15. 怎样用UltraISO制作U盘系统安装盘
  16. 一个能生成精美代码图片的工具Carbon
  17. 可能认识的好友!查询!
  18. 父母写给叛逆孩子的一封信范文
  19. CentOS 7 架设FTP服务器-Vsftpd
  20. 企业客户管理软件排名

热门文章

  1. 251f与ips屏显示器对比_8百左右预算,2020年PS平面设计/摄影后期显示器推荐/选购指南(全高清+高色域屏)...
  2. androidx86 9.0下载_Surface pro 安装 android x86/chrome OS
  3. 模态框分页java代码_ajax分页效果(bootstrap模态框)
  4. Python零基础入门(五)——文本文件读写和操作[学习笔记]
  5. 深度剖析什么是 SLI、SLO和SLA?
  6. 2021新鲜出炉软件测试的真实面试题(一篇足以)
  7. java 日期 yyyy_java日期中YYYY与yyyy的区别
  8. 计算机签到程序,基于spring boot技术的签到管理系统的设计与实现计算机专业.doc...
  9. 王者服务器维修2019年四月份,王者荣耀4月25日更新内容 王者荣耀2019年4月25日全服不停机更新公告...
  10. 制度汇编格式怎么生成目录_规章制度编写规范