转自:https://www.cnblogs.com/duanxz/p/3756364.html

@SpringBootApplication注解分析

首先我们分析的就是入口类Application的启动注解@SpringBootApplication,进入源码:

@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 {
....
}

发现@SpringBootApplication是一个复合注解,包括@ComponentScan,和@SpringBootConfiguration@EnableAutoConfiguration

  • @SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
  • @EnableAutoConfiguration的作用启动自动的配置,@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web ,来判断你的项目是否需要添加了webmvctomcat,就会自动的帮你配置web项目中所需要的默认配置。在下面博客会具体分析这个注解,快速入门的demo实际没有用到该注解。
  • @ComponentScan,扫描当前包及其子包下被@Component@Controller@Service@Repository注解标记的类并纳入到spring容器中进行管理。是以前的<context:component-scan>(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。所以本demo中的User为何会被spring容器管理。

根据上面的理解,上面的入口类Application,我们可以使用:

package com.zhihao.miao;
import com.zhihao.miao.bean.User;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import java.util.Map;@ComponentScan
public class Application {@Beanpublic Runnable createRunnable(){return () -> System.out.println("spring boot is running");}public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);context.getBean(Runnable.class).run();System.out.println(context.getBean(User.class));Map map = (Map) context.getBean("createMap");int age = (int) map.get("age");System.out.println("age=="+age);}
}

使用@ComponentScan注解代替@SpringBootApplication注解,也可以正常运行程序。原因是@SpringBootApplication中包含@ComponentScan,并且springboot会将入口类看作是一个@SpringBootConfiguration标记的配置类,所以定义在入口类Application中的Runnable也可以纳入到容器管理。

SpringBootApplication参数详解

图片.png

  • Class<?>[] exclude() default {}:
    根据class来排除,排除特定的类加入spring容器,传入参数value类型是class类型。
  • String[] excludeName() default {}:
    根据class name来排除,排除特定的类加入spring容器,传入参数value类型是class的全类名字符串数组。
  • String[] scanBasePackages() default {}:
    指定扫描包,参数是包名的字符串数组。
  • Class<?>[] scanBasePackageClasses() default {}:
    扫描特定的包,参数类似是Class类型数组。

看一个demo学会使用这些参数配置
在包下com.zhihao.miao.springboot定义一个启动应用类(加上@SpringBootApplication注解)

package com.zhihao.miao.springboot;import com.zhihao.miao.beans.Cat;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Application {public static void main(String[] args) {ConfigurableApplicationContext context =SpringApplication.run(Application.class,args);Cat cat = context.getBean(Cat.class);System.out.println(cat);}
}

在com.zhihao.miao.beans包下定义一个实体类,并且想将其纳入到spring容器中,

public class Cat {
}
package com.zhihao.miao.beans;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyConfig {@Beanpublic Cat cat(){return new Cat();}}

启动启动类,打印结果如下:

说明Cat类并没有纳入到spring容器中,这个结果也如我们所想,因为@SpringBootApplication只会扫描@SpringBootApplication注解标记类包下及其子包的类(特定注解标记,比如说@Controller,@Service,@Component,@Configuration和@Bean注解等等)纳入到spring容器,很显然MyConfig不在@SpringBootApplication注解标记类相同包下及其子包的类,所以需要我们去配置一下扫包路径。

修改启动类,@SpringBootApplication(scanBasePackages = "com.zhihao.miao"),指定扫描路径:

package com.zhihao.miao.springboot;import com.zhihao.miao.beans.Cat;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication(scanBasePackages = "com.zhihao.miao")
public class Application {public static void main(String[] args) {ConfigurableApplicationContext context =SpringApplication.run(Application.class,args);Cat cat = context.getBean(Cat.class);System.out.println(cat);}
}

启动并打印:

当然使用@SpringBootApplication(scanBasePackageClasses = MyConfig.class),指定scanBasePackageClasses参数的value值是你需要扫描的类也可以,结果一样,不过如果多个配置类不在当前包及其子包下,则需要指定多个。

再看一个列子,
在上面的列子的相同包下(com.zhihao.miao.springboot)配置了People,并将其纳入到spring容器中(@Component),我们知道@SpringBootApplication注解会扫描当前包及其子包,所以People类会纳入到spring容器中去,我们需要将其排除在spring容器中,如何操作?
可以使用@SpringBootApplication的另外二个参数(exclude或excludeName)

package com.zhihao.miao.springboot;import org.springframework.stereotype.Component;@Component
public class People {
}

启动类,

package com.zhihao.miao.springboot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Application {public static void main(String[] args) {ConfigurableApplicationContext context =SpringApplication.run(Application.class,args);People people = context.getBean(People.class);System.out.println(people);}
}

启动并打印结果:

然后修改@SpringBootApplication配置,

