SpringBootApplication注解详解与常见SpringBoot注解列表

SpringBootApplication注解

SpringBoot程序启动入口一个是SpringApplication.run,一个是@SpringBootApplication注解,这个注解是由三部分组成:

  1. @ComponentScan注解,主要用于组件扫描和自动装配。

  2. @SpringBootConfiguration注解,这个注解主要是继承@Configuration注解,主要用于加载配置文件。

  3. @EnableAutoConfiguration注解,这个注释启用了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)
    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 {};

}

实例

@SpringBootApplication
public class HelloDemo implements CommandLineRunner {
 
    private static final Logger log = LoggerFactory.getLogger(HelloDemo.class);
 
    public static void main(String args[]) {
        SpringApplication.run(HelloDemo.class);
    }
 
    @Override
    public void run(String...args) throws Exception {
        log.info("hello 51gjie");
    }
}

@SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration,是这三个Spring注释的组合,只需一行代码即可提供所有三个注释的功能。

Spring ComponentScan注解详解
Spring中@ComponentScan注解的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring的bean容器中。

源码

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    @AliasFor("basePackages")
    String[] value() default {};
 
    @AliasFor("value")
    String[] basePackages() default {};
 
    Class[] basePackageClasses() default {};
 
    Class nameGenerator() default BeanNameGenerator.class;
 
    Class scopeResolver() default AnnotationScopeMetadataResolver.class;
 
    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
 
    String resourcePattern() default "**/*.class";
    boolean useDefaultFilters() default true;
    ComponentScan.Filter[] includeFilters() default {};
    ComponentScan.Filter[] excludeFilters() default {};
    boolean lazyInit() default false;
    @Retention(RetentionPolicy.RUNTIME)
    @Target({})
    public @interface Filter {
        FilterType type() default FilterType.ANNOTATION;
        @AliasFor("classes")
        Class[] value() default {};
        @AliasFor("value")
        Class[] classes() default {};
        String[] pattern() default {};
    }
}

basePackages与value:? 用于指定包的路径,进行扫描

basePackageClasses: 用于指定某个类的包的路径进行扫描

nameGenerator: bean的名称的生成器

useDefaultFilters: 是否开启对@Component,@Repository,@Service,@Controller的类进行检测

includeFilters: 包含的过滤条件 FilterType.ANNOTATION:按照注解过滤,FilterType.ASSIGNABLE_TYPE:按照给定的类型,FilterType.ASPECTJ:使用ASPECTJ表达式,FilterType.REGEX:正则,FilterType.CUSTOM:自定义规则

excludeFilters: 排除的过滤条件,用法和includeFilters一样

注解方式

  1. 扫描包
@ComponentScan(basePackages = “”)     //单个
@ComponentScan(basePackages = {“xxx”,“aaa”,“…”})   //多个

注意:可以省略“basePackages =”

@Configuration
@ComponentScan("com.51gjie.spring.service")
public class MyConfig {}

@Configuration
@ComponentScan("com.51gjie.spring.dao","com.51gjie.spring.service")
public class MyConfig {}

@Configuration
@ComponentScan("com.51gjie.spring.*")   //通配符匹配所有的包
public class MyConfig {}

学习目录

  1. 搭建

    1. Eclipse安装springboot插件2种方法
    2. Eclipse搭建springboot项目(插件搭建,项目导入搭建)
  2. 原理

    1. springboot原理(核心原理,启动流程)
    2. SpringApplication详解(run执行启动)
    3. SpringBootApplication注解
    4. Spring ComponentScan注解详解
    5. SpringBootConfiguration注解
    6. EnableAutoConfiguration注解
    7. springboot注解大全
    8. SpringBoot Starter原理(依赖引入,自动配置)
  3. 应用

    1. SpringBoot集成mybatis+Druid+mybatis generator
    2. SpringBoot整合Mybatis Plus(代码自动生成)
    3. SpringBoot+mybatis增改删查例子

Spring ComponentScan注解详解

Spring中@ComponentScan注解的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring的bean容器中。

