Fork me on GitHub

微服务开中常用注解

目录

一、组件注册

@SpringBootConfiguration

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

SpringBootConfiguration 可以作为 Spring 标准中 @Configuration 注解的替代。SpringBoot 项目中推荐使用@SpringBootConfiguration 替代 @Configuration。

@Scope

@Scope注解主要作用是调节Ioc容器中的作用域,在Spring IoC容器中主要有以下五种作用域:基本作用域:singleton(单例)、prototype(多例);Web 作用域(reqeust、session、globalsession),自定义作用域。

@Scope注解是springIoc容器中的一个作用域,在 Spring IoC 容器中具有以下几种作用域:基本作用域singleton(单例)prototype(多例),Web 作用域(reqeust、session、globalsession),自定义作用域

  • singleton单例模式(默认):全局有且仅有一个实例
  • prototype原型模式:每次获取Bean的时候会有一个新的实例
  • request: request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
  • session :session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
  • global session : global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义

直接使用字符串容易出问题,spring有默认的参数:

  • ConfigurableBeanFactory.SCOPE_PROTOTYPE,即“prototype”
  • ConfigurableBeanFactory.SCOPE_SINGLETON,即“singleton”
  • WebApplicationContext.SCOPE_REQUEST,即“request”
  • WebApplicationContext.SCOPE_SESSION,即“session”

二、常用注解

@SpringBootApplication

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {

/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
Class<?>[] exclude() default {};

}

定义在main方法入口类处,用于启动sping boot应用项目

@EnableAutoConfiguration

让spring boot根据类路径中的jar包依赖当前项目进行自动配置

在src/main/resources的META-INF/spring.factories

1
2
3
4
5
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration

若有多个自动配置,用“,”隔开

@ImportResource

加载xml配置,一般是放在启动main类上

1
2
3
@ImportResource("classpath*:/spring/*.xml")  单个

@ImportResource({"classpath*:/spring/1.xml","classpath*:/spring/2.xml"}) 多个

@Value

application.properties定义属性,直接使用@Value注入即可

1
2
3
4
public class A{
@Value("${push.start:0}") 如果缺失,默认值为0
private Long id;
}

@ConfigurationProperties

可以新建一个properties文件,ConfigurationProperties的属性prefix指定properties的配置的前缀,通过location指定properties文件的位置

1
2
3
4
5
6
@ConfigurationProperties(prefix="person")
public class PersonProperties {

private String name ;
private int age;
}

@EnableConfigurationProperties

用 @EnableConfigurationProperties注解使 @ConfigurationProperties生效,并从IOC容器中获取bean。

https://blog.csdn.net/u010502101/article/details/78758330

@RestController

组合@Controller和@ResponseBody,当你开发一个和页面交互数据的控制时,比如bbs-web的api接口需要此注解

@RequestMapping

用来映射web请求(访问路径和参数)、处理类和方法,可以注解在类或方法上。注解在方法上的路径会继承注解在类上的路径。

produces属性: 定制返回的response的媒体类型和字符集,或需返回值是json对象

1
@RequestMapping(value="/api2/copper",produces="application/json;charset=UTF-8",method = RequestMethod.POST)

@RequestParam

获取request请求的参数值

1
2
3
4
5
public List<CopperVO> getOpList(HttpServletRequest request,
@RequestParam(value = "pageIndex", required = false) Integer pageIndex,
@RequestParam(value = "pageSize", required = false) Integer pageSize) {

}

@ResponseBody

支持将返回值放在response体内,而不是返回一个页面。比如Ajax接口,可以用此注解返回数据而不是页面。此注解可以放置在返回值前或方法前。

1
2
3
4
5
6
7
8
9
10
另一个玩法,可以不用@ResponseBody
继承FastJsonHttpMessageConverter类并对writeInternal方法扩展,在spring响应结果时,再次拦截、加工结果
// stringResult: json返回结果
//HttpOutputMessage outputMessage

byte[] payload = stringResult.getBytes();
outputMessage.getHeaders().setContentType(META_TYPE);
outputMessage.getHeaders().setContentLength(payload.length);
outputMessage.getBody().write(payload);
outputMessage.getBody().flush();

@Bean

@Bean(name=”bean的名字”,initMethod=”初始化时调用方法名字”,destroyMethod=”close”)

定义在方法上,在容器内初始化一个bean实例类。

1
2
3
4
5
@Bean(destroyMethod="close")
@ConditionalOnMissingBean
public PersonService registryService() {
return new PersonService();
}

@Service

用于标注业务层组件

@Controller

用于标注控制层组件(如struts中的action)

