<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ## 一、談談自己對于 Spring IoC 和 AOP 的理解 ### IoC IoC(Inverse of Control:控制反轉)是一種**設計思想**,就是將原本在程序中手動創建對象的控制權,交由Spring框架來管理。IoC 在其他語言中也有應用,并非 Spring 特有。**IoC 容器是 Spring 用來實現 IoC 的載體, IoC 容器實際上就是個Map(key,value),Map 中存放的是各種對象。** **IoC 容器就像是一個工廠一樣,當我們需要創建一個對象的時候,只需要配置好配置文件/注解即可,完全不用考慮對象是如何被創建出來的。** ### AOP AOP(Aspect-Oriented Programming:面向切面編程)能夠將那些與業務無關,**卻為業務模塊所共同調用的邏輯或責任(例如事務處理、日志管理、權限控制等)封裝起來**,便于**減少系統的重復代碼**,**降低模塊間的耦合度**,并**有利于未來的可拓展性和可維護性**。 #### 動態代理 **Spring AOP就是基于動態代理的**,如果要代理的對象,實現了某個接口,那么Spring AOP會使用**JDK Proxy**,去創建代理對象,而對于沒有實現接口的對象,就無法使用 JDK Proxy 去進行代理了,這時候Spring AOP會使用**Cglib**,這時候Spring AOP會使用**Cglib**生成一個`被代理對象的子類`來作為代理,如下圖所示: ![SpringAOPProcess](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/SpringAOPProcess.jpg) 當然你也可以使用 `AspectJ `,Spring AOP 已經集成了AspectJ ,AspectJ 應該算的上是 Java 生態系統中最完整的 AOP 框架了。 ### Spring AOP 和 AspectJ AOP 有什么區別? | 比較| SpringAOP | AspectJ | | --- | --- | --- | |**增強類型**| 運行時增強 | 編譯時增強 | | **易用程度**| 相對簡單 | 相對復雜 | | **性能選型** | 切面較少用| 切面復雜用| |**實現原理**| 通過攔截器+反射;實質上是通過反射將被代理類的加載器和接口與代理對象關聯起來。| 基于ASM實現,性能比較高| 1. Spring AOP 屬于**運行時增強**,而 AspectJ 是**編譯時增強**。Spring AOP 基于代理(Proxying),而 AspectJ 基于字節碼操作(Bytecode Manipulation)。 2. Spring AOP 已經集成了 AspectJ ,AspectJ 應該算的上是 Java 生態系統中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加強大,但是 Spring AOP 相對來說更簡單, 3. 如果我們的切面比較少,那么兩者性能差異不大。但是,當切面太多的話,最好選擇 AspectJ ,它比Spring AOP 快很多。 #### 使用區別 JDK 動態代理與 CGLIB 動態代理都是將真實對象`隱藏`在代理對象的后面,以達到 `代理` 的效果。與 JDK 動態代理所不同的是 CGLIB 動態代理使用 Enhancer 來創建代理對象,而 JDK 動態代理使用的是 Proxy.newProxyInstance 來創建代理對象;還有一點是 CGLIB 可以代理大部分類,而 JDK 動態代理只能代理實現了接口的類。 ### 動態代理的實現原理 JDK:實質上是通過反射將被代理類的加載器和接口與代理對象關聯起來。 案例:jdk動態代理的使用方法。 ``` /** * 基于jdk反射包下Proxy進行service的代理 * 結果:報錯,JDK的動態代理需要是一個接口;cglib才能動態代理類對象 */ @Test public void test_proxy_class() { UserCertificateService userCertificateService = (UserCertificateService) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader() , new Class[]{UserCertificateService.class}, ((proxy, method, args) -> "你被代理了")); UserCertificate userCertificate = userCertificateService.selectById(100); System.out.println(JSONObject.toJSONString(userCertificate)); } ``` ``` java.lang.IllegalArgumentException: com.keyou.evm.lpm.service.UserCertificateService is not an interface ```
                  <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>

                              哎呀哎呀视频在线观看