zoukankan      html  css  js  c++  java
  • springboot注解@SpringBootApplication分析

    @SpringBootApplication注解用在Spring Boot的入口类上面,是Spring Boot提供的应用启动相关的注解。

    直接上注解的源码:

    @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是一个复合注解

    查看源码,可以发现@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan三个注解。

    对这三个注解进行逐一解析:

    @SpringBootConfiguration

    @SpringBootConfiguration继承自@Configuration,二者的功能也一致,用于标注当前类是配置类,并且会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到Spring容器中,且实例名就是方法名。

    @SpringBootConfiguration和@Configuration都可以理解为Spring传统XML配置里的<beans>标签,而@Bean则是<bean>标签。

    @Configuration和@Bean并不是Spring Boot的特有标签,普通的Spring项目也可以使用,只是普通的Spring项目在使用大多数注解的时候要扫包才能生效,要注意加上扫包配置<context:component-scan base-package="com.yanggb.xxx" />。而Spring Boot只需要保证启动启动main入口在这些类的上层包就行,不需要特别加上扫包配置。

    Spring传统XML配置:

    <beans>  
        <bean id="car" class="com.yanggb.Car">  
            <property name="wheel" ref="wheel"></property>  
        </bean>  
        <bean id="wheel" class="com.yanggb.Wheel"></bean>  
    </beans>  

    Spring新型注解配置:

    @Configuration // 相当于<beans>
    public class CarConfig {
        
        @Bean // 相当于<bean>
        public Car car() {
            Car car = new Car();
            car.setWheel(wheel()); // 相当于<property>
            return car;
        }
        
        @Bean
        public Wheel wheel() {
            return new Wheel();
        }  
    
    }

    两种方式最后产生的结果是相同的。

    @EnableAutoConfiguration

    @EnableAutoConfiguration的作用是启动自动配置,意思是Spring Boot会根据你添加的jar包来配置你项目的默认设置,比如你添加了Spring Boot提供的spring-boot-starter-web依赖,其中包含了Tomcat和Spring MVC,这个注释就会假设你正在开发一个Web应用程序,自动地帮你添加Web项目中所需要的Spring配置。

    @ComponentScan

    @ComponentScan的作用是扫描当前包及其子包下被@Component注解标记的类并纳入到Spring容器中进行管理。是Spring传统XML配置的<context:component-scan>的替代。

    @Controller,@Service,@Repository是@Component的子注解,所以也会被@ComponentScan扫描并做和@Component相同的处理。

    @ComponentScan提供了basePackage参数定义要扫描的包,如果不设置,默认会扫描包的所有类,即默认扫描**/*.class路径,建议加上该参数以减少加载的时间。

    @SpringBootApplication提供的参数

    exclude

    exlude参数继承自@EnableAutoConfiguration注解的同名参数,根据class来排除特定的类加入Spring容器,传入参数的value类型是class类型数组。

    @SpringBootApplication(exclude = {Good.class, Bad.class})

    excludeName

    exludeName参数继承自@EnableAutoConfiguration注解的同名参数,根据className来排除特定的类加入Spring容器,传入参数的value类型是class的全类名字符串数组。

    @SpringBootApplication(excludeName = {"com.yanggb.xxx.Good", "com.yanggb.yyy.Bad"})

    exclude和excludeName可以用来关闭指定的自动配置,比如关闭数据源相关的自动配置。

    scanBasePackages

    scanBasePackages参数继承自@ComponentScan注解的basePackages参数,指定要扫描的包,传入参数的value类型是包名的字符串数组。

    @SpringBootApplication(scanBasePackages = {"com.yanggb.xxx", "com.yanggb.yyy"})

    scanBasePackageClasses

    scanBasePackageClasses参数继承自@ComponentScan注解的basePackageClasses参数,指定要扫描的包,传入参数的value类型是包名的字符串数组。

    @SpringBootApplication(scanBasePackageClasses = {Good.class, Bad.class})

    "到后来,我们只是会说对此无能为力。"

  • 相关阅读:
    设计模式-----简单工厂模式
    LeetCode题解002:两数相加
    LeetCode题解001:两数之和
    异常处理类-Throwable源码详解
    Windows下 gcc/g++的安装与配置
    Windows10下安装解压版MySQL教程
    Windows下Django项目搭建流程
    Linux域名服务DNS
    Linux文件共享服务 FTP,NFS 和 Samba
    操作系统:进程的概念和与程序的区别
  • 原文地址:https://www.cnblogs.com/yanggb/p/10334914.html
Copyright © 2011-2022 走看看