本文只列出Spring Boot应用中一些常用的注解,没有对注解的原理和用法做详细说明。如果你需要详细了解注解,请查阅官方文档。

@Bean

      一般作用在方法上,产生一个Spring的bean对象。@Bean常用的注解参数有name和value, value是参数name的别名。bean的名称可以通过指定value或name来确定,如果未指定,bean名就是方法名。

@Service

    @Service表示业务组件,可以作用在任何层上。申明在类上,标注此类交给Spring IOC管理。@Service注解有一个属性value,可以通过value来指定在SpringIOC容器中的bean名称,如果未指定,bean名称默认是类名(头字母小写)。

@Component

    @Component泛指组件。用法和@Service一致,主要区别是在语义上,当类不好进行归类时可以使用@Component注解进行标注。

@Repository

     标注在数据访问层DAO的类名上,用法和上述的@Service和@ @Component一致。但是不能标注在其它层,因为它不仅将该类标识为SpringIOC bean, 它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。

@Controller和@RestController

    标注在类上,表示该类是Spring的控制器,在SpringMVC中,控制器Controller 负责处理由DispatcherServlet 分发的请求。@RestController和@Controller的区别是,@RestContrlller注解默认加上了@ResponseBoby注解。

@Configuration

  标注在类上,表示此类是一个配置类,被注解的类内部包含有一个或多个被@Bean注解的方法。被@Configuration注解的类不可以是final类,不可以是匿名类,嵌套时必须是静态类。

@PostConstruct和@PreDestroy

       标注的非静态的void方法上,影响bean的生命周期。被@PostConstruct修饰的方法会在服务器加载bean的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行。

@Import 

    导入资源。可以导入未被Spring Boot扫描到的类,也可以导入配置类。

@PropertySource

    加载指定的属性文件(*.properties或*.yml)到 Spring 的 Environment 中。

@Value

    标注在成员变量上。可以把自定义的属性注入到被该注解的成员变量上。

@ConfigurationProperties

    标注在类上,可以自动把自定义的属性注入到该类中名称相同的成员变量上。指定前缀。

@Componentscan

    用来指定Spring扫描的包路径,Spring会把加载此包和它所有的子包下面所有bean。

@Lazy

    延迟加载bean,设置为延迟加载的bean只有在被调用的时候才会去初始化。主要作用是减少SpringIOC容器启动的加载时间,在有循环依赖时也可以使用该注解。

@Profile

    环境标识,标注了该注解的bean,只有在指定的环境的才会被加载。不指定时任何环境都会加载。如在配置类上,作用与配置里面所有的bean。

@Scope

    Bean的作用域,有singleton,prototype、request、session、global session,默认是singleton。singleton表示单例,全局有且仅有一个实例。prototype每次获取Bean都会新建一个实例。request表示每一个http request请求都会生成一个实例,该实例仅在当前的http请求中有效。session同request类似,作用域是http session中。global session同session类似,不过它仅仅在基于portlet的web应用中才有意义。

@DependsOn

    用来标识当前bean依赖另一个bean,所依赖的bean会被容器确保在当前bean实例化之前被实例化。

@Order

    用来定义一系列bean的执行顺序,比如filter,aop等。不是用来定义bean的加载顺序的,bean的加载顺序和它没有任何关系。

@Primary

    当一个接口有多个实现类时,并且都注入到了SpringIOC容器中,使用@Autowired注入时就不知道选择哪一个。如果其中一个实现类使用了@Primary,@Autowired就会优先考虑该bean注入。

@Conditional

   表示该Bean只有在满足特定的条件后才会被加载。spring提供了一些默认的conditional类

  • @ConditionalOnBean:仅仅在当前上下文中存在某个对象时,才会实例化一个Bean
  • @ConditionalOnClass:某个class位于类路径上,才会实例化一个Bean
  • @ConditionalOnExpression:当表达式为true的时候,才会实例化一个Bean
  • @ConditionalOnMissingBean: 仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean
  • @ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个Bean
  • @ConditionalOnNotWebApplication:不是web应用
     

@Autowired

 可以对类成员变量,setter方法,构造函数进行标注,完成自动装配。主要用来消除setter/getter方法。

@Qualifier

  当创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱

@SpringBootConfiguration

    标名当前类是spring boot的配置类,同@Configuration。

@EnableAutoConfiguration

    将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

@ConfigurationPropertiesScan

   Spring Boot 2.2.0版本定义了@ConfigurationProperties可以不需要配合@Configuration使用,但是后续版本又改回来了。为了兼容加了@ConfigurationPropertiesScan注解,用来主动扫描没有定义 Bean 的 @ConfigurationProperties。

@SpringBootApplication

  标注为Spring Boot的启动类,是复核注解,里面包含有@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan,@ConfigurationPropertiesScan。

@EntityScan

 用来扫描和发现指定包及其子包中的Entity定义

@EnableJpaRepositories

用来扫描和发现指定包及其子包中的Repository定义。

@SpringBootTest

用来进行单元测试,属性classes指定启动类,属性webEnvironment指定运行端口号。

@WebMvcTest

主要用于Controller层测试。只覆盖应用程序的controller层,HTTP请求和响应是Mock出来的,因此不会创建真正的连接。因此需要创建 MockMvc bean进行模拟接口调用。

@DataJpaTest

用于数据Repository层测试。仅加载与JPA相关的配置 。默认情况下,带有@DataJpaTest注解的测试使用嵌入式内存数据库。

@Mock 

定义个mock属性。

@MockBean

使用该注解可以将mock bean注入到spring的上下文中。Mock将替换Spring上下文中任何相同类型的现有bean,如果没有定义相同类型的bean,将添加一个新的bean。

@SpyBean

与@MockBean类似,它不会生成一个 Bean 的替代品装配到类中,而是会监听一个真正的 Bean 中某些特定的方法,并在调用这些方法时给出指定的反馈。却不会影响这个 Bean 其它的功能。

@ContextConfiguration

指定junit单元测试中的配置文件

Juint其它注解

  • @Test: 测试方法,可以设置超时时间和期望异常。
  • @Before: 初始化方法,在@Test方法之前执行。
  • @After: 在@Test方法执行后执行。
  • @Igonre: 忽略掉的@Test测试方法。
  • @BeforeClass: 对测试类中所有测试方法之前执行,只执行一次。
  • @AfterClass: 对测试类中所有测试方法之后执行,只执行一次。

Spring AOP注解

  • @Aspect:作用是把当前类标识为一个切面供容器读取
  • @Pointcut:Pointcut是植入Advice的触发条件。每个Pointcut的定义包括2部分,一是表达式,二是方法签名。方法签名必须是 public及void型。可以将Pointcut中的方法看作是一个被Advice引用的助记符,因为表达式不直观,因此我们可以通过方法签名的方式为 此表达式命名。因此Pointcut中的方法只需要方法签名,而不需要在方法体内编写实际代码。
  • @Around:环绕增强
  • @AfterReturning:后置增强,方法正常退出时执行
  • @Before:标识一个前置增强方法
  • @AfterThrowing:异常抛出增强
  • @After: final增强,不管是抛出异常或者正常退出都会执行