Spring LoadTimeWeaverのこと
もっと読む
DDDはますます流行しています.正しいかどうかに関わらず、new User().save()という書き方がマンネリしているservice dao transaction scriptはいつもよりクールで魅力的です.save方法は一般的にこのようです.
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にもこのクラスしかありません.コードを開くととても簡単です.
2.springを配置して、ロードtime weaverをサポートします.
オンにしてaspectjを強制的に使用することを提案しています.aut-detectに設定すると、springはclasassplathでaspejct必要なMETA-INF/aop.xmlを検索します.見つけたらaspectj weavingを開始します.このロジックはLoadTimeWeaverBeanDefinitionPaserであります. 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では、
PS:Springもいくつかの特定のアプリケーションサーバのClass Loaderを使用してLoadTimeWeaverを実現することができます.興味があれば、対応する文書を参照してください.
王政は2009年、10、5
スプリングltw.zip(8 KB) ダウンロード回数:193
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に参加して、運行期間は主に以下の呼び出しが発生します.前の文は必須ではありません.配置しないと、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