<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 對象(PO??JO)提供企業服務。 Spring 使用[依賴項注入(DI)](https://howtodoinjava.com/spring/spring-core/inversion-of-control-ioc-and-dependency-injection-di-patterns-in-spring-framework-and-related-interview-questions/)來簡化并提高[可測試性](https://howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/)。 Spring Bean,依賴項和 Bean 所需的服務在 xml 配置文件或注解中指定。 但是,XML 配置文件是冗長且更干凈的。 如果未正確計劃和編寫,在大型項目中將變得非常難以管理。 在本文中,我將向您展示 13 個[最佳實踐](https://howtodoinjava.com/java-best-practices/),用于編寫 spring XML 配置。 其中一些似乎是最佳實踐而不是最佳實踐,但我將它們包含在此處是因為它們與該主題高度相關。 > 注意:其他一些因素(例如應用程序設計)可能會影響 XML 配置決策,但是我主要關注 XML 配置的可讀性和可維護性。 讓我們詳細討論上面的每一個,以使其更有意義。 ## 1)在每個配置文件中添加標題注解 我總是更加強調代碼注解。 配置文件也是如此。 添加配置文件標頭總是非常有幫助的,該標頭總結了配置文件中定義的 bean /屬性。 在 Spring 配置中,您可以像添加 XML 注解一樣添加注解,也可以使用`description`元素。 例如: `applicationContext.xml` ```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 版本較少的架構引用](https://howtodoinjava.com/spring/spring-core/do-not-specify-version-numbers-in-spring-schema-references/) 一個示例示例將如下所示: `applicationContext.xml` ```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)優先使用 setter 注入而不是構造方法注入 Spring 提供了三種類型的依賴項注入:`constructor`注入,`setter`注入和`method`注入。 通常,我們都只使用前兩種類型。 `applicationContext.xml` ```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> ``` 構造函數注入可以提供最便宜的線程安全,即[不可變對象](https://howtodoinjava.com/java/related-concepts/how-to-make-a-java-class-immutable/)。 此外,它還可以確保沒有完成初始化就不會將對象移交給其他 bean。 塞特特注入劑提供了非常理想的功能,即靈活性或可維護性。 如果在 bean 中要設置多個屬性,那么為構造函數創建一長串參數不是一個好主意。 同樣,如果可能的話,某些屬性可能是可選的。 更喜歡靈活性。 為了保持不變或線程安全,請遵循其他編程規則。 > 閱讀更多:[如何使 Java 類不可變](https://howtodoinjava.com/java/related-concepts/how-to-make-a-java-class-immutable/) ## 5)在構造函數注入中將類型優先于索引以進行構造函數參數匹配 最好避免使用`constructor`注入,而更喜歡使用`setter`注入進行依賴項注入。 但是,如果絕對需要使用`constructor`注入,則**總是更喜歡基于類型而不是索引**的參數匹配。 `applicationContext.xml` ```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 引用。 一種是擴展形式,另一種是較短形式。 最好使用較短的版本。 `applicationContext.xml` ```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 定義可重用性。 在這里,我不是在談論用于 setter 注入的 bean 參考。 而是我指出了在構造其他 bean 時重用 bean 定義。 以數據源定義的示例為例: `applicationContext.xml` ```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 示例](https://howtodoinjava.com/spring/spring-orm/spring-3-2-5-abstractroutingdatasource-example/) ## 8)始終使用`id`作為 bean 標識符 Spring 允許 bean 使用兩種類型的標識符。 使用屬性`id`或`name`。 您應該**始終選擇屬性 ID 而不是名稱**。 通常,它既不會增加可讀性,也不會增加任何性能。 這是行業標準的做法,所有其他開發人員都在全世界甚至在您的團隊中遵循。 只是不要在這里是個奇怪的人。 ## 9)盡量避免自動裝配 如果可以長期管理,自動裝配是一個很棒的功能。 通常,如果您的項目只有很少的 bean,并且幾乎可以在內存中記住它們,那將是有益的。 一旦項目變大,自動裝配就開始在確定要使用的正確依賴項切面造成麻煩。 我發現主要的缺點是無法將整個系統綁定在一起。 這是 spring 配置文件獲勝的地方。 他們可以在幾分鐘之內將整個系統呈現給任何新手。 另外,當您開始調試一些復雜的問題時,所有在配置文件中的所有信息實際上都會有很大幫助。 自動裝配使調試更加困難。 > 了解更多:[Spring 自動裝配](https://howtodoinjava.com/2013/05/08/spring-beans-autowiring-concepts/) ## 10)始終使用`classpath`前綴 導入資源,XML 配置,屬性等時,請始終使用`classpath:`或`classpath*:`前綴。 這提供了資源位置的一致性和清晰度。 并非 Spring 的每個功能都具有相同的行為,**`classpath:`保證一致性**。 類路徑由構建工具和 IDE 確定。 對于 Java 代碼,通常為`src/main/java`,對于非 Java 依賴項和測試通常為`src/main/resources`,對于 Java 代碼為`src/test/java`,對于非 Java 資源為`src/test/resources`。 `applicationContext.xml` ```java <!-- Always use classpath: prefix--> <import resource="classpath:/META-INF/spring/applicationContext-security.xml"/> ``` ## 11)總是外部化屬性 通常,存在與應用程序運行時間相關的多個配置參數。 它們被傳遞到 bean 配置上下文文件中的 bean 定義。 不要將它們硬編碼在配置文件中。 而是將它們外部化到某些屬性文件。 最好根據它們的用途或模塊將它們分組在單獨的文件中,即`jdbc.properties`文件中所有與 JDBC 數據源相關的屬性。 `applicationContext.xml` ```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}" /> ``` 和屬性文件是: `jdbc.properties` ```java jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.username=root jdbc.password=password ``` ## 12)在開發階段使用“依賴檢查” 您應該將 Bean 定義上的`dependency-check`屬性設置為`simple`,`objects`或`all`(默認值為`none`,即不檢查),以便容器可以為您執行顯式依賴項驗證。 當必須顯式地或通過自動裝配來設置 Bean 的所有屬性(或某些類別的屬性)時,這很有用。 `applicationContext.xml` ```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)不要濫用/濫用依賴注入 最后,請不要濫用引入[依賴注入](https://howtodoinjava.com/spring/spring-core/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>

                              哎呀哎呀视频在线观看