Browse Source

0424 spring proxy

Qing 1 year ago
parent
commit
ad358f2a79

+ 108 - 107
spring-demo/.idea/workspace.xml

@@ -4,77 +4,22 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="5aa6272e-23b4-48f4-9aaa-8caf45810aa0" name="Changes" comment="0420 spring lifecycle">
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/SpringConfig.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/Box.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/Chair.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/Desk.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/House.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/Plane.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/anno/Teacher.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/auto/Chair.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/auto/House.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/auto/Teacher.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/car/Car.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/car/CarInstanceFactory.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/car/CarStaticFactory.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/factory/Computer.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/factory/Output.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/factory/OutputFactory.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/factory/printer/BetterPrinter.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/factory/printer/Printer.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/factory/shape/Shape.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/factory/shape/Triangle.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/anno/Column.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/anno/Student.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/anno/Table.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/anno/TestStudent.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/anno/hello/Check.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/anno/hello/Test.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/anno/hello/TestAnnotation.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/computer/Computer.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/computer/ComputerFactory.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/computer/IComputerFactory.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/computer/MacComputer.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/computer/MacComputerFactory.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/computer/MiComputer.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/computer/MiComputerFactory.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/computer/Test.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/resources/spring-annotation.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/resources/spring-auto.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/resources/spring-factory.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/test/java/com/sf/TestAnno.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/test/java/com/sf/TestAuto.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/test/java/com/sf/TestConfig.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/test/java/com/sf/TestFactory.java" afterDir="false" />
+    <list default="true" id="5aa6272e-23b4-48f4-9aaa-8caf45810aa0" name="Changes" comment="0420 spring ioc">
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/Client.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/GamePlayer.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/GamePlayerProxy.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/IGamePlayer.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/cglib/CglibClient.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/cglib/CglibDemo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/cglib/MyMethodInterceptor.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/jdk/JdkClient.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/jdk/JdkDemo.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/jdk/MyInvocationHandler.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/jdk/self/$Proxy0.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/jdk/self/Life.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/sf/proxy/jdk/self/MyLife.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/Auth.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/helloworld/Auth.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/Role.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/helloworld/Role.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/User.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/helloworld/User.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/javase/Main.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/base/Main.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/javase/StaticInterview.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/base/StaticInterview.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/javase/TestCollection.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/base/TestCollection.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/javase/TestMath.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/base/TestMath.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/javase/TestString.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/base/TestString.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/javase/TestStringIntern.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/base/TestStringIntern.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/reflect/TestReflect.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/reflect/TestReflect.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/reflect/TestUser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/reflect/TestUser.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/reflect/TestUserByHCB.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/reflect/TestUserByHCB.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/reflect/User.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/reflect/User.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/self/BeanDefined.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/self/BeanDefined.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/self/BeanFactory.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/self/BeanFactory.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/self/Test.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/self/Test.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/singleton/Singleton1.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/singleton/Singleton1.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/singleton/Singleton2.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/singleton/Singleton2.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/singleton/Singleton3.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/singleton/Singleton3.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/singleton/Singleton4.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/singleton/Singleton4.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/sf/singleton/TestSingleton.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/sf/javase/singleton/TestSingleton.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/resources/spring-beans-new.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/spring-beans-new.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/resources/spring-beans.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/spring-beans.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/resources/spring-singleton.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/spring-singleton.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/test/java/com/sf/TestSingleton.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/test/java/com/sf/TestSingleton.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/test/java/com/sf/TestUser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/test/java/com/sf/TestUser.java" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -112,8 +57,18 @@
   </component>
   <component name="PropertiesComponent"><![CDATA[{
   "keyToString": {
+    "Application.CglibClient.executor": "Run",
+    "Application.CglibDemo (1).executor": "Run",
+    "Application.CglibDemo (2).executor": "Run",
+    "Application.CglibDemo.executor": "Run",
+    "Application.Client.executor": "Run",
     "Application.ComputerFactory.executor": "Run",
+    "Application.JdkDemo (1).executor": "Run",
+    "Application.JdkDemo (2).executor": "Run",
+    "Application.JdkDemo (3).executor": "Run",
+    "Application.JdkDemo.executor": "Run",
     "Application.Main.executor": "Run",
+    "Application.OtherClient.executor": "Run",
     "Application.OutputFactory.executor": "Run",
     "Application.StaticInterview.executor": "Run",
     "Application.Test.executor": "Run",
@@ -129,6 +84,7 @@
     "Application.TestUser.executor": "Run",
     "Application.TestUserByHCB.executor": "Run",
     "Application.com.sf.factory.Test.executor": "Run",
+    "Application.com.sf.proxy.cglib.CglibDemo.executor": "Run",
     "JUnit.TestAnno.executor": "Run",
     "JUnit.TestAnno.test.executor": "Run",
     "JUnit.TestAnno.testAnno.executor": "Run",
@@ -164,96 +120,105 @@
       <recent name="$PROJECT_DIR$/src/main/resources" />
     </key>
     <key name="CopyClassDialog.RECENTS_KEY">
+      <recent name="com.sf.proxy.cglib" />
       <recent name="com.sf.anno" />
     </key>
   </component>
-  <component name="RunManager" selected="JUnit.TestConfig.test">
-    <configuration name="TestAnno" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+  <component name="RunManager" selected="Application.JdkDemo (1)">
+    <configuration name="CglibClient" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.sf.proxy.cglib.CglibClient" />
       <module name="spring-demo" />
+      <option name="VM_PARAMETERS" value="--add-opens java.base/java.lang=ALL-UNNAMED" />
       <extension name="coverage">
         <pattern>
-          <option name="PATTERN" value="com.sf.helloworld.*" />
+          <option name="PATTERN" value="com.sf.proxy.cglib.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
-      <option name="PACKAGE_NAME" value="com.sf" />
-      <option name="MAIN_CLASS_NAME" value="com.sf.TestAnno" />
-      <option name="TEST_OBJECT" value="class" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
     </configuration>
-    <configuration name="TestAnno.test" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+    <configuration name="CglibDemo" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.sf.proxy.cglib.CglibDemo" />
       <module name="spring-demo" />
+      <option name="VM_PARAMETERS" value="--add-opens java.base/java.lang=ALL-UNNAMED" />
       <extension name="coverage">
         <pattern>
-          <option name="PATTERN" value="com.sf.helloworld.*" />
+          <option name="PATTERN" value="com.sf.proxy.cglib.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
-      <option name="PACKAGE_NAME" value="com.sf" />
-      <option name="MAIN_CLASS_NAME" value="com.sf.TestAnno" />
-      <option name="METHOD_NAME" value="test" />
-      <option name="TEST_OBJECT" value="method" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
     </configuration>
-    <configuration name="TestAnno.testAnno" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+    <configuration name="JdkDemo (1)" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.sf.proxy.jdk.JdkDemo" />
       <module name="spring-demo" />
       <extension name="coverage">
         <pattern>
-          <option name="PATTERN" value="com.sf.helloworld.*" />
+          <option name="PATTERN" value="com.sf.proxy.jdk.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
-      <option name="PACKAGE_NAME" value="com.sf" />
-      <option name="MAIN_CLASS_NAME" value="com.sf.TestAnno" />
-      <option name="METHOD_NAME" value="testAnno" />
-      <option name="TEST_OBJECT" value="method" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
     </configuration>
-    <configuration name="TestAuto.test" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+    <configuration name="JdkDemo (2)" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.sf.proxy.jdk.JdkDemo" />
       <module name="spring-demo" />
       <extension name="coverage">
         <pattern>
-          <option name="PATTERN" value="com.sf.helloworld.*" />
+          <option name="PATTERN" value="com.sf.proxy.jdk.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
-      <option name="PACKAGE_NAME" value="com.sf" />
-      <option name="MAIN_CLASS_NAME" value="com.sf.TestAuto" />
-      <option name="METHOD_NAME" value="test" />
-      <option name="TEST_OBJECT" value="method" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
     </configuration>
-    <configuration name="TestConfig.test" type="JUnit" factoryName="JUnit" temporary="true" nameIsGenerated="true">
+    <configuration name="JdkDemo (3)" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.sf.proxy.jdk.JdkDemo" />
       <module name="spring-demo" />
       <extension name="coverage">
         <pattern>
-          <option name="PATTERN" value="com.sf.*" />
+          <option name="PATTERN" value="com.sf.proxy.jdk.*" />
           <option name="ENABLED" value="true" />
         </pattern>
       </extension>
-      <option name="PACKAGE_NAME" value="com.sf" />
-      <option name="MAIN_CLASS_NAME" value="com.sf.TestConfig" />
-      <option name="METHOD_NAME" value="test" />
-      <option name="TEST_OBJECT" value="method" />
       <method v="2">
         <option name="Make" enabled="true" />
       </method>
     </configuration>
+    <configuration name="JdkDemo" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.sf.proxy.jdk.JdkDemo" />
+      <module name="spring-demo" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.sf.proxy.jdk.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <list>
+      <item itemvalue="Application.JdkDemo (1)" />
+      <item itemvalue="Application.JdkDemo (2)" />
+      <item itemvalue="Application.JdkDemo (3)" />
+      <item itemvalue="Application.JdkDemo" />
+      <item itemvalue="Application.CglibClient" />
+    </list>
     <recent_temporary>
       <list>
-        <item itemvalue="JUnit.TestConfig.test" />
-        <item itemvalue="JUnit.TestAnno" />
-        <item itemvalue="JUnit.TestAnno.testAnno" />
-        <item itemvalue="JUnit.TestAuto.test" />
-        <item itemvalue="JUnit.TestAnno.test" />
+        <item itemvalue="Application.JdkDemo (1)" />
+        <item itemvalue="Application.JdkDemo (3)" />
+        <item itemvalue="Application.JdkDemo (2)" />
+        <item itemvalue="Application.JdkDemo" />
+        <item itemvalue="Application.CglibClient" />
       </list>
     </recent_temporary>
   </component>
@@ -271,7 +236,8 @@
       <workItem from="1712972174804" duration="14892000" />
       <workItem from="1713086100573" duration="122000" />
       <workItem from="1713332000735" duration="13027000" />
-      <workItem from="1713574818502" duration="19370000" />
+      <workItem from="1713574818502" duration="20981000" />
+      <workItem from="1713936457175" duration="10962000" />
     </task>
     <task id="LOCAL-00001" summary="0403 javaSE">
       <option name="closed" value="true" />
@@ -321,7 +287,15 @@
       <option name="project" value="LOCAL" />
       <updated>1713578306388</updated>
     </task>
-    <option name="localTasksCounter" value="7" />
+    <task id="LOCAL-00007" summary="0420 spring ioc">
+      <option name="closed" value="true" />
+      <created>1713603930646</created>
+      <option name="number" value="00007" />
+      <option name="presentableId" value="LOCAL-00007" />
+      <option name="project" value="LOCAL" />
+      <updated>1713603930646</updated>
+    </task>
+    <option name="localTasksCounter" value="8" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -333,6 +307,7 @@
         <entry key="105ff90c-1298-45f8-accf-4e56367b1b7b" value="TOOL_WINDOW" />
         <entry key="2836cf7e-9804-4f89-86fa-98fe8e7d455e" value="TOOL_WINDOW" />
         <entry key="51df622a-cec1-408f-a310-c5c053f5c319" value="TOOL_WINDOW" />
+        <entry key="d61e4efd-643a-46cf-94bf-069da1b691ba" value="TOOL_WINDOW" />
       </map>
     </option>
     <option name="TAB_STATES">
@@ -417,6 +392,31 @@
             <State />
           </value>
         </entry>
+        <entry key="d61e4efd-643a-46cf-94bf-069da1b691ba">
+          <value>
+            <State>
+              <option name="FILTERS">
+                <map>
+                  <entry key="branch">
+                    <value>
+                      <list>
+                        <option value="HEAD" />
+                      </list>
+                    </value>
+                  </entry>
+                  <entry key="structure">
+                    <value>
+                      <list>
+                        <option value="dir:/Users/Qing/IdeaProjects/SiFu/VIP31/spring-demo" />
+                      </list>
+                    </value>
+                  </entry>
+                </map>
+              </option>
+              <option name="SHOW_ONLY_AFFECTED_CHANGES" value="true" />
+            </State>
+          </value>
+        </entry>
       </map>
     </option>
   </component>
@@ -426,7 +426,8 @@
     <MESSAGE value="0413 spring" />
     <MESSAGE value="0417 spring" />
     <MESSAGE value="0420 spring lifecycle" />
-    <option name="LAST_COMMIT_MESSAGE" value="0420 spring lifecycle" />
+    <MESSAGE value="0420 spring ioc" />
+    <option name="LAST_COMMIT_MESSAGE" value="0420 spring ioc" />
   </component>
   <component name="XSLT-Support.FileAssociations.UIState">
     <expand />

+ 6 - 0
spring-demo/pom.xml

@@ -35,6 +35,12 @@
             <version>3.0.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>cglib</groupId>
+            <artifactId>cglib</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter</artifactId>

+ 14 - 0
spring-demo/src/main/java/com/sf/proxy/Client.java

@@ -0,0 +1,14 @@
+package com.sf.proxy;
+
+// 发布代练需求的人
+public class Client {
+
+    public static void main(String[] args) {
+        // 游戏高玩
+        IGamePlayer player = new GamePlayer("张三");
+        // 代练公司
+        IGamePlayer proxy = new GamePlayerProxy(player);
+        // 代理接手游戏
+        proxy.playGame();
+    }
+}

+ 26 - 0
spring-demo/src/main/java/com/sf/proxy/GamePlayer.java

@@ -0,0 +1,26 @@
+package com.sf.proxy;
+
+// 代练高手
+public class GamePlayer implements IGamePlayer {
+
+    private String name = "高手";
+
+    public GamePlayer() {
+    }
+
+    public GamePlayer(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public void playGame() {
+        System.out.println("通天代:" + name + " 开始上分");
+    }
+
+    @Override
+    public String toString() {
+        return "GamePlayer{" +
+                "name='" + name + '\'' +
+                '}';
+    }
+}

+ 22 - 0
spring-demo/src/main/java/com/sf/proxy/GamePlayerProxy.java

@@ -0,0 +1,22 @@
+package com.sf.proxy;
+
+// 实现这个需求的 代练公司/工作室/店铺
+// 游戏玩家的代理方
+public class GamePlayerProxy implements IGamePlayer{
+    // 有一个会玩儿游戏的人
+    private IGamePlayer player;
+
+    public GamePlayerProxy(IGamePlayer player) {
+        System.out.println("指派代练的人:" + player);
+        this.player = player;
+    }
+
+    // 代练工作室帮你实现代理需求时
+    // 是再指派一个会玩儿游戏的人
+    // 实际玩儿游戏 是由这个人来玩儿的
+    @Override
+    public void playGame() {
+        System.out.println("代练工作室接收代练需求");
+        this.player.playGame();
+    }
+}

+ 7 - 0
spring-demo/src/main/java/com/sf/proxy/IGamePlayer.java

@@ -0,0 +1,7 @@
+package com.sf.proxy;
+
+// 有一个代练的需求
+// 要找一个会玩儿游戏的人
+public interface IGamePlayer {
+    void playGame();
+}

+ 21 - 0
spring-demo/src/main/java/com/sf/proxy/cglib/CglibClient.java

@@ -0,0 +1,21 @@
+package com.sf.proxy.cglib;
+
+import com.sf.proxy.GamePlayer;
+import net.sf.cglib.proxy.Enhancer;
+
+public class CglibClient {
+
+    public static void main(String[] args) {
+        // jdk代理使用Proxy
+        Enhancer enhancer = new Enhancer();
+        // 此时需要的不是对象  是类
+        enhancer.setSuperclass(GamePlayer.class);
+        // 将自定义的逻辑传入
+        enhancer.setCallback(new MyMethodInterceptor());
+
+        // 创建代理对象
+        GamePlayer proxy = (GamePlayer) enhancer.create();
+//        GamePlayer proxy = (GamePlayer) enhancer.create(GamePlayer.class,new MyMethodInterceptor());
+        proxy.playGame();
+    }
+}

+ 42 - 0
spring-demo/src/main/java/com/sf/proxy/cglib/CglibDemo.java

@@ -0,0 +1,42 @@
+package com.sf.proxy.cglib;
+
+import net.sf.cglib.proxy.Enhancer;
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+
+import java.lang.reflect.Method;
+
+public class CglibDemo {
+
+    // 如果添加final会报错  final修饰类 代表这个类不能被继承
+    // Exception in thread "main" java.lang.IllegalArgumentException:
+    //    Cannot subclass final class class com.sf.proxy.cglib.CglibDemo$MyLife
+    static class MyLife{
+        public void learn(){
+            System.out.println("learn");
+        }
+    }
+
+    public static void main(String[] args) {
+        MyLife mylife = new MyLife();
+        // 通过cglib代理创建的对象 对应的类型是类 MyLife
+        // 通过cglib来创建代理类时  是继承MyLife类
+        MyLife proxy = (MyLife)Enhancer.create(MyLife.class, new MethodInterceptor() {
+            @Override
+            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
+                System.out.println("before");
+                // 这种写法接近jdk代理的写法 使用的是反射
+//                Object result = method.invoke(mylife, objects);
+                // 这种写法是cglib代理自身的写法 避免了使用反射
+                // return methodProxy.invokeSuper(o,objects);
+                Object result1 = methodProxy.invokeSuper(o, objects);
+                System.out.println("after");
+                return result1;
+            }
+        });
+        // 代理对象要调用这个方法  就像目标对象自己调用这个方法一样
+        // 代理对象怎样做到调用相同的方法呢?
+        // 要么通过实现相同的接口  要么通过继承目标类
+        proxy.learn();
+    }
+}

+ 19 - 0
spring-demo/src/main/java/com/sf/proxy/cglib/MyMethodInterceptor.java

@@ -0,0 +1,19 @@
+package com.sf.proxy.cglib;
+
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+
+import java.lang.reflect.Method;
+
+// CGLib的包 提供了MethodInterceptor接口
+// 实现类 需要重写 intercept 拦截方法
+public class MyMethodInterceptor implements MethodInterceptor {
+    // 类似MyInvocationHandler  本质上是都是在创建代理对象时 需要调用此方法
+    @Override
+    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
+            throws Throwable {
+        //  player.playGame()  转化成反射的写法
+        //  Object result = method.invoke(target, args);
+        return methodProxy.invokeSuper(o,objects);
+    }
+}

+ 22 - 0
spring-demo/src/main/java/com/sf/proxy/jdk/JdkClient.java

@@ -0,0 +1,22 @@
+package com.sf.proxy.jdk;
+
+import com.sf.proxy.GamePlayer;
+import com.sf.proxy.IGamePlayer;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+
+// JDK动态代理
+public class JdkClient {
+
+    public static void main(String[] args) {
+        IGamePlayer player = new GamePlayer("李四");
+        // 声明代理  设置处理器的逻辑
+        InvocationHandler handler = new MyInvocationHandler<IGamePlayer>(player);
+        // 调用代理  动态创建代理时需要 类加载器 代理的需求数组 处理器对象
+        // 在代理对象创建后  会调用InvocationHandler里面的invoke方法
+        IGamePlayer proxy = (IGamePlayer)Proxy.newProxyInstance(
+                player.getClass().getClassLoader(),new Class[]{IGamePlayer.class},handler);
+        proxy.playGame();
+    }
+}

+ 51 - 0
spring-demo/src/main/java/com/sf/proxy/jdk/JdkDemo.java

@@ -0,0 +1,51 @@
+package com.sf.proxy.jdk;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+public class JdkDemo {
+
+    interface Life {
+        void learn();
+
+        String sleep();
+    }
+
+    static class MyLife implements Life {
+        @Override
+        public void learn() {
+            System.out.println("learn");
+        }
+
+        @Override
+        public String sleep() {
+            return "sleep result";
+        }
+    }
+
+    public static void main(String[] args) {
+        // 代理的目标对象
+        MyLife target = new MyLife();
+        // 类加载器
+        ClassLoader loader = JdkDemo.class.getClassLoader();
+        // 通过jdk代理创建的对象  对应的类型是 接口Life
+        // jdk所创建的代理对象 也实现了 Life接口  是兄弟关系
+        Life proxyInstance = (Life) Proxy.newProxyInstance(loader, new Class[]{Life.class}, new InvocationHandler() {
+            @Override
+            public Object invoke(Object proxy, Method method, Object[] args1) throws Throwable {
+                // String result = target.sleep();
+                System.out.println("before");
+                Object result = method.invoke(target, args1);
+                System.out.println(result);
+                System.out.println("after");
+                System.out.println("=====");
+                return result;
+            }
+        });
+        proxyInstance.learn();
+        String result = proxyInstance.sleep();
+        System.out.println("=====");
+        System.out.println(result);
+    }
+}

+ 34 - 0
spring-demo/src/main/java/com/sf/proxy/jdk/MyInvocationHandler.java

@@ -0,0 +1,34 @@
+package com.sf.proxy.jdk;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+// 通过jdk提供的代理接口  来动态的创建代理对象
+public class MyInvocationHandler<T> implements InvocationHandler {
+
+    // 这个类需要支持泛型  对应它的目标对象
+    private T target;
+
+    // 根据目标对象 创建代理对象
+    public MyInvocationHandler(T target) {
+        this.target = target;
+    }
+
+    @Override
+    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+        // method是要执行的方法  args是方法需要的参数
+        // player.playGame()  转化成反射的写法
+        this.doBefore();
+        Object result = method.invoke(target, args);
+        this.doAfter();
+        return result;
+    }
+
+    private void doBefore(){
+        System.out.println("前置处理");
+    }
+
+    private void doAfter(){
+        System.out.println("后置处理");
+    }
+}

+ 26 - 0
spring-demo/src/main/java/com/sf/proxy/jdk/self/$Proxy0.java

@@ -0,0 +1,26 @@
+package com.sf.proxy.jdk.self;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+public class $Proxy0 implements Life {
+
+    private InvocationHandler handler;
+
+    @Override
+    public void learn() {
+        try {
+            Method learn = Life.class.getDeclaredMethod("learn");
+            this.handler.invoke(this, learn, new Object[0]);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public String sleep() {
+        return null;
+    }
+}

+ 7 - 0
spring-demo/src/main/java/com/sf/proxy/jdk/self/Life.java

@@ -0,0 +1,7 @@
+package com.sf.proxy.jdk.self;
+
+public interface Life {
+    void learn();
+
+    String sleep();
+}

+ 13 - 0
spring-demo/src/main/java/com/sf/proxy/jdk/self/MyLife.java

@@ -0,0 +1,13 @@
+package com.sf.proxy.jdk.self;
+
+public class MyLife implements Life {
+    @Override
+    public void learn() {
+        System.out.println("learn");
+    }
+
+    @Override
+    public String sleep() {
+        return "sleep result";
+    }
+}