美文网首页
SpringBoot 启动流程

SpringBoot 启动流程

作者: 杨健kimyeung | 来源:发表于2020-08-05 17:14 被阅读0次

    一、主程序入口类

    1、Application.class

    @SpringBootApplication
    public class SpringbootExampleApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringbootExampleApplication.class, args);
        }
    }
    

    2、特点

    • 该类使用了@SpringBootApplication注解
    • SpringApplication.run方法XxxApplication.class作为参数传入

    注意: 必须是一个使用@SpringBootApplication注解类 当你注释掉该类的时候直接报错

    二、@SpringBootApplication注解

    1、作用

    @SpringBootApplication注解是Spring Boot的核心注解,它是一个组合注解,它的主要作用是标注在某个类上,表示这是一个Spring Boot的配置类

    等价于@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan

    2、源码

    @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)
        Class<?>[] exclude() default {};
      
        @AliasFor(annotation = EnableAutoConfiguration.class)
        String[] excludeName() default {};
      
        @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
        String[] scanBasePackages() default {};
      
        @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
        Class<?>[] scanBasePackageClasses() default {};
        
    }
    

    3、属性

    属性 说明
    Class<?>[] exclude() 排除特定的自动配置类
    String[] excludeName() 同exclude通过类名
    String[] scanBasePackages() 指定扫描指定包带注释的组件
    Class<?>[] scanBasePackageClasses() 将扫描指定类的包

    4、注解说明

    • 声明了@ComponentScan,scanBasePackages和scanBasePackageClasses两个属性上面同样声明了@AliasFor注解,分别指向了@ComponentScan注解的basePackages注解属性和basePackageClasses属性。
    • 声明了@EnableAutoConfiguration注解,表明声明了类本身会默认开启自动配置
    • 声明了@SpringBootConfiguration注解,继承了Configuration,表示当前是注解类也是配置类

    三、@Configuration

    1、说明

    SpringBoot社区推荐使用基于JavaConfig的配置形式 ,@Configuration表示一个IoC容器的配置类,

    2、源码

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Configuration {
    //  通过 别名注解指向@Component
        @AliasFor(annotation = Component.class)
        String value() default "";
        boolean proxyBeanMethods() default true;
    }
    
    

    3、配置方式的区别

    表达形式

    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.xsd">
    </beans>
    

    JavaConfig方式

    @Configuration
    public class DruidConfiguration{
    }
    

    注册Bean

    xml形式注册

    <bean id="dataSource"
          class="com.alibaba.druid.pool.DruidDataSource" />
    

    JavaConfig方式

    @Configuration
    public class DruidConfiguration{
             @Bean
           public DataSource druidDataSource() {
            return new DruidDataSource();
        }
    }
    

    依赖注入

    xml形式注册

    <bean id="securityManager"
          class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" />
    <property name="cacheManager" ref="cacheManager" />
    </bean>
    <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" />
    

    JavaConfig方式

    @Configuration
    public class ShiroConfiguration {
        @Bean
        public SecurityManager securityManager() {
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            securityManager.setCacheManager(cacheManager);
            return securityManager;
        }
        @Bean
        public RedisCacheManager cacheManager(CustomRedisManager redisManager) {
            RedisCacheManager redisCacheManager = new RedisCacheManager();
            redisCacheManager.setRedisManager(redisManager);
            return redisCacheManager;
        }
    
    }
    

    总结

    • @Configuration一定要配合@Bean。用来替换xml配置文件。
    • @Bean注解告诉Spring,带有@Bean的注解方法将返回一个对象

    四、@ComponentScan

    作用

    自动扫描并加载符合条件的组件。我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在修饰类的package进行扫描

    五、补充

    1、@AliasFor

    1.1、作用

    别名注解,它可以注解到自定义注解的属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义。

    主要有两个作用:

    1. 在同一个注解使用别名注解,需要注意的是使用别名注解修饰的属性的类型必须相同,不能同时设置,必须设置默认值
    2. 覆盖自定义注解上的元注解中的属性

    1.2、源代码

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD})
    public @interface AliasFor {
        @AliasFor("attribute")
        String value() default "";
        @AliasFor("value")
        String attribute() default "";
        Class<? extends Annotation> annotation() default Annotation.class;
    }
    

    1.3、栗子

    修饰的元注解

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE})
    @Repeatable(ComponentScans.class)
    public @interface ComponentScan {
        @AliasFor("basePackages")
        String[] value() default {};
        @AliasFor("value")
        String[] basePackages() default {};
    

    2、@Repeatable

    作用

    重复注解类 表示标记的注解可以多次应用于相同的声明或类型,此注解由Java SE 8版本引入。

    栗子

    声明一个重复注解类

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE})
    @Repeatable(ComponentScans.class)
    public @interface ComponentScan {
        String[] value() default {};
    }
    

    声明一个容器注解类

    public @interface ComponentScans {
        ComponentScan[] value();
    }
    

    使用

    @ComponentScan({"com.zw.mapper"})
    @ComponentScan({"com.zw.service"})
    public class RepetableApplication{
    }
    

    相关文章

      网友评论

          本文标题:SpringBoot 启动流程

          本文链接:https://www.haomeiwen.com/subject/qksorktx.html