源码

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

    @AliasFor("value")
    String[] basePackages() default {};

    Class[] basePackageClasses() default {};

    Class nameGenerator() default BeanNameGenerator.class;

    Class scopeResolver() default AnnotationScopeMetadataResolver.class;

    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;

    String resourcePattern() default "**/*.class";
    boolean useDefaultFilters() default true;
    ComponentScan.Filter[] includeFilters() default {};
    ComponentScan.Filter[] excludeFilters() default {};
    boolean lazyInit() default false;
    @Retention(RetentionPolicy.RUNTIME)
    @Target({})
    public @interface Filter {
        FilterType type() default FilterType.ANNOTATION;
        @AliasFor("classes")
        Class[] value() default {};
        @AliasFor("value")
        Class[] classes() default {};
        String[] pattern() default {};
    }
}

basePackages与value:? 用于指定包的路径,进行扫描

basePackageClasses: 用于指定某个类的包的路径进行扫描

nameGenerator: bean的名称的生成器

useDefaultFilters: 是否开启对@Component,@Repository,@Service,@Controller的类进行检测

includeFilters: 包含的过滤条件 FilterType.ANNOTATION:按照注解过滤,FilterType.ASSIGNABLE_TYPE:按照给定的类型,FilterType.ASPECTJ:使用ASPECTJ表达式,FilterType.REGEX:正则,FilterType.CUSTOM:自定义规则

excludeFilters: 排除的过滤条件,用法和includeFilters一样

注解方式

1. 扫描包

@ComponentScan(basePackages = “”)     //单个
@ComponentScan(basePackages = {“xxx”,“aaa”,“…”})   //多个

注意:可以省略“basePackages =”

@Configuration
@ComponentScan("com.51gjie.spring.service")
public class MyConfig {}

@Configuration
@ComponentScan("com.51gjie.spring.dao","com.51gjie.spring.service")
public class MyConfig {}

@Configuration
@ComponentScan("com.51gjie.spring.*")   //通配符匹配所有的包
public class MyConfig {}

2. 扫描类

@ComponentScan(basePackageClasses = “”)   //单个
@ComponentScan(basePackageClasses = {“aaa”,“bbb”,“…”})  //多个

注意:不可以省略“basePackageClasses =”

@Configuration
@ComponentScan(basePackageClasses = HelloController.class)
public class MyConfig {
}

总结

Spring ComponentScan注解有以下特性:

1. 自定扫描路径下边带有@Controller,@Service,@Repository,@Component注解加入spring容器

2. 通过includeFilters加入扫描路径下没有以上注解的类加入spring容器

3. 通过excludeFilters过滤出不用加入spring容器的类

4. 自定义增加了@Component注解的注解方式

SpringBootConfiguration注解
SpringBootConfiguration是SpringBoot项目的配置注解,这也是一个组合注解,SpringBootConfiguration注解可以用java代码的形式实现spring中xml配置文件配置的效果,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。

实例

@SpringBootConfiguration
public class Config {
    @Bean
    public Map MyMap(){
        Map map = new HashMap();
        map.put("website","51gjie");
        map.put("type","javaschool");
        map.put("age",5);
        return map;
    }
}

@RestController
@SpringBootApplication
public class App 
{   
    public static void main( String[] args )
    {
        Map map = (Map) context.getBean("MyMap");   //注意这里直接获取到这个方法bean
        int age = (int) map.get("age");
        System.out.println("age=="+age);
    }
}

SpringBoot项目中推荐使用@SpringBootConfiguration替代@Configuration

EnableAutoConfiguration注解
EnableAutoConfiguration是SpringBoot的一个特性,可以根据classpath中的jar依赖,自动注册bean,一般用于类或接口上,它尝试根据您添加的jar依赖项自动配置Spring应用程序。

源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class[] exclude() default {};

    String[] excludeName() default {};
}

@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,借助AutoConfigurationImportSelector,它可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

原理
当springboot扫描到@EnableAutoConfiguration注解时则会将spring-boot-autoconfigure.jar/META-INF/spring.factories文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的value里的所有xxxConfiguration类加载到IOC容器中。spring.factories文件里每一个xxxAutoConfiguration文件一般都会有下面的条件注解:

@ConditionalOnClass : classpath中存在该类时起效

@ConditionalOnMissingClass : classpath中不存在该类时起效

