Spring AOPのIntroduction

6655 ワード

文書Spring AOPの用語概要では、introductionはクラスに追加された新しいフィールドまたはメソッド定義を表す.Spring AOPでは、任意のオブジェクトintroduce(導入)の新しいインタフェースを実装できます.Introductionの使用方法
Springは、@DeclareParents(導入)の新しいインタフェース実装を必要とするクラス、およびデフォルトのインタフェース実装タイプを定義する注釈introduceを提供する.
@DeclareParents(value="com.xzy.myapp.service.*+", defaultImpl=DefaultUsageTracked.class)	//  `com.xzy.myapp.service`            `UsageTracked`     ,      `DefaultUsageTracked`
public static UsageTracked mixin;

例を挙げて説明する
  • インタフェースRunInterface
  • を定義する
    public interface RunInterface {
    	void run();
    }
    
  • RunInterfaceインタフェースを定義するデフォルト実装クラスDefaultRunInterface
  • public class DefaultRunInterface implements RunInterface {
    	@Override
    	public void run() {
    		System.out.println("default run method");
    	}
    }
    
  • Springを定義するJava構成クラスAppConfig
  • @Configuration
    @EnableAspectJAutoProxy
    @ComponentScan
    public class AppConfig {}
    
  • 断面クラスAspectClass
  • を定義する
    @Aspect
    @Component
    public class AspectClass {
    	@DeclareParents(value = "com.qyh.test.introduction.Person", defaultImpl = DefaultRunInterface.class)
    	private RunInterface runInterface;
    }
    
  • エンティティクラスPerson
  • を定義
    @Component
    public class Person {}
    
  • 定義テストクラスTest
  • public class Test {
    	public static void main(String[] args) {
    		ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
    		RunInterface person = applicationContext.getBean("person", RunInterface.class);
    		person.run();
    	}
    }
    
  • 試験結果
  • default run method
    
  • 結果解析AspectClassにおいて、IntroductionクラスがPersonを実装するようにRunInterfaceを定義したので、容器内のpersonインスタンスはRunInterfaceタイプに変換され、run()メソッドを呼び出すと、RunInterfaceのデフォルト実装DefaultRunInterfacerun()メソッドが呼び出される.personのインスタンスにrun()の方法を追加したことに相当する.

  • References
    Spring Framework 5.2.5 Reference Doc. Spring AOPのIntroduction(@DeclareParents)概要