Spring LoadTimeWeaverのこと


もっと読む
    DDDはますます流行しています.正しいかどうかに関わらず、new User().save()という書き方がマンネリしているservice dao transaction scriptはいつもよりクールで魅力的です.save方法は一般的にこのようです.

public void save() {
	userRepository.save(this);
}
自然に見えますが、USerRepositryをどうやって取得するかはずっと難しい問題です.今jdk 5に追加されたInstructionメカニズムによって、この問題は標準的な解決策があります.  つまり、本稿のテーマであるLoadTimeWeaverは、aspectjが早くからこの機能をサポートしています.今日は主にspringがaspectjに基づくLoadTimeWeaverのサポートとよくある問題を検討します.
   spring load time weaverは主に以下のステップで完成します.
   1.起動プログラムのjvm argmentにspring-agent.jarを追加し、jvmで導出されたinstructionを取得する.
   2.aspectjブロックdomain objectの作成
   3.AnnotationBenConfigrer Aspectでdomain objectへの注入を完了しました.
以下詳細に説明します
1.Add spring-agent.jar to jvm argment
  
   コマンドライン起動であれば、java-javaagent:攂/spring-agent.jar MyProgramコマンド起動プログラムを使用して、ideであれば、jvm argmentに-javaagent:擔{your path}/spring-agent.jarを追加すれば良いです.
   このパラメータを増やす目的は、jvmで導出されたinstruction引用を取得して後続の操作を行い、spring-agent.jarのMETA-INF/MENIFEST.MFを開くと、その中の一つが見つかります.Preman-Classはinstructionの入り口を処理するために使われています.実際にspring-agent.jarにもこのクラスしかありません.コードを開くととても簡単です.

public class InstrumentationSavingAgent {

	private static volatile Instrumentation instrumentation;


	/**
	 * Save the {@link Instrumentation} interface exposed by the JVM.
	 */
	public static void premain(String agentArgs, Instrumentation inst) {
		instrumentation = inst;
	}

}

premain方法では、instructionをstatic参照に保存して、その後のアクセスを可能にします.
2.springを配置して、ロードtime weaverをサポートします.



    
    
    
    
    

springをloadtimeweaverを開くことによって、aspectj-weavingは三つのオプションがあります.
オンにしてaspectjを強制的に使用することを提案しています.aut-detectに設定すると、springはclasassplathでaspejct必要なMETA-INF/aop.xmlを検索します.見つけたらaspectj weavingを開始します.このロジックはLoadTimeWeaverBeanDefinitionPaserであります.

	protected boolean isAspectJWeavingEnabled(String value, ParserContext parserContext) {
		if ("on".equals(value)) {
			return true;
		}
		else if ("off".equals(value)) {
			return false;
		}
		else {
			// Determine default...
			ClassLoader cl = parserContext.getReaderContext().getResourceLoader().getClassLoader();
			return (cl.getResource(ASPECTJ_AOP_XML_RESOURCE) != null);
		}
	}
3.コードオブUser

@Configurable(autowire = Autowire.BY_TYPE)
public class User {
	
	@Resource
	//     @Autowired
	private UserRepository userRepository;
	
	public void save() {
		userRepository.save(this);
	}

}
4.spring-agent.jar、spring-aspects.jar、aspectj-weaver.jar、aspectj-rt.jarをclasaspathに参加して、運行期間は主に以下の呼び出しが発生します.
  • LoadTimeWeaver BeanDefinitionPaser/解析構成
  • ->  Aspring.jar/aspectj weavingを開く
  • ->  Instructionation SavingAgent(spring-agent.jar) //instructionを取得する
  • ->  Instruumentation LoadTimeWeaver(spring.jar)//aspectj class transformerを追加してinstruction
  • ->  Class ProcessorAgentAdapter萻tranform/aspectj-weaver.jar)/aspectjブロックdoman oject搭載
  • ->  AnnotationBenConfigrerAsprable(spring-aspects.jar)/spring注入依存度は@Configrableと表示されたオブジェクトの中で
  • これで全体のロードtime weave過程を完成します.
    前の文は必須ではありません.配置しないと、userRepositoryはannotation(@Resourceまたは@Autowired)で注入できず、set方法を使用しなければなりません.
    5.What's in spring-aspects.jar
       spring-aspects.jatは独立したjarであり、一般的なspring.jarに含まれていません.META-INF/aop.xmlはaspectjの必要な構成を定義しています.AnnotationBenConfigrerAspectは注入依存を担当しています.  domain objectでは、
    
    	public pointcut inConfigurableBean() : @this(Configurable);
    
    	public pointcut preConstructionConfiguration() : preConstructionConfigurationSupport(*); 
    
    	declare parents: @Configurable * implements ConfigurableObject;
    
    	public void configureBean(Object bean) {
      //       inject
    		beanConfigurerSupport.configureBean(bean);
    	}
    
    
    添付ファイルは文書中の例項目で、LoadTimeWeaver Testを実行すればいいです.
    PS:Springもいくつかの特定のアプリケーションサーバのClass Loaderを使用してLoadTimeWeaverを実現することができます.興味があれば、対応する文書を参照してください.
    王政は2009年、10、5
     
  • スプリングltw.zip(8 KB)
  • ダウンロード回数:193