启动类的@SpringBootApplication探究
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探究相关推荐
- springboot 启动类注解 @SpringBootApplication 和 @ComponentScan 的问题
问题: 在启动类Application上使用@ComponentScan 这个注解来扫描第三方的包,然后就会出现报错,异常就是无法加载本地的某些类,例如某些Dao无法注入. 分析: 启动类注解 @Sp ...
- SpringBoot无法书写主启动类的情况之一
由于笔者将SpringBoot项目的主启动类命名为SpringBootApplication.java与里面需要在类头上引入的@SpringBootApplication重名,导致会引用错误,失败,无 ...
- 在SpringBoot启动类上添加ComponentScan出现springbootapplication already applies given @ComponentScan
查看@SpringBootApplication注解源码,可以看到 @SpringBootApplication=@Configuration+@EnableAutoConfiguration+@Co ...
- SpringBoot 启动类 @SpringBootApplication 注解 以及执行流程
@SpringBootApplication : 是Sprnig Boot项目的核心注解,目的是开启自动配置 目录 @SpringBootApplication : 是Sprnig Boot项目的 ...
- SpringBoot注解--@SpringBootApplication/@MapperScan/自定义启动类注解
原文网址:SpringBoot注解--@SpringBootApplication/@MapperScan/自定义启动类注解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍SpringBoot启动类 ...
- SpringBoot启动类的扫描注解的用法及冲突原则
背景 SpringBoot 启动类上,配置扫描包路径有三种方式,最近看到一个应用上三种注解都用上了,代码如下: @SpringBootApplication(scanBasePackages ={&q ...
- springboot扫描组件_SpringBoot入口类和@SpringBootApplication详解
SpringBoot项目创建完成之后默认会生成一个*Application的入口类,通过该类的main方法即可启动SpringBoot项目. @SpringBootApplication(exclud ...
- spring boot原理_SpringBoot-02-原理初探之主启动类
2. 原理初探 2.1 pom.xml 父依赖 主要依赖一个父项目,主要管理项目的资源过滤和插件 <parent><groupId>org.springframework.bo ...
- main spring启动_SpringBoot学习(一):为什么main方法启动类需要放在项目根目录...
一.概述 使用SpringBoot的应用是需要将应用代码编译打包成jar包,然后基于main方法的方式来独立启动这个应用,使得该应用作为一个独立进程运行.这是跟传统的将项目打包成war包,然后部署到t ...
最新文章
- python tkinter窗口弹出置顶的方法
- 只有15亩起源的新发地,却造就了32个亿万商家,1000多个千万商家!
- C#获取容器窗体中控件Location问题
- linux关机方法有哪些?有何区别_Linux下判断是否正常关机的一个简单方法
- Jquery mobile 新手问题总汇
- 八年程序员被裁了后,打脸上家公司,连斩六个offer
- List.remove(i)报错:问题分析与解决
- “我来管管看”系列:如何消除报工数据与入库数据的差异?
- Windows内核的基本概念
- 电气工程cad实用教程电子版_电气工程CAD教程-PDF
- Power BI 简介
- Pytho爬虫-4567电影网电影信息爬取
- Docker Linux下安装配置及启动
- 创业服务资源获取的途径有哪些?
- 怎样用UltraISO制作U盘系统安装盘
- 一个能生成精美代码图片的工具Carbon
- 可能认识的好友!查询!
- 父母写给叛逆孩子的一封信范文
- CentOS 7 架设FTP服务器-Vsftpd
- 企业客户管理软件排名
热门文章
- 251f与ips屏显示器对比_8百左右预算,2020年PS平面设计/摄影后期显示器推荐/选购指南(全高清+高色域屏)...
- androidx86 9.0下载_Surface pro 安装 android x86/chrome OS
- 模态框分页java代码_ajax分页效果(bootstrap模态框)
- Python零基础入门(五)——文本文件读写和操作[学习笔记]
- 深度剖析什么是 SLI、SLO和SLA?
- 2021新鲜出炉软件测试的真实面试题(一篇足以)
- java 日期 yyyy_java日期中YYYY与yyyy的区别
- 计算机签到程序,基于spring boot技术的签到管理系统的设计与实现计算机专业.doc...
- 王者服务器维修2019年四月份,王者荣耀4月25日更新内容 王者荣耀2019年4月25日全服不停机更新公告...
- 制度汇编格式怎么生成目录_规章制度编写规范