11

このxml構成の一部をSpringJavaConfigにマップできるかどうか疑問に思っています。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop" 
  xmlns:tx="http://www.springframework.org/schema/tx" 
  xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd
                      http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop.xsd
                      http://www.springframework.org/schema/tx      http://www.springframework.org/schema/tx/spring-tx.xsd"
  default-autowire="byName">

  <aop:config>
     <aop:pointcut id="serviceAnnotatedClass" expression="@within(org.springframework.stereotype.Service)" />
     <aop:advisor id="managerTx" advice-ref="txAdvice" pointcut-ref="serviceAnnotatedClass" order="20" />
  </aop:config>

  <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
      <tx:method name="get*" read-only="true" />
      <tx:method name="find*" read-only="true" />
      <tx:method name="load*" read-only="true" />
      <tx:method name="is*" read-only="true" />
      <tx:method name="ownTransaction*" propagation="REQUIRES_NEW" rollback-for="Exception" />
      <tx:method name="*" rollback-for="Exception" />
    </tx:attributes>
  </tx:advice>

</beans>

これまでのところ、aop:pointcutを次のように置き換える方法を理解しました

<aop:advisor id="managerTx" advice-ref="txAdvice" 
pointcut="com.myapp.configuration.AspectConfig.serviceAnnotatedClass()" order="20"/>

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AspectConfig
{

  @Pointcut("@within(org.springframework.stereotype.Service)")
  public void serviceAnnotatedClass() {}
}

残りを置き換える方法のヒントはありますか?

4

2 に答える 2

8

xml をまったく使用したくない場合は、アスペクト用に個別の Java 構成クラスを作成できます。

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "com.myAspects")
public class AspectConfig {
    //Here you can define Aspect beans or just use @ComponentScan (as above)
    //to scan the @Aspect annotation in com.myAspects package
}

上記の構成クラスをメインの AppConfig クラスにインポートします

@Configuration
@EnableWebMvc
@Import({ AspectConfig.class })
@ComponentScan(basePackages = { "pkg1", "pkg2", "pkg3" })
public class AppConfiguration extends WebMvcConfigurationSupport {
    //Other configuration beans or methods
}

次に、アスペクト Bean を作成します

import com.myAspects;
@Component
@Aspect
public class LoggingAspect {

    @Before("execution(* com.service.*.*(..))")
    public void logBefore(){
        System.out.println("before advice called");
    } 

    @After("execution(* com.service.*.*(..))")
    public void logAfter(){
        System.out.println("after advice called");
    } 

}

上記のように、ポイントカットをアドバイス注釈とともに使用できます。

于 2016-08-02T15:55:26.940 に答える
5

現在、すべての XML ベースの AspectJ 設定を Java ベースの構成に変換することはできません。おそらく決してそうではないでしょう。主な理由は、Java がメソッド リテラルをサポートしていないことです。しかし、ここで最初に提示された回避策があります: https://jira.springsource.org/browse/SPR-8148

  1. <aop:config>を使用して関連する XML スニペットを含めて、引き続き使用します@ImportResource
  2. スタイル<aop:config>を使用するように既存の要素を変換します。@Aspect

ドキュメントを参照すると、上記の構成はほぼ完了していると言えます。次のように構成を変更するだけです。

<aop:config>
     <aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="com.myapp.configuration.AspectConfig.serviceAnnotatedClass()" order="20" />
</aop:config>

残りはそのままにして、そのリソースをインポートします。

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
@ImportResource("classpath:/aop-config.xml")
public class AspectConfig
{
    @Pointcut("@within(org.springframework.stereotype.Service)")
    public void serviceAnnotatedClass() {}
}

お役に立てれば幸いです...

于 2013-06-17T12:36:35.243 に答える