@SpringBootApplication注解分析
转自: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
,来判断你的项目是否需要添加了webmvc
和tomcat
,就会自动的帮你配置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注解分析相关推荐
- 神秘又强大的@SpringBootApplication注解
作者:vivo 互联网服务器团队-Peng peng 一.前言 大部分的配置都可以用Java类+注解来代替,而在SpringBoot项目中见的最多的莫过于@SpringBootApplication注 ...
- SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)...
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.了解SpringBoot的基本概念 2.具体内容 在之前所建立的 SpringBoot 项目只是根据官方文档实现的一个基础程 ...
- springboot情操陶冶-@SpringBootApplication注解解析
承接前文springboot情操陶冶-@Configuration注解解析,本文将在前文的基础上对@SpringBootApplication注解作下简单的分析 @SpringBootApplicat ...
- springboot源码(二)@SpringBootApplication注解中exclude参数使用及原理
文章目录 一.使用姿势 二.运行原理 上篇文章中, <springboot源码(一)启动流程+自动配置原理分析>,简单分析了启动流程,其中涉及到了@SpringBootApplicatio ...
- 扒一扒 @SpringBootApplication 注解背后的奥秘!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 概 述 Spring Boot的约定大于配置的功力让我们如 ...
- @springbootapplication 注解_Spring Boot最核心的27个干货注解,你了解多少?
Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringClo ...
- SpringBoot的@SpringBootApplication注解和其他几个注解
转载自 https://blog.csdn.net/zzzgd_666/article/details/80310840 首先,我们来看看@SpringBootApplication注解代码,如下代码 ...
- @import注解_Spring Boot 2 实战:@SpringBootApplication注解浅析
本文转载自本人技术博客:felord.cn 转载请注明出处 1. 前言 Spring Boot 都会有一个名为 xxApplication 的启动类,里面有一个标准的 java 应用的入口 main ...
- @controlleradvice注解作用_springboot的常用注解分析
在spring boot中,摒弃了spring以往项目中大量繁琐的配置,遵循约定大于配置的原则,通过自身默认配置,极大的降低了项目搭建的复杂度.同样在spring boot中,大量注解的使用,使得代码 ...
最新文章
- Soldier and Badges
- Sorting It All Out (易错题+拓扑排序+有向图(判环+判有序)优先级)
- scala 类中的对象是类_Scala中的类和对象
- 关于SEL的简单总结
- 偷的名表卖掉能查到吗_搬运工偷走房主30万名表,转手以12.5万卖掉 南京警方快速追回...
- CCNP路由重分发(四)EIGRP-to-ISIS
- 计算机视觉基础:霍夫变换(Computer Vision Fundamentals: Hough Transform)
- 将linux文件拷贝到windows,Windows与Linux系统拷贝文件之pscp的使用分享
- signature=daa3bbe3ad9a7c162ba9d98f8d9e7530,来用百度密语吧!!!
- 在服务器上搭建Cadence16.6 CIS共享库
- RocketMq之一条消息在commitlog文件中如何存储验证
- GSL-蒙特卡洛积分
- 快捷键:浏览器关闭网页的快捷键,切换网页的快捷键,打开网页的快捷键
- 电脑缺失ACPI.sys
- TL-WR941N V2 漏洞
- 青春三部曲(《且听风吟》,《一九七三年的弹子球》,《寻羊冒险记》)--[日]村上春树...
- NIST测试结果分析
- 兼容小程序和app安卓 录音功能uniapp
- java 垃圾回收机制GC
- OpenStack Liberty版本容器模块Magnum的极速体验
热门文章
- mysql gtid模式主键主突_Mysql基于GTID主从复制
- Unity2020.1新功能探路:编辑器相关更新
- 在Android上通过AI危险检测向驾驶员发出警报
- excel文件修复工具_win10上使用SFC工具修复损坏的系统文件,安全高效,维修电脑必会...
- ios 数组中的字典排序_题解 | 26.删除排序数组中的重复项
- 编程猫海龟编辑器python_海龟编辑器下载
- fpga驱动oled iic显示代码_【接口时序】6、IIC总线的原理与Verilog实现
- php 使用支付宝SDK报错解决
- java jdomxml 换行_jdom处理的XML Document 和String 之间的相互转化
- linux服务器和客户端配置,Linux基础教程:YUM服务端与客户端配置步骤