package com.zhihao.miao.springboot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication(exclude = People.class)
public class Application {public static void main(String[] args) {ConfigurableApplicationContext context =SpringApplication.run(Application.class,args);People people = context.getBean(People.class);System.out.println(people);}
}

很明显启动报错。使用@excludeName注解也可以。如下,
@SpringBootApplication(excludeName = {"com.zhihao.miao.springboot.People"})

参考文档:
Springboot1.5.4官方文档

@SpringBootApplication注解分析相关推荐

  1. 神秘又强大的@SpringBootApplication注解

    作者:vivo 互联网服务器团队-Peng peng 一.前言 大部分的配置都可以用Java类+注解来代替,而在SpringBoot项目中见的最多的莫过于@SpringBootApplication注 ...

  2. SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)...

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.了解SpringBoot的基本概念 2.具体内容 在之前所建立的 SpringBoot 项目只是根据官方文档实现的一个基础程 ...

  3. springboot情操陶冶-@SpringBootApplication注解解析

    承接前文springboot情操陶冶-@Configuration注解解析,本文将在前文的基础上对@SpringBootApplication注解作下简单的分析 @SpringBootApplicat ...

  4. springboot源码(二)@SpringBootApplication注解中exclude参数使用及原理

    文章目录 一.使用姿势 二.运行原理 上篇文章中, <springboot源码(一)启动流程+自动配置原理分析>,简单分析了启动流程,其中涉及到了@SpringBootApplicatio ...

  5. 扒一扒 @SpringBootApplication 注解背后的奥秘!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 概 述 Spring Boot的约定大于配置的功力让我们如 ...

  6. @springbootapplication 注解_Spring Boot最核心的27个干货注解,你了解多少?

    Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringClo ...

  7. SpringBoot的@SpringBootApplication注解和其他几个注解

    转载自 https://blog.csdn.net/zzzgd_666/article/details/80310840 首先,我们来看看@SpringBootApplication注解代码,如下代码 ...

  8. @import注解_Spring Boot 2 实战:@SpringBootApplication注解浅析

    本文转载自本人技术博客:felord.cn 转载请注明出处 1. 前言 Spring Boot 都会有一个名为 xxApplication 的启动类,里面有一个标准的 java 应用的入口 main ...

  9. @controlleradvice注解作用_springboot的常用注解分析

    在spring boot中,摒弃了spring以往项目中大量繁琐的配置,遵循约定大于配置的原则,通过自身默认配置,极大的降低了项目搭建的复杂度.同样在spring boot中,大量注解的使用,使得代码 ...

最新文章

  1. Soldier and Badges
  2. Sorting It All Out (易错题+拓扑排序+有向图(判环+判有序)优先级)
  3. scala 类中的对象是类_Scala中的类和对象
  4. 关于SEL的简单总结
  5. 偷的名表卖掉能查到吗_搬运工偷走房主30万名表,转手以12.5万卖掉 南京警方快速追回...
  6. CCNP路由重分发(四)EIGRP-to-ISIS
  7. 计算机视觉基础:霍夫变换(Computer Vision Fundamentals: Hough Transform)
  8. 将linux文件拷贝到windows,Windows与Linux系统拷贝文件之pscp的使用分享
  9. signature=daa3bbe3ad9a7c162ba9d98f8d9e7530,来用百度密语吧!!!
  10. 在服务器上搭建Cadence16.6 CIS共享库
  11. RocketMq之一条消息在commitlog文件中如何存储验证
  12. GSL-蒙特卡洛积分
  13. 快捷键:浏览器关闭网页的快捷键,切换网页的快捷键,打开网页的快捷键
  14. 电脑缺失ACPI.sys
  15. TL-WR941N V2 漏洞
  16. 青春三部曲(《且听风吟》,《一九七三年的弹子球》,《寻羊冒险记》)--[日]村上春树...
  17. NIST测试结果分析
  18. 兼容小程序和app安卓 录音功能uniapp
  19. java 垃圾回收机制GC
  20. OpenStack Liberty版本容器模块Magnum的极速体验

热门文章

  1. mysql gtid模式主键主突_Mysql基于GTID主从复制
  2. Unity2020.1新功能探路:编辑器相关更新
  3. 在Android上通过AI危险检测向驾驶员发出警报
  4. excel文件修复工具_win10上使用SFC工具修复损坏的系统文件,安全高效,维修电脑必会...
  5. ios 数组中的字典排序_题解 | 26.删除排序数组中的重复项
  6. 编程猫海龟编辑器python_海龟编辑器下载
  7. fpga驱动oled iic显示代码_【接口时序】6、IIC总线的原理与Verilog实现
  8. php 使用支付宝SDK报错解决
  9. java jdomxml 换行_jdom处理的XML Document 和String 之间的相互转化
  10. linux服务器和客户端配置,Linux基础教程:YUM服务端与客户端配置步骤