<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 13 個編寫 Spring 配置文件的最佳實踐 > 原文: [https://howtodoinjava.com/best-practices/13-best-practices-for-writing-spring-configuration-files/](https://howtodoinjava.com/best-practices/13-best-practices-for-writing-spring-configuration-files/) Spring 是一個功能強大的框架,它使用多種配置選項。 它的最佳功能是為稱為 bean 的舊式 Java 對象(PlainOld??JavaObject)提供企業服務。 Spring 使用[依賴項注入(DI)](//howtodoinjava.com/spring/spring-core/inversion-of-control-ioc-and-dependency-injection-di-patterns-in-spring-framework-and-related-interview-questions/ "Inversion of control (IoC) and dependency injection (DI) patterns in spring framework and related interview questions")來簡化并提高[可測試性](//howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/ "Unit testing best practices : JUnit Reference guide")。 Spring Bean,依賴項和 Bean 所需的服務在 xml 配置文件或注釋中指定。 但是,XML 配置文件是冗長且更干凈的。 如果未正確計劃和編寫,在大型項目中將變得非常難以管理。 在本文中,我將向您展示 13 個[最佳實踐](//howtodoinjava.com/java-best-practices/ "Best practices"),用于編寫 spring XML 配置。 其中一些似乎是最佳實踐而不是最佳實踐,但我將它們包含在此處是因為它們與該主題高度相關。 > 注意:其他一些因素(例如應用設計)可能會影響 XML 配置決策,但是我主要關注 XML 配置的可讀性和可維護性。 ```java Table of Contents 1) Add a header comment to each configuration file 2) Use consistent naming conventions 3) No version numbers in schema references 4) Prefer setter injection over constructor injection 5) Prefer type over index for constructor argument matching 6) Use shortcut forms over expanded forms 7) Reuse bean definitions as much as possible 8) Always use ids as bean identifiers 9) Try to avoid autowiring 10) Always use classpath prefix 11) Always externalize properties 12) Use dependency-check at the development phase 13) Do not abuse/overuse dependency injection ``` 讓我們詳細討論上面的每一個,以使其更有意義。 ## 1)在每個配置文件中添加標題注釋 我總是更加強調代碼注釋。 配置文件也是如此。 添加配置文件標頭總是非常有幫助的,該標頭總結了配置文件中定義的 bean /屬性。 在 Spring 配置中,您可以像添加 XML 注釋一樣添加注釋,也可以使用`description`元素。 例如: ```java <beans> <description> This configuration file will have all beans which may be used for controlling transactions. </description> ... </beans> ``` 使用`description`標簽的一個可能的優點是,某些工具可能會從此元素中獲取描述,以在其他地方為您提供幫助。 ## 2)使用一致的命名約定 在所有配置文件中使用相同的命名是非常重要的。 在整個項目中使用清晰,描述性和一致的名稱約定,可以提高配置文件的可讀性,并使其他開發人員可以輕松避免一些偶然的錯誤。 例如,對于 bean ID,可以遵循 Java 類字段名稱約定。 `EmployeeUpdateDAO`實例的 bean ID 將是`employeeUpdateDAO`。 對于大型項目,可以將包名稱添加為 Bean ID 的前綴。 例如 `finance.employeeUpdateDAO`。 ## 3)模式引用中沒有版本號 我在之前的文章中也指出了此功能。 我再次將其包括在內,因為從長遠來看,它對于改善可維護性至關重要且有益。 要刷新您的內存,根本不需要在 bean 配置文件中為引用的模式指定版本號,您可以忽略它。 如果確實如此,您應該一直忽略它。 Spring 自動從項目依賴項(jar)中選擇可用的最高版本。 另外,隨著項目的發展和 Spring 版本的更新,我們不必維護所有 XML 配置文件即可看到新功能。 > 閱讀更多: [Spring 無版本的架構引用](//howtodoinjava.com/spring/spring-core/do-not-specify-version-numbers-in-spring-schema-references/ "Do not specify version numbers in Spring schema references") 一個示例示例將如下所示: ```java <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Other bean definitions--> </beans> ``` ## 4)優先使用設置器注入而不是構造方法注入 Spring 提供了三種類型的依賴項注入:構造器注入,設置器注入和方法注入。 通常,我們都只使用前兩種類型。 ```java <!-- Constructor injection --> <bean id="employeeDAO" class="com.howtodoinjava.dao.EmployeeDAO"> <constructor-arg ref="datasource"/> </bean> <!-- Setter injection --> <bean id="employeeDAO" class="com.howtodoinjava.dao.EmployeeDAO"> <property name="datasource" ref="datasource"> </bean> ``` 構造器注入可以提供最便宜的線程安全,即[不可變對象](//howtodoinjava.com/java/related-concepts/how-to-make-a-java-class-immutable/ "How to make a java class immutable")。 此外,它還可以確保沒有完成初始化就不會將對象移交給其他 bean。 設置器注入提供了許多理想的功能,即靈活性或可維護性。 如果在 bean 中要設置多個屬性,那么為構造器創建一長串參數不是一個好主意。 同樣,如果可能的話,某些屬性可能是可選的。 更偏向靈活性。 為了保持不變或線程安全,請遵循其他編程規則。 > 閱讀更多:[如何使 Java 類不可變](//howtodoinjava.com/java/related-concepts/how-to-make-a-java-class-immutable/ "How to make a java class immutable") ## 5)在構造器注入中優先使用類型而不是索引以進行構造器參數匹配 最好避免使用構造器注入,而更偏向使用設置器注入進行依賴項注入。 但是,如果絕對需要使用構造器注入,則**總是更偏向基于類型而不是索引**的參數匹配。 ```java <!-- Index based constructor injection --> <bean id="employeeDAO" class="com.howtodoinjava.EmployeeDAO"> <constructor-arg index="0" value="rest"/> <constructor-arg index="1" value="8080"/> </bean> <!-- Type based constructor injection --> <bean id="employeeDAO" class="com.howtodoinjava.EmployeeDAO"> <constructor-arg type="java.lang.String" value="rest"/> <constructor-arg type="int" value="8080"/> </bean> ``` 如您所見,基于類型的參數傳遞更具可讀性,并且不易出錯。 但是,只要基于類型的參數傳遞有任何歧義,就可以毫不猶豫地轉到基于索引的參數傳遞。 ## 6)使用快捷形式而不是擴展形式 Spring bean 配置語義允許兩種形式來指定屬性值和其他 bean 引用。 一種是擴展形式,另一種是較短形式。 最好使用較短的版本。 ```java <!-- Expanded version --> <bean id="employeeDAO" class="com.howtodoinjava.dao.EmployeeDAO"> <property name="datasource"> <ref bean="datasource"></ref> <value>datasource</value> </property> </bean> <!-- Shorter/shortcut version --> <bean id="employeeDAO" class="com.howtodoinjava.dao.EmployeeDAO"> <property name="datasource" ref="datasource" value="datasource"> </bean> ``` ## 7)盡可能重用 bean 定義 Spring 提供了非常有用的功能,您應該在項目中廣泛使用它,即 bean 定義可重用性。 在這里,我不是在談論用于設置器注入的 bean 參考。 而是我指出了在構造其他 bean 時重用 bean 定義。 以數據源定義的示例為例: ```java <bean id="abstractDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:username="${jdbc.username}" p:password="${jdbc.password}" /> <bean id="concreteDataSourceOne" parent="abstractDataSource" p:url="${jdbc.databaseurlOne}"/> <bean id="concreteDataSourceTwo" parent="abstractDataSource" p:url="${jdbc.databaseurlTwo}"/> ``` > 閱讀更多: [Spring `AbstractRoutingDataSource`示例](//howtodoinjava.com/spring/spring-orm/spring-3-2-5-abstractroutingdatasource-example/ "Spring AbstractRoutingDataSource example") ## 8)始終使用“`id`”作為 bean 標識符 Spring 允許 bean 使用兩種類型的標識符。 使用屬性“`id`”或“`name`”。 您應該**始終選擇屬性 ID 而不是名稱**。 通常,它既不會增加可讀性,也不會增加任何性能。 這是行業標準的做法,所有其他開發人員都在全世界甚至在您的團隊中遵循。 只是不要在這里是個奇怪的人。 ## 9)盡量避免自動裝配 如果可以長期管理,自動裝配是一個很棒的功能。 通常,如果您的項目只有很少的 bean,并且幾乎可以在內存中記住它們,那將是有益的。 一旦項目變大,自動裝配就開始在確定要使用的正確依賴項方面造成麻煩。 我發現主要的缺點是無法將整個系統綁定在一起。 這是 spring 配置文件獲勝的地方。 他們可以在幾分鐘之內將整個系統呈現給任何新手。 另外,當您開始調試一些復雜的問題時,所有在配置文件中的所有信息實際上都會有很大幫助。 自動裝配使調試更加困難。 > 了解更多:[Spring 自動裝配](//howtodoinjava.com/2013/05/08/spring-beans-autowiring-concepts/ "Spring beans autowiring concepts") ## 10)始終使用`classpath`前綴 導入資源,XML 配置,屬性等時,請始終使用`classpath:`或`classpath*`:前綴。 這提供了資源位置的一致性和清晰度。 并非 Spring 的每個功能都具有相同的行為,**類路徑保證一致性**。 類路徑由構建工具和 IDE 確定。 對于 Java 代碼,通常為`src/main/java`,對于非 Java 依賴項和測試通常為`src/main/resources`,對于 Java 代碼為`src/test/java`,對于非 Java 資源為`src/test/resources`。 ```java <!-- Always use classpath: prefix--> <import resource="classpath:/META-INF/spring/applicationContext-security.xml"/> ``` ## 11)總是外部化屬性 通常,存在與應用運行時間相關的多個配置參數。 它們被傳遞到 bean 配置上下文文件中的 bean 定義。 不要將它們硬編碼在配置文件中。 而是將它們外部化到某些屬性文件。 最好根據它們的用法或模塊將它們分組在單獨的文件中,即`jdbc.properties`文件中所有與 JDBC 數據源相關的屬性。 ```java <bean id="abstractDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:username="${jdbc.username}" p:password="${jdbc.password}" /> ``` 和屬性文件是: ```java jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.username=root jdbc.password=password ``` ## 12)在開發階段使用“依賴項檢查” 您應該將 Bean 定義上的`dependency-check`屬性設置為`simple`,`objects`或`all`(默認值為`none`,即不檢查),以便容器可以為您執行顯式依賴項驗證。 當必須顯式地或通過自動裝配來設置 Bean 的所有屬性(或某些類別的屬性)時,這很有用。 ```java <bean id="abstractDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:username="${jdbc.username}" p:password="${jdbc.password}" dependency-check="all" /> ``` 在上面給出的示例中,容器將確保在應用初始化時間本身中設置數據源的所有屬性/參數。 ## 13)不要濫用依賴注入 最后,請不要濫用引入[依賴注入](//howtodoinjava.com/spring/spring-core/inversion-of-control-ioc-and-dependency-injection-di-patterns-in-spring-framework-and-related-interview-questions/ "Inversion of control (IoC) and dependency injection (DI) patterns in spring framework and related interview questions")的動機。 Java 提供“`new`”關鍵字來創建新對象。 在不需要 DI 的地方使用此精彩的關鍵字,例如 DTO 對象。 不要試圖玩得更聰明。 只需遵循基礎知識即可。 如果您對以上幾點有異議,請給我評論。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看