美文网首页
SpringBootApplication常用的注解

SpringBootApplication常用的注解

作者: 没米吃的耗子 | 来源:发表于2021-01-05 15:42 被阅读0次

项目中的常用注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;


@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
@ServletComponentScan
@EnableAsync
public class TunnyCommandCenterApplication {
    public static void main(String[] args) {
        SpringApplication.run(TunnyCommandCenterApplication.class, args);
    }
}
@SpringBootApplication: SpringBoot注解,自动为我们扫描配置,最终成功启动项目
  • java中元注解有四个: @Retention @Target @Document @Inherited

@Retention:注解的保留位置         
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target:注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包

@Document:说明该注解将被包含在javadoc中

@Inherited:说明子类可以继承父类中的该注解

  • @SpringBootConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

这说明 @SpringBootConfiguration 也是来源于 @Configuration,二者功能都是将当前类标注为配置类,并将当前类里以 @Bean 注解标记的方法的实例注入到Spring容器中,实例名即为方法名。

至于@Configuration,我想在非Spring Boot时代大家应该就不陌生,作用是配置Spring容器,也即 JavaConfig 形式的 Spring IoC 容器的配置类所使用。

  • @EnableAutoConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
 ...
}

作用:从 ClassPath下扫描所有的 META-INF/spring.factories 配置文件,并将spring.factories文件中的 EnableAutoConfiguration对应的配置项通过反射机制实例化为对应标注了 @Configuration 的形式的IoC配置类,然后注入IoC容器。
@EnableAutoConfiguration 注解启用自动配置,其可以帮助 Spring Boot 应用将所有符合条件的 @Configuration 配置都加载到当前 IoC 容器之中,可以简要用图形示意如下:

  • @ComponentScan 组件扫描

@ComponentScan 对应于XML配置形式中的 <context:component-scan>,用于将一些标注了特定注解的bean定义批量采集注册到Spring的IoC容器之中,这些特定的注解大致包括:
@Controller
@Entity
@Component
@Service
@Repository

对于该注解,还可以通过 basePackages 属性来更细粒度的控制该注解的自动扫描范围,比如:

@ComponentScan({"com.huazheng.tunny.commandcenter", "com.huazheng.tunny.organization""})
@EnableDiscoveryClient: 启用服务注册发现功能
  • 与EnableEurekaClient的区别
    @EnableEurekaClient注解源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@EnableDiscoveryClient
public @interface EnableEurekaClient {

}

EnableEurekaClient 中使用了EnableDiscoveryClient。因此,从使用角度来看两者已经没有什么区别了,官方建议使用EnableDiscoveryClient。

区别:
 @EnableDiscoveryClient注解是基于spring-cloud-commons依赖,并且在classpath中实现。
 @EnableEurekaClient注解是基于spring-cloud-netflix依赖,只能为eureka作用。
 @EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
 从Spring Cloud 1.0.0.RC1版本开始,就已经不推荐使用EnableEurekaClient和EnableHystrix了。服务注册发现功能被抽象后放入spring-cloud-commons库,该库的EnableDiscoveryClient可以取代旧的EnableEurekaClient,使用注解EnableDiscoveryClient就能启用服务注册发现功能。 同理,EnableHystrix也被EnableCircuitBreaker取代了。

@EnableFeignClients:启用feign客户端(Spring cloud 注解)

源码:


package org.springframework.cloud.openfeign;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({FeignClientsRegistrar.class})
public @interface EnableFeignClients {
    String[] value() default {};

    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};

    Class<?>[] defaultConfiguration() default {};

    Class<?>[] clients() default {};
}

@ServletComponentScan:Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

源码:

package org.springframework.boot.web.servlet;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;
import org.springframework.core.annotation.AliasFor;

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

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

    Class<?>[] basePackageClasses() default {};
}
@EnableAsync:开启异步支持;使用@Async来对某个方法进行异步执行

源码:


package org.springframework.scheduling.annotation;

import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.AdviceMode;
import org.springframework.context.annotation.Import;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({AsyncConfigurationSelector.class})
public @interface EnableAsync {
    Class<? extends Annotation> annotation() default Annotation.class;

    boolean proxyTargetClass() default false;

    AdviceMode mode() default AdviceMode.PROXY;

    int order() default 2147483647;
}

参考:

https://mp.weixin.qq.com/s/SkCWu3xa2t5kcMGQYcOghA
https://blog.csdn.net/sw5131899/article/details/54947192

相关文章

网友评论

      本文标题:SpringBootApplication常用的注解

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