@Repository

用于标注数据访问组件,即DAO组件

@Component

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@PostConstruct

spring容器初始化时,要执行该方法

1
2
3
@PostConstruct  
public void init() {
}

@PathVariable

用来获得请求url中的动态参数

1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller  
public class TestController {

@RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)
public String getLogin(@PathVariable("userId") String userId,
@PathVariable("roleId") String roleId){

System.out.println("User Id : " + userId);
System.out.println("Role Id : " + roleId);
return "hello";

}
}

@ComponentScan

注解会告知Spring扫描指定的包来初始化Spring

1
@ComponentScan(basePackages = "com.bbs.xx")

@EnableZuulProxy

路由网关的主要目的是为了让所有的微服务对外只有一个接口,我们只需访问一个网关地址,即可由网关将所有的请求代理到不同的服务中。Spring Cloud是通过Zuul来实现的,支持自动路由映射到在Eureka Server上注册的服务。Spring Cloud提供了注解@EnableZuulProxy来启用路由代理。

@Autowired

在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。

当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false),这等于告诉 Spring: 在找不到匹配 Bean 时也不报错

@Autowired注解注入map、list与@Qualifier在新窗口打开

@Configuration

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration("name")//表示这是一个配置信息类,可以给这个配置类也起一个名称
@ComponentScan("spring4")//类似于xml中的<context:component-scan base-package="spring4"/>
public class Config {

@Autowired//自动注入,如果容器中有多个符合的bean时,需要进一步明确
@Qualifier("compent")//进一步指明注入bean名称为compent的bean
private Compent compent;

@Bean//类似于xml中的<bean id="newbean" class="spring4.Compent"/>
public Compent newbean(){
return new Compent();
}
}

@Import

导入Config1配置类里实例化的bean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
public class CDConfig {

@Bean // 将SgtPeppers注册为 SpringContext中的bean
public CompactDisc compactDisc() {
return new CompactDisc(); // CompactDisc类型的
}
}

@Configuration
@Import(CDConfig.class) //导入CDConfig的配置
public class CDPlayerConfig {

@Bean(name = "cDPlayer")
public CDPlayer cdPlayer(CompactDisc compactDisc) {
// 这里会注入CompactDisc类型的bean
// 这里注入的这个bean是CDConfig.class中的CompactDisc类型的那个bean
return new CDPlayer(compactDisc);
}
}

@Order

@Order(1),值越小优先级超高,越先运行

三、条件注解

如果注解指定的条件成立,则触发指定行为,条件注解列表:

@ConditionalOnRepositoryType (org.springframework.boot.autoconfigure.data)
@ConditionalOnDefaultWebSecurity (org.springframework.boot.autoconfigure.security)
@ConditionalOnSingleCandidate (org.springframework.boot.autoconfigure.condition)
@ConditionalOnWebApplication (org.springframework.boot.autoconfigure.condition)
@ConditionalOnWarDeployment (org.springframework.boot.autoconfigure.condition)
@ConditionalOnJndi (org.springframework.boot.autoconfigure.condition)
@ConditionalOnResource (org.springframework.boot.autoconfigure.condition)
@ConditionalOnExpression (org.springframework.boot.autoconfigure.condition)
@ConditionalOnClass (org.springframework.boot.autoconfigure.condition)
@ConditionalOnEnabledResourceChain (org.springframework.boot.autoconfigure.web)
@ConditionalOnMissingClass (org.springframework.boot.autoconfigure.condition)
@ConditionalOnNotWebApplication (org.springframework.boot.autoconfigure.condition)
@ConditionalOnProperty (org.springframework.boot.autoconfigure.condition)
@ConditionalOnCloudPlatform (org.springframework.boot.autoconfigure.condition)
@ConditionalOnBean (org.springframework.boot.autoconfigure.condition)
@ConditionalOnMissingBean (org.springframework.boot.autoconfigure.condition)
@ConditionalOnMissingFilterBean (org.springframework.boot.autoconfigure.web.servlet)
@Profile (org.springframework.context.annotation)
@ConditionalOnInitializedRestarter (org.springframework.boot.devtools.restart)
@ConditionalOnGraphQlSchema (org.springframework.boot.autoconfigure.graphql)
@ConditionalOnJava (org.springframework.boot.autoconfigure.condition)

@ConditionalOnMissingClass

如果类路径中不存在这个类,则触发指定行为

@ConditionalOnBean

如果容器中存在这个Bean(组件),则触发指定行为,@ConditionalOnBean(value=组件类型,name=组件名字):判断容器中是否有这个类型的组件,并且名字是指定的值

@ConditionalOnMissingBean

如果容器中不存在这个Bean(组件),则触发指定行为

场景:

如果存在FastsqlException这个类,给容器中放一个Cat组件,名cat01,

否则,就给容器中放一个Dog组件,名dog01

如果系统中有dog01这个组件,就给容器中放一个 User组件,名zhangsan

否则,就放一个User,名叫lisi

@ConditionalOnProperty

这个注解能够控制某个 @Configuration 是否生效。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效。

https://blog.csdn.net/dalangzhonghangxing/article/details/78420057

@ConditionalOnClass

如果类路径中存在这个类,则触发指定行为;

该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类;

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
@ConditionalOnClass({Gson.class})
public class GsonAutoConfiguration {
public GsonAutoConfiguration() {
}

@Bean
@ConditionalOnMissingBean
public Gson gson() {
return new Gson();
}
}

@ConditionalOnMisssingClass

1
@ConditionalOnMisssingClass({ApplicationManager.class})

如果存在它修饰的类的bean,则不需要再创建这个bean;

@ConditionOnMissingBean

1
@ConditionOnMissingBean(name = "example")

表示如果name为“example”的bean存在,该注解修饰的代码块不执行。

@ConditionalOnExpression

1
2
3
4
5
6
7
8
@Configuration
@ConditionalOnExpression("${enabled:false}")
public class BigpipeConfiguration {
@Bean
public OrderMessageMonitor orderMessageMonitor(ConfigContext configContext) {
return new OrderMessageMonitor(configContext);
}
}

开关为true的时候才实例化bean

四、属性绑定

@ConfigurationProperties

声明组件的属性和配置文件哪些前缀开始项进行绑定

@EnableConfigurationProperties

快速注册注解:

  • 场景: SpringBoot默认只扫描自己主程序所在的包。如果导入第三方包,即使组件上标注了 @Component、@ConfigurationProperties 注解,也没用。因为组件都扫描不进来,此时使用这个注解就可以快速进行属性绑定并把组件注册进容器

这个一点倒是很重要,SpringBoot默认扫描当前项目主程序包及其子包,再加上自动配置类,那么属性类是不会扫描到的,此时就算加上@Component注解也是没有任何用处,所以一般是在属性类上面使用 @ConfigurationProperties注解,而在相应的自动配置类上面使用@EnableConfigurationProperties注解,从而让属性类绑定生效

  • 将容器中任意组件(Bean)的属性值配置文件的配置项的值进行绑定

    • 1、给容器中注册组件(@Component、@Bean)

    • 2、使用 @ConfigurationProperties 声明组件和配置文件的哪些配置项进行绑定

五、缓存注解

@EnableCaching

开启缓存注解的支持

@Cacheable

@Cacheable 注解表示方法的结果应该被缓存起来,下次调用该方法时,如果参数和之前相同,则返回缓存结果。

1
2
3
4
5
6
7
@Service
public class MyService {
@Cacheable("greetingCache")
public String greeting(String name) {
return "Hello, " + name + "!";
}
}

@CachePut

@CachePut 注解表示方法的结果应该被缓存起来,下次调用该方法时,不会返回缓存结果,而是重新计算结果并缓存起来。

1
2
3
4
5
6
7
@Service
public class MyService {
@CachePut("greetingCache")
public String greeting(String name) {
return "Hello, " + name + "!";
}
}

@CacheEvict

@CacheEvict 注解表示方法执行后从缓存中删除指定项。

1
2
3
4
5
6
@Service
public class MyService {
@CacheEvict("greetingCache")
public void clearGreetingCache() {
}
}

@CacheConfig

@CacheConfig是结合@Cacheable使用的来设置过期时间的

@Caching

@Caching 注解可以在一个方法或者类上同时指定多个Spring Cache相关的注解。
其拥有三个属性:cacheable、put 和 evict,分别用于指定@Cacheable、@CachePut 和 @CacheEvict。对于一个数据变动,更新多个缓存的场景,可以通过 @Caching 来实现:

1
2
3
4
@Caching(cacheable = @Cacheable(cacheNames = "caching", key = "#age"), evict = @CacheEvict(cacheNames = "t4", key = "#age"))
public String caching(int age) {
return "caching: " + age + "-->" + UUID.randomUUID().toString();
}

参考:

https://www.cnblogs.com/ziyue7575/p/c925cfe466df01c1d352f37da8823946.html

https://pdai.tech/md/spring/springboot/springboot-x-hello-anno.html

相关文章

微信打赏

赞赏是不耍流氓的鼓励