亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談自定義注解在Spring中的應(yīng)用

 更新時間:2017年12月25日 14:13:07   作者:liuxigiant  
這篇文章主要介紹了淺談自定義注解在Spring中的應(yīng)用,具有一定借鑒價值,需要的朋友可以參考下。

1.Java自定義注解與Spring

Java注解作為程序元素(類、成員變量、成員方法等)的一種元數(shù)據(jù)信息,對程序本身的執(zhí)行不會產(chǎn)生影響。通過自定義注解,可以給程序元素添加特殊的聲明。

Spring作為構(gòu)建企業(yè)級應(yīng)用的平臺,提供了豐富的功能。將Java的自定義注解與Spring結(jié)合,在特定場景下實現(xiàn)注解的解析、處理,可以降低應(yīng)用的耦合度,提高程序的可擴展性。

2.應(yīng)用場景

下面總結(jié)幾種應(yīng)用場景,僅說明大致思路(ps:并非所有場景都在項目中實踐過)

2.1登陸、權(quán)限攔截

在web項目中,登陸攔截和權(quán)限攔截是一個老生常談的功能。通過自定義登陸注解或權(quán)限注解,在自定義攔截器中解析注解,實現(xiàn)登陸和權(quán)限的攔截功能。

這種使用方式,配置簡單,靈活度高,代碼耦合度低。

2.2定時任務(wù)管理

在系統(tǒng)構(gòu)建過程中,會有各種定時任務(wù)的需求,而定時任務(wù)的集中管理,可以更高效維護系統(tǒng)的運行。

通過Java注解官方文檔RepeatingAnnotations章節(jié)中的自定義的定時任務(wù)注解,可以實現(xiàn)業(yè)務(wù)方法的定時任務(wù)聲明。結(jié)合Spring的容器后處理器BeanPostProcessor(ps:Spring容器后處理器下篇再說),解析自定義注解。解析后的注解信息再使用QuartzAPI構(gòu)建運行時定時任務(wù),即可完成定時任務(wù)的運行時創(chuàng)建和集中管理。

這種方式能避免定義Quartz定時任務(wù)的配置,提高系統(tǒng)擴展性。

2.3多數(shù)據(jù)源路由的數(shù)據(jù)源指定

Spring提供的AbstractRoutingDataSource實現(xiàn)多數(shù)據(jù)源的動態(tài)路由,可應(yīng)用在主從分離的架構(gòu)下。通過對不同的方法指定不同的數(shù)據(jù)源,實現(xiàn)數(shù)據(jù)源的動態(tài)路由(例如:讀方法走從庫數(shù)據(jù)源,寫方法走主庫數(shù)據(jù)源)。而如何標識不同的方法對應(yīng)的數(shù)據(jù)源類型,則可使用自定義注解實現(xiàn)。通過解析方法上聲明的自定義注解對應(yīng)的數(shù)據(jù)源類型,實現(xiàn)數(shù)據(jù)源的路由功能。

這種方式避免了對方法的模式匹配解析(例如:select開頭、update開頭等),聲明更加靈活。

自定義注解

先看一個最簡單的例子,在使用SpringWeb應(yīng)用中的過程中,大家免不了會使用@Controller,@Service,@Repository等注解來定義JavaBean。那么怎么自己定義一個注解,Spring可以自動加載呢。所以就有了第一個例子。

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MyComponent {
  String value() default "";
}
@Configuration
public class ComponentAnnotationTest {
 public static void main(String[] args) {
  AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
annotationConfigApplicationContext.register(ComponentAnnotationTest.class);
  annotationConfigApplicationContext.refresh();
  InjectClass injectClass = annotationConfigApplicationContext.getBean(InjectClass.class);
    injectClass.print();
 }
 @MyComponent
 public static class InjectClass {
  public void print() {
    System.out.println("hello world");
  }
 }
}

運行這個例子,就會發(fā)現(xiàn),@MyComponent 注解的類,也被Spring加載進來了,而且可以當成普通的JavaBean正常的使用。查看Spring的源碼會發(fā)現(xiàn),Spring是使用ClassPathScanningCandidateComponentProvider掃描package,這個類有這樣的注釋

A component provider that scans the classpath from a base package. 
It then applies exclude and include filters to the resulting classes to find candidates.

這個類的 registerDefaultFilters 方法有這樣幾行代碼

protected void registerDefaultFilters() {  
  this.includeFilters.add(new AnnotationTypeFilter(Component.class));
  ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();
  try {  
   this.includeFilters.add(new AnnotationTypeFilter(((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false)); 
   logger.debug("JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning"); 
  }  catch (ClassNotFoundException ex) {   
   // JSR-250 1.1 API (as included in Java EE 6) not available - simply skip.  
  }  
  try {   
   this.includeFilters.add(new AnnotationTypeFilter(((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named", cl)), false));   
   logger.debug("JSR-330 'javax.inject.Named' annotation found and supported for component scanning");  
  } 
  catch (ClassNotFoundException ex) {   
  // JSR-330 API not available - simply skip. 
  }
}

這里就會發(fā)現(xiàn)Spring在掃描類信息的使用只會判斷被@Component注解的類,所以任何自定義的注解只要帶上@Component(當然還要有String value() default "";的方法,因為Spring的Bean都是有beanName唯一標示的),都可以被Spring掃描到,并注入容器內(nèi)。

總結(jié)

以上就是本文關(guān)于淺談自定義注解在Spring中的應(yīng)用的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • 如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫

    如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫

    MyBatis可以通過簡單的XML或者注解來配置和映射原始類型,接口,和Java POJO為數(shù)據(jù)庫中記錄,使用MyBatis幫助我們解決各種問題,本文介紹如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫,感興趣的朋友一起看看吧
    2023-11-11
  • idea構(gòu)建web項目的超級詳細教程

    idea構(gòu)建web項目的超級詳細教程

    好多朋友在使用IDEA創(chuàng)建項目時,總會碰到一些小問題,下面這篇文章主要給大家介紹了關(guān)于idea構(gòu)建web項目的超級詳細教程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • java中對字符串每個字符統(tǒng)計的方法

    java中對字符串每個字符統(tǒng)計的方法

    java中對字符串每個字符統(tǒng)計的方法,需要的朋友可以參考一下
    2013-03-03
  • java為什么使用BlockingQueue解決競態(tài)條件問題面試精講

    java為什么使用BlockingQueue解決競態(tài)條件問題面試精講

    這篇文章主要為大家介紹了java為什么使用BlockingQueue解決競態(tài)條件問題面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Spring Boot Maven Plugin打包異常解決方案

    Spring Boot Maven Plugin打包異常解決方案

    這篇文章主要介紹了Spring Boot Maven Plugin打包異常解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • java取兩個字符串的最大交集

    java取兩個字符串的最大交集

    這篇文章主要介紹了java取兩個字符串的最大交集的方法,涉及Java對字符串操作的技巧,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • mybatis Reflector反射類的具體使用

    mybatis Reflector反射類的具體使用

    Reflector類是MyBatis反射模塊的核心,負責(zé)處理類的元數(shù)據(jù),以實現(xiàn)屬性與數(shù)據(jù)庫字段之間靈活映射的功能,本文主要介紹了mybatis Reflector反射類的具體使用,感興趣的可以了解一下
    2024-02-02
  • SpringWebMVC的常用注解及應(yīng)用分層架構(gòu)詳解

    SpringWebMVC的常用注解及應(yīng)用分層架構(gòu)詳解

    這篇文章主要介紹了SpringWebMVC的常用注解及應(yīng)用分層架構(gòu),SpringWebMVC是基于ServletAPI構(gòu)建的原始Web框架,從?開始就包含在Spring框架中,感興趣的朋友可以參考下
    2024-05-05
  • Spring?IOC中的組件掃描

    Spring?IOC中的組件掃描

    通過自動掃描,Spring?會自動從掃描指定的包及其子包下的所有類,并根據(jù)類上的特定注解將該類裝配到容器中,而無需在?XML?配置文件或?Java?配置類中逐一聲明每一個?Bean,這篇文章主要介紹了Spring?IOC中的組件掃描,需要的朋友可以參考下
    2022-05-05
  • Spring Security使用Lambda DSL配置流程詳解

    Spring Security使用Lambda DSL配置流程詳解

    Spring Security 5.2 對 Lambda DSL 語法的增強,允許使用lambda配置HttpSecurity、ServerHttpSecurity,重要提醒,之前的配置方法仍然有效。lambda的添加旨在提供更大的靈活性,但是用法是可選的。讓我們看一下HttpSecurity的lambda配置與以前的配置樣式相比
    2023-02-02

最新評論