SpringBoot 启动流程

2020-08-05  本文已影响0人  杨健kimyeung

一、主程序入口类

1、Application.class

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

2、特点

注意: 必须是一个使用@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、注解说明

三、@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;
    }

}

总结

四、@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{
}
上一篇 下一篇

猜你喜欢

热点阅读