入门SpringBoot-关于启动原理(五)(转)
启动类:
- @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
从@SpringBootApplication开始入手,点击进入是以下代码:
@Target(ElementType.TYPE) // 注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明 @Retention(RetentionPolicy.RUNTIME) // 注解的生命周期,保留到class文件中(三个生命周期) @Documented // 表明这个注解应该被javadoc记录 @Inherited // 子类可以继承该注解 @SpringBootConfiguration // 继承了Configuration,表示当前是注解类 @EnableAutoConfiguration // 开启springboot的注解功能,springboot的四大神器之一,其借助@import的帮助 @ComponentScan(excludeFilters = { // 扫描路径设置@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { ... }
其中,最重要的三个注解是@SpringBootConfiguration 、@EnableAutoConfiguration、@ComponentScan
- @SpringBootConfiguration本质上还是@Configuration注解
@Configuration JavaConfig形式定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。简化了通过XML方式配置bean的方式,两者的区别如下:
- 表达形式层面
基于XML配置的方式是这样:<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"default-lazy-init="true"><!--bean定义--> </beans>
基于JavaConfig的配置方式是这样:
@Configuration public class MockConfiguration{//bean定义 }
- 注册bean定义层面
基于XML配置形式<bean id="mockService" class="..MockServiceImpl">... </bean>
基于JavaConfig的配置方式是这样:
@Configuration public class MockConfiguration{@Beanpublic MockService mockService(){return new MockServiceImpl();} }
任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。
- 表达依赖注入层面
基于XML中配置是这样:<bean id="mockService" class="..MockServiceImpl"><propery name ="dependencyService" ref="dependencyService" /> </bean><bean id="dependencyService" class="DependencyServiceImpl"></bean>
基于java config是这样:
@Configuration public class MockConfiguration{@Beanpublic MockService mockService(){return new MockServiceImpl(dependencyService());}@Beanpublic DependencyService dependencyService(){return new DependencyServiceImpl();} }
- @ComponentScan作用是自动扫描符合条件的组件,并最后加入到容器当中,默认情况下在@ComponentScan所在类的package扫描的,所以最好将启动类放在root package,默认不指定路径
- @EnableAutoConfiguration 包含以下几个注解
@SuppressWarnings("deprecation") @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {... }
其中,@AutoConfigurationPackage、 @Import(EnableAutoConfigurationImportSelector.class)是比较重要的两个注解
@AutoConfigurationPackage
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry) {register(registry, new PackageImport(metadata).getPackageName());}
注册了一个Bean的定义,new PackageImport(metadata).getPackageName(),它其实返回了当前主程序类的 同级以及子级 的包组件。(这也是为什么把启动类放在根目录的原因)
@Import(EnableAutoConfigurationImportSelector.class)
EnableAutoConfigurationImportSelector.class继承AutoConfigurationImportSelector,AutoConfigurationImportSelector中selectImports方法,里面调用getCandidateConfigurations,getCandidateConfigurations里面通过
SpringFactoriesLoader读取META_INF/spring.factories文件的配置,并返回字符串数组
- @EnableAutoConfiguration 包含以下几个注解
转载于:https://www.cnblogs.com/jwnote/p/10076958.html
入门SpringBoot-关于启动原理(五)(转)相关推荐
- springboot应用启动原理(一) 将启动脚本嵌入jar
Spring Boot Takes an opinionated view of building production-ready Spring applications. Spring Boot ...
- 面试官:能说下 SpringBoot 启动原理吗?
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 Spri ...
- Spring Boot:(二)启动原理解析
Spring Boot:(二)启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏. ...
- Spring Boot(18)---启动原理解析
Spring Boot(18)---启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会 ...
- springboot启动原理及其流程
springboot启动原理精简版 spring,springMVC和spring有什么区别? 一 springboot启动流程及其相关流程概览. 二 springboot的启动类入口 三 sprin ...
- 雷神SpringBoot入门和自动装配原理
SpringBoot-helloWord! 首先让当前的工程作为Springboot的子工程 <parent><groupId>org.springframework.boot ...
- SpringBoot系列3-----Docker SpringBoot与数据访问 启动原理 自定义starters
五.Docker 1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术 Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜 ...
- Springboot启动原理解析
点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 我们开发任何一个Spring Boot项目,都会用到如下的启动类 @SpringBootAppl ...
- 手把手带你剖析 Springboot 启动原理!
作者:平凡希 cnblogs.com/xiaoxi/p/7999885.html 我们开发任何一个Spring Boot项目,都会用到如下的启动类 @SpringBootApplication pub ...
最新文章
- 零基础能学好UI设计吗
- 彩色直方图均衡化实现
- Python 路径问题:cv2.error: OpenCV(4.1.0)...size.width>0 size.height>0 in function ‘cv::imshow‘. 解决方法
- 随机森林c语言编程,一种基于随机森林的C语言源代码静态评分方法与流程
- C#对window 硬件类操作,ManagementObjectSearcher
- jax-rs jax-ws_JAX-RS Bean验证错误消息国际化
- Spring集成文件轮询和测试
- C++中dynamic_cast的简介
- python 成语库_python正则表达式抓取成语网站
- 电脑长时间不用的文件找不到怎么恢复
- 2018年最新_5小时学会微信小程序视频教程网盘地址
- SpringMvc从入门到入魔
- Google 2018 IO 大会要点
- Java Socket通信实现多人多端网络画板聊天室
- 使用java+OpenCV进行图片对比并标记差异部分(支持中文图片路径)
- android微信post提交表单,微信自带浏览器不支持form表单post提交方案解决
- html5 3d引擎 星空,使用3D引擎threeJS实现星空粒子移动效果
- 移动硬盘加密方法加密后对硬盘读写的影响
- AI 产品如何做产品定位分析?
- java怎么在控制台输入数字,并保存到数组里?