@ConditionalOnBean : DI容器中存在该类型Bean时起效

@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效

@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效

@ConditionalOnExpression : SpEL表达式结果为true时

@ConditionalOnProperty : 参数设置或者值一致时起效

@ConditionalOnResource : 指定的文件存在时起效

@ConditionalOnJndi : 指定的JNDI存在时起效

@ConditionalOnJava : 指定的Java版本存在时起效

@ConditionalOnWebApplication : Web应用环境下起效

@ConditionalOnNotWebApplication : 非Web应用环境下起效

SpringBoot中EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:

  1. 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;

  2. 去重,并将exclude和excludeName属性携带的类排除;

  3. 过滤,将满足条件(@Conditional)的自动配置类返回;

SpringBoot注解就是给代码打上标签的能力。通过引入注解,我们可以简单快速赋予代码生命力,大大提高代码可读性和扩展性。注解本身不具有任何能力,只是一个标签,但是我们可以定义各种标签然后实现各种标签处理器来对类、方法、属性甚至参数等进行功能扩展、功能开启、属性定义、行为定义、规则定义、关联处理、元数据定义等等。

元注解

@Documented:将会在被此注解注解的元素的javadoc文档中列出注解,一般都打上这个注解没坏处

@Target:注解能被应用的目标元素,比如类、方法、属性、参数等等,需要仔细思考

@Retention:仅在源码保留,还是保留到编译后的字节码,还是到运行时也去加载,超过90%的应用会在运行时去解析注解进行额外的处理,所以大部分情况我们都会设置配置为RetentionPolicy.RUNTIME

@Inherited:如果子类没有定义注解的话,能自动从父类获取定义了继承属性的注解,比如Spring的@Service是没有继承特性的,但是@Transactional是有继承特性的,在OO继承体系中使用Spring注解的时候请特别注意这点,理所当然认为注解是能被子类继承的话可能会引起不必要的Bug,需要仔细斟酌是否开启继承

@Repeatable:Java 8引入的特性,通过关联注解容器定义可重复注解,小小语法糖提高了代码可读性,对于元素有多个重复注解其实是很常见的事情,比如某方法可以是A角色可以访问也可以是B角色可以访问,某方法需要定时任务执行,要在A条件执行也需要在B条件执行

@Native:是否在.h头文件中生成被标记的字段,除非原生程序需要和Java程序交互,否则很少会用到这个元注解

基本注解

@Service: 注解在类上,表示这是一个业务层bean

@Controller:注解在类上,表示这是一个控制层bean

@Repository: 注解在类上,表示这是一个数据访问层bean

@Component: 注解在类上,表示通用bean ,value不写默认就是类名首字母小写

@Autowired:按类型注入.默认属性required= true

@Resource: 按名称装配。

启动注解

@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中

@ComponentScan:让spring Boot扫描到Configuration类并把它加入到程序上下文。

@SpringBootConfiguration :等同于spring的XML配置文件;使用Java代码可以检查类型安全。

@EnableAutoConfiguration :自动配置。

HTTP注解

@RequestBody:HTTP请求获取请求体(处理复杂数据,比如JSON)

@RequestHeader:HTTP请求获取请求头

@CookieValue:HTTP请求获取cookie

@SessionAttribute:HTTP请求获取会话

@RequestAttribute:HTTP请求获取请求的Attribute中(比如过滤器和拦截器手动设置的一些临时数据),

@RequestParam:HTTP请求获取请求参数(处理简单数据,键值对),

@PathVariable:HTTP请求获取路径片段,

@MatrixAttribute:HTTP请求获取矩阵变量允许我们采用特殊的规则在URL路径后加参数(分号区分不同参数,逗号为参数增加多个值)

其他注解

@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。

@ConfigurationProperties:给对象赋值,将注解转换成对象。

@RequestMapping:和请求报文是做对应的

@EnableCaching:注解驱动的缓存管理功能

@GeneratedValue:用于标注主键的生成策略,通过 strategy 属性指定

@JsonIgnore:作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。

@JoinColumn(name=”loginId”):一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。

你可能感兴趣的:(SpringBootApplication注解详解与常见SpringBoot注解列表)