使用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應用程式方法呼叫來簡化問題。
相關文章
- 有趣的程式碼註釋
- Spring Boot 整合 Lombok 讓程式碼更簡潔Spring BootLombok
- Spring @Profile註解使用和原始碼解析Spring原始碼
- 註解和反射反射
- 程式碼才是最好的註釋
- CSS程式碼註釋CSS
- 【進階】Spring中的註解與反射Spring反射
- AI為Spring Boot整個程式碼庫新增了註釋AISpring Boot
- Java註解與反射的使用Java反射
- 使用 Spring Transactional 註釋的最佳方式 - Vlad MihalceaSpring
- Java註解和反射Java反射
- Java 註解和反射Java反射
- 請停止程式碼註釋
- 程式設計師是否有義務做好程式碼的註釋?你做好程式碼註釋了嗎?程式設計師
- Spring Boot應用程式中的常用註釋列表Spring Boot
- 瞭解如何使用 Spring 和 RabbitMQ 建立一個簡單的釋出和訂閱應用程式SpringMQ
- Oracle PL/SQL程式碼中的註釋OracleSQL
- 新的Monterey 讓遊戲更精彩!遊戲
- HTML 程式碼註釋規範HTML
- iOS 註釋方法大全 程式碼塊加快捷鍵註釋iOS
- 在 go 語言中利用反射精簡程式碼Go反射
- 竟有如此沙雕的程式碼註釋!
- 如何優雅地寫註釋:找到程式碼註釋的黃金平衡點
- Java反射和註解基本用法Java反射
- 註解和反射Day02反射
- jvm執行程式碼註釋部分JVM行程
- java 反射簡單使用Java反射
- 如何在 Bash 指令碼中使用單行和多行註釋指令碼
- 改變Emacs下的註釋程式碼方式以支援當前行(未選中情況下)的註釋/反註釋Mac
- Lombok - 使用註解讓你的JavaBean變得更加簡潔LombokJavaBean
- Spring註解簡析Spring
- 我的程式碼和註釋都寫的像坨屎,那又怎麼樣?
- 使用 Macro 讓你的程式碼更簡潔,更具有可讀性Mac
- 如何把程式碼中的註釋批次刪除
- 把Mybatis Generator生成的程式碼加上想要的註釋MyBatis
- Java列舉類、註解和反射Java反射
- 註解和反射學習筆記反射筆記
- 註釋 · 佛祖保佑程式碼永無BUG