使用Spring的註釋和反射讓程式碼更精簡
Java總是因為臃腫而受到批評。但是有一些方法可以最小化所有臃腫重複程式碼。這個Spring beans教程向您展示瞭如何編寫更高效的應用程式。
假設我們有50個不同的StateFormParsers用於解析每個傳入表單獲得所在的州名稱,每個、表單都有一組不同的欄位。此外,每個表單中表達州名稱的格式可能是文字或HTML,因此我們需要100個不同的解析器(50個狀態乘以兩種不同的格式)。我們絕對可以找到程式碼共享的地方,但我們仍需要為進入系統的每個表單找到正確的解析器。
現在,當我們收到表單時,我們希望找到一種優雅的方法來從控制反轉(IoC)容器中檢索正確的實現。我們只想要傳入資料告訴我們狀態和格式就可以了。
我們如何快速簡單地找到我們需要的Spring bean?
註釋類的定義
首先建立一個自定義註釋,可以將其放在每個實現類上,使它們成為可用的一種Spring bean。甚至可能在ComponentScan中使用新的註釋,以便這個註釋將放在每一個類上,並使每個實現類都成為一個Spring bean,甚至不必在其上新增@Component型別的註釋了。
需要建立的註釋如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface StateFormParser { String state(); String format() default "text"; } |
這樣可以在每個解析器上使用此註釋,然後設定狀態和格式值。以下是支援州名稱是HTML格式的解析器示例,CA代表California :
@StateFormParser(state="CA", format="html") public class CaliforniaParser extends StateFormParserBaseClass { } |
下一步是在Spring元件掃描配置中,將它新增到componentScan配置的includeFilters屬性中。使用@ComponentScan時,它看起來像這樣:
@ComponentScan(basePackages = ["com.serverside],includeFilters = [ @ComponentScan.Filter(type=FilterType.ANNOTATION, value=StateFormParser.class), @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Repository.class), @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Service.class), @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Controller.class) ] ) |
當Spring IoC容器建立其ApplicationContex/BeanFactory時,解析器bean將存在上下文中。
但是如何找回它們?
Spring在ListableBeanFactory中有一個擴充套件BeanFactory的方法,你可以在ApplicationContext中找到它。
Map<String, Object> getBeansWithAnnotation( Class<? extends Annotation> annotationType) throws BeansException; |
我們用這個方法可以獲得所有使用我們自定義註釋@StateFormParser標註的所有bean,如果每個bean還實現相同的類StateFormParserBaseClass,我們也可以執行autowiring。
@Autowired Map<String, StateFormParserBaseClass> formParserMap;
map 的String是bean名稱,值是bean例項。
下面程式碼是迴圈Map尋找出每個Bean,以發現我們需要使用的解析器Bean:
private StateFormParserBaseClass getFormParser(String state, String format) { StateFormParserBaseClass beanFormParser = null; for (StateFormParserBaseClass formParser: formParserMap.values()) { StateFormParser stateFormParser = formParser.getClass().getAnnotation(StateFormParser.class); if (stateFormParser.state().equals(state) && stateFormParser.format().equals(format)) { beanFormParser = formParser; } } return beanFormParser } |
還有許多其他方法可以檢索正確的解析器bean,但是使用這個Spring bean教程,您可以使用註釋和簡單的反射方法或Spring應用程式方法呼叫來簡化問題。
相關文章
- android studio和 Eclipse中程式碼的註釋,讓你的程式碼更加AndroidEclipse
- 讓那些無用程式碼註釋見鬼去
- java中程式碼的註釋和快捷鍵Java
- 有趣的程式碼註釋
- 程式的版式和註釋
- 註解和反射反射
- 使用GhostDoc為程式碼生成註釋文件
- Spring Boot 整合 Lombok 讓程式碼更簡潔Spring BootLombok
- 使用ehcache元註釋提高Spring 效能原始碼案例Spring原始碼
- Spring @Profile註解使用和原始碼解析Spring原始碼
- CSS程式碼註釋CSS
- php程式碼註釋PHP
- 程式碼才是最好的註釋
- 註釋程式碼的13技巧
- 新的Monterey 讓遊戲更精彩!遊戲
- Java 註解和反射Java反射
- Java註解和反射Java反射
- Java註解與反射的使用Java反射
- 【進階】Spring中的註解與反射Spring反射
- 請停止程式碼註釋
- javascript如何註釋程式碼JavaScript
- 程式設計師是否有義務做好程式碼的註釋?你做好程式碼註釋了嗎?程式設計師
- 程式碼神註釋,讓我們認真對待一次!
- Oracle PL/SQL程式碼中的註釋OracleSQL
- 9個最有趣的程式碼註釋
- HTML 程式碼註釋規範HTML
- Java程式碼註釋規範Java
- Spring Boot應用程式中的常用註釋列表Spring Boot
- 使用 Spring Transactional 註釋的最佳方式 - Vlad MihalceaSpring
- 瞭解如何使用 Spring 和 RabbitMQ 建立一個簡單的釋出和訂閱應用程式SpringMQ
- Java利用spring註解做反射機制JavaSpring反射
- 【Java基礎】反射和註解Java反射
- 註解和反射Day02反射
- Java反射和註解基本用法Java反射
- js 物件反射使用程式碼例項JS物件反射
- 在 go 語言中利用反射精簡程式碼Go反射
- iOS 註釋方法大全 程式碼塊加快捷鍵註釋iOS
- 讓共享程式自己顯示註冊碼