Spring Boot 学习之——@SpringBootApplication注解(自动注解原理)

@SpringBootApplication注解

springboot是基于spring的新型的轻量级框架,最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置

java 复制代码
@SpringBootApplication//标注在某个类上,表示这个类是SpringBoot的启动类
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘面纱,我们要从这两位开始就可以了。

java 复制代码
@SpringBootConfiguration//表示当前类是一个IoC容器的配置类
@EnableAutoConfiguration //开启SpringBoot自动装配功能
@ComponentScan(excludeFilters = {// 扫描路径设置
    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
	@Filter(type = FilterType.CUSTOM, classes =AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}    

1.@SpringBootConfiguration注解

包括了@Configuration,配合@Bean代替xml配置文件的形式注入bean:

a)xml配置文件的形式注入bean

xml 复制代码
<bean id="mockService" class="..MockServiceImpl">
...
</bean>

b)注解配置形式注入bean

java 复制代码
@Configuration
public class MockConfiguration{
    /*
     *任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该 
     *bean定义的id。
     */
    @Bean
    public MockService mockService(){
        return new MockServiceImpl();
    }
}

2.@EnableAutoConfiguration注解

@EnableAutoConfiguration:开启SpringBoot自动装配功能

java 复制代码
@AutoConfigurationPackage//将标注@SpringBootApplication的类所在包及子包里所有组件扫描到IOC容器
@Import(EnableAutoConfigurationImportSelector.class)//借助@Import将配置类注入到IOC容器
public @interface EnableAutoConfiguration {
...
}

2.1.@AutoConfigurationPackage注解

java 复制代码
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {

}

AutoConfigurationPackages.Registrar.class将启动类(@SpringBootApplication标注的类)的所在包及子包里面所有组件扫描到Spring容器;

2.2.@Import注解

EnableAutoConfigurationImportSelector读取META-INF/spring.factories的值,将这些值作为配置类加载到IOC容器中,帮助我们进行自动配置工作。

3.@ComponentScan

我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从@ComponentScan所在类的package进行扫描。

相关推荐
Sarvartha18 分钟前
递归、回溯与动态规划学习笔记
笔记·学习·动态规划
摇滚侠25 分钟前
讲一讲 SpringMVC,线程变量 ThreadLocal 的使用
java·spring boot·intellij-idea
小哇66642 分钟前
第2篇:Spring Boot + WebSocket + 消息队列STOMP协议(Rabbitmq) 架构原理
后端·websocket
Victor3561 小时前
MongoDB(39)如何使用聚合进行过滤?
后端
Victor3561 小时前
MongoDB(38)如何使用聚合进行投影?
后端
小光学长2 小时前
基于ssm的膳食健康管理系统e6whl4q7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·开发语言·数据库·学习·ssm
AI_56782 小时前
基于智优达平台的Python教学实践:从环境搭建到自动评测
开发语言·前端·人工智能·后端·python
IT_陈寒2 小时前
JavaScript开发者必备的5个高效调试技巧,90%的人都不知道最后一个!
前端·人工智能·后端
会编程的土豆2 小时前
Set 深度解析:去重、唯一性与你的智能抽屉
java·开发语言·后端·数据结构与算法
颜酱2 小时前
二分图核心原理与判定算法
javascript·后端·算法