spring cloud常用注解及關鍵類


1.@SpringCloudApplication

@SpringCloudApplication
@EnableFeignClients
@MapperScan("com.xx.common.domain.mapper")
@ComponentScan({"com.xx.common", "com.xx.api"})
public class ApiApp
{
    public static void main(String[] args)
    {
        SpringApplication.run(ApiApp.class, args);
    }
}

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}

2.@EnableFeignClients

通過EnableFeignClients調用其他服務的api
// 步驟1
@SpringCloudApplication
@EnableFeignClients
@MapperScan("com.xx.common.domain.mapper")
@ComponentScan({"com.xx.common", "com.xx.api"})
public class ApiApp
{
    public static void main(String[] args)
    {
        SpringApplication.run(XxApiApp.class, args);
    }
}

// 步驟2
@FeignClient(name = "xx-proxy", fallback = XxApiClientFallback.class)
public interface XxApiClient
{
    @PostMapping(value = "/app1/list")
    Resp<XxRes> get_app1_list(@RequestBody XxReq req);

    @PostMapping(value = "/app2/list")
    Resp<XxRes> get_app2_list(@RequestBody XxReq req);
        ......
}

// 步驟3
@RestController
@RequestMapping("/app1")
public class XxController
{
    @Resource
    private XxBiz xxBiz;

    @PostMapping(value = "/list")
    public Resp<XxRes> getList(@RequestBody XxReq req)
    {
        return xxBiz.list(req);
    }

    ......
}

3.@MapperScan

之前是,直接在Mapper類上面添加注解@Mapper,這種方式要求每一個mapper類都需要添加此注解,麻煩。通過使用@MapperScan可以指定要掃描的Mapper類的包的路徑,比如:
@SpringCloudApplication
@EnableFeignClients
@MapperScan("com.xx.common.domain.mapper")
@ComponentScan({"com.xx.common", "com.xx.api"})
public class ApiApp
{
    public static void main(String[] args)
    {
        SpringApplication.run(XxApiApp.class, args);
    }
}
View Code

 

4.@ComponentScan

@ComponentScan告訴Spring 哪個packages 的用注解標識的類 會被spring自動掃描並且裝入bean容器。
用於指定包的掃描路徑。用於代替spring的xml配置文件中的<context:componet-scan base-package=""/>標簽。

spring就會去自動掃描base-package對應的路徑或者該路徑的子包下面的帶有
@Service
@Component
@Repository
@Controller注解的java文件。

5.@Configuration

對應spring xml配置文件。它就是JavaConfig形式的Spring Ioc容器的配置類使用的那個@Configuration,SpringBoot社區推薦使用基於JavaConfig的配置形式,所以,這里的啟動類標注了@Configuration之后,本身其實也是一個IoC容器的配置類。

6.WebMvcConfigurer

SpringBoot1.x->SpringBoot2.0版本,使用的系統內還是存在一些兼容性的問題,有很多變化!!!
SpringBoot1.x中可以使用WebMvcConfigurerAdapter抽象類來處理SpringMVC相關的配置;
SpringBoot2.0版本最低支持 JDK1.8環境,在JDK1.8引入了特殊的關鍵字default,該關鍵字配置在interface接口的方法時子類可以不去實現該方法,相當於抽象類內已經實現的接口方法。

// 方式一:JavaBean配置WebMvcConfigurer
@Configuration
public class WebJavaBeanConfiguration {
    @Autowired
    private LogInterceptor logInterceptor;
    
    /** 實例化WebMvcConfigurer接口 */
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
            /** 添加攔截器 */
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(logInterceptor).addPathPatterns("/**");
            }
        };
    }
}
@Component
public class LogInterceptor implements HandlerInterceptor {
    /** logger instance */
    static Logger logger = LoggerFactory.getLogger(LogInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        logger.info("請求路徑:{}", request.getRequestURI());
        return true;
    }
}

// 方式二:實現類配置WebMvcConfigurer
@Configuration
public class InterceptorConfigurer implements WebMvcConfigurer {
    @Autowired
    private LogInterceptor logInterceptor;
    /**
     * 重寫添加攔截器方法並添加配置攔截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(logInterceptor).addPathPatterns("/**");
    }
}
View Code

7.ClientHttpRequestFactory

RestTemplate類位於org.springframework.web.client包中,提供Http的各類方法:如Get,Head,Post,Put,Delete等,RestTemplate有兩個構造方法,分別是:
public RestTemplate() { }

public RestTemplate(ClientHttpRequestFactory requestFactory) {
    this();
    setRequestFactory(requestFactory);
}
第一個進行默認初始化,需求中我們需要對請求超時進行設置並能夠對超時進行后續處理,第一個構造方法,我們無法控制超時時間
第二個構造中的ClientHttpRequestFactory接口的實現類中存在timeout屬性,因此選用第二個構造方法。
在spring配置文件中進行如下配置:
// 一、配置方式
<!-- 配置RestTemplate -->
<!--Http client Factory-->  
<bean id="httpClientFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory">  
    <property name="connectTimeout"  value="${connectTimeout}"/>
    <property name="readTimeout"  value="${readTimeout}"/>
</bean>  
<!--RestTemplate-->  
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">  
    <constructor-arg ref="httpClientFactory"/>  
</bean>

//  二、注解方式
@Configuration
public class RestTemplateConfig
{
    @Bean
    public ClientHttpRequestFactory clientHttpRequestFactory()
    {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);
        factory.setConnectTimeout(5000);
        return factory;
    }

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory)
    {
        return new RestTemplate(clientHttpRequestFactory);
    }
}

注意:ClientHttpRequestFactory 接口有4個實現類,分別是:
1.AbstractClientHttpRequestFactoryWrapper 用來裝配其他request factory的抽象類。
2.CommonsClientHttpRequestFactory 允許用戶配置帶有認證和http連接池的httpclient,已廢棄,推薦用HttpComponentsClientHttpRequestFactory。
3.HttpComponentsClientHttpRequestFactory 同2.
4.SimpleClientHttpRequestFactory 接口的一個簡單實現,可配置proxy,connectTimeout,readTimeout等參數。
本文中使用的是第4個實現,具體的根據個人需求再選在使用哪個。
View Code

8.@EnableResourceServer

@EnableResourceServer注釋用於告訴微服務它是受保護的資源。

9.@Retention@Documented@Inherited

@Retention(保留)注解說明,這種類型的注解會被保留到那個階段. 有三個值:
1.RetentionPolicy.SOURCE —— 這種類型的Annotations只在源代碼級別保留,編譯時就會被忽略
2.RetentionPolicy.CLASS —— 這種類型的Annotations編譯時被保留,在class文件中存在,但JVM將會忽略
3.RetentionPolicy.RUNTIME —— 這種類型的Annotations將被JVM保留,所以他們能在運行時被JVM或其他使用反射

@Documented 注解表明這個注解應該被 javadoc工具記錄. 默認情況下,javadoc是不包括注解的. 但如果聲明注解時指定了 @Documented,則它會被 javadoc 之類的工具處理, 所以注解類型信息也會被包括在生成的文檔中.

@Inherited這是一個稍微復雜的注解類型. 它指明被注解的類會自動繼承. 更具體地說,如果定義注解時使用了 @Inherited 標記,然后用定義的注解來標注另一個父類, 父類又有一個子類(subclass),則父類的所有屬性將被繼承到它的子類中.
@Inherited
public @interface MyParentObject {
      boolean isInherited() default true;
      String doSomething() default "Do what?";
}
@MyParentObject
public Class MyChildObject {
}
View Code

10.@EnableGlobalMethodSecurity

Spring Security默認是禁用注解的,要想開啟注解,需要在繼承WebSecurityConfigurerAdapter的類上加@EnableGlobalMethodSecurity注解,來判斷用戶對某個控制層的方法是否具有訪問權限。

@Configuration
@EnableWebSecurity -> 可以分解到Application.java
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class OAuth2SecurityConfiguration extends WebSecurityConfigurerAdapter {
    ...........................
}

@PreAuthorize("hasRole('admin')")
@RequestMapping(value = "/user/", method = RequestMethod.GET)
@ResponseBody
public List<User> listAllUsers() {
    List<User> users = userService.findAll();
    if(users.isEmpty()){
        return null;
    }
    return users;
}
View Code

11.@Import

@Import注解就是之前xml配置中的import標簽,可以用於依賴第三方包中bean的配置和加載
在4.2之前只支持導入配置類
在4.2,@Import注解支持導入普通的java類,並將其聲明成一個bean

public class DemoService {
    public void doSomething(){
        System.out.println("ok");
    }
}
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(DemoService.class)//在spring 4.2之前是不不支持的
public class DemoConfig {
}

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com..example");
    DemoService ds = context.getBean(DemoService.class);
    ds.doSomething();
}
}
View Code

12.@LoadBalanced

@LoadBalanced注釋告訴Spring Cloud創建一個Ribbon支持的RestTemplate類。

@SpringBootApplication
@EnableDiscoveryClient // 使用Ribbon時,這兩個注釋不需要
@EnableFeignClients 
public class Application {
    @LoadBalanced
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
View Code

13.@CacheEvict

@CacheEvict是用來標注在需要清除緩存元素的方法或類上的。當標記在一個類上時表示其中所有的方法的執行都會觸發緩存的清除操作。@CacheEvict可以指定的屬性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的語義與@Cacheable對應的屬性類似。
value:表示清除操作是發生在哪些Cache上的(對應Cache的名稱);
key:表示需要清除的是哪個key,如未指定則會使用默認策略生成的key;
condition:表示清除操作發生的條件。
下面我們來介紹一下新出現的兩個屬性allEntries和beforeInvocation。

從3.1開始,Spring引入了對Cache的支持。其使用方法和原理都類似於Spring對事務管理的支持。Spring Cache是作用在方法上的,其核心思想是這樣的:當我們在調用一個緩存方法時會把該方法參數和返回結果作為一個鍵值對存放在緩存中,等到下次利用同樣的參數來調用該方法時將不再執行該方法,而是直接從緩存中獲取結果進行返回。所以在使用Spring Cache的時候我們要保證我們緩存的方法對於相同的方法參數要有相同的返回結果。
View Code

14.@lombok

lombok 的官方網址:http://projectlombok.org/  
lombok 提供的注解不多,可以參考官方視頻的講解和官方文檔。
    Lombok 注解在線幫助文檔:http://projectlombok.org/features/index.
    下面介紹幾個我常用的 lombok 注解:
        @Data:注解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、hashCode、toString 方法
        @Setter:注解在屬性上;為屬性提供 setting 方法
        @Getter:注解在屬性上;為屬性提供 getting 方法
        @Log4j :注解在類上;為類提供一個 屬性名為log 的 log4j 日志對象
        @NoArgsConstructor:注解在類上;為類提供一個無參的構造方法
        @AllArgsConstructor:注解在類上;為類提供一個全參的構造方法

@Data相當於@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode這5個注解的合集。
通過官方文檔,可以得知,當使用@Data注解時,則有了@EqualsAndHashCode注解,那么就會在此類中存在equals(Object other) 和 hashCode()方法,且不會使用父類的屬性,這就導致了可能的問題。
修復此問題的方法很簡單:
1.使用@Getter @Setter @ToString代替@Data並且自定義equals(Object other) 和 hashCode()方法,比如有些類只需要判斷主鍵id是否相等即足矣。 
2.或者使用在使用@Data時同時加上@EqualsAndHashCode(callSuper=true)注解。    
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM