2012-12-28 29 views
7

Tôi đang tự hỏi nếu tôi có thể lập bản đồ mảnh này xml cấu hình Spring JavaConfig:JavaConfig: Thay aop: cố vấn và tx: lời khuyên

<?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> 

Cho đến nay tôi đã tìm ra cách để thay thế aop: pointcut với

<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() {} 
} 

Bất kỳ gợi ý làm thế nào để thay thế nghỉ ngơi?

Trả lời

3

Hiện tại, bạn không thể dịch tất cả cài đặt AspectJ dựa trên XML sang cấu hình dựa trên Java. Có lẽ nó sẽ không bao giờ được. Lý do chính là Java không hỗ trợ các phương thức literals. Nhưng có một cách giải quyết, trong đó lần đầu tiên được trình bày ở đây: https://jira.springsource.org/browse/SPR-8148

  1. Tiếp tục sử dụng <aop:config> bằng cách bao gồm các đoạn mã XML có liên quan sử dụng @ImportResource
  2. Chuyển đổi bất kỳ <aop:config> yếu tố hiện có để sử dụng @Aspect phong cách.

Nhắc đến documentation, tôi sẽ nói rằng bạn đã gần như hoàn tất với cấu hình của bạn, bạn đã mô tả ở trên. Bạn chỉ cần phải thay đổi bạn cấu hình như thế này:

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

Rời khỏi phần còn lại như nó là và nhập khẩu mà nguồn:

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() {} 
} 

Tôi hy vọng tôi có thể giúp ...

+0

cảm ơn (đặc biệt là chỉ ra vấn đề jira)! – user871611

5

Nếu bạn don Không muốn sử dụng bất kỳ xml nào cả, khi đó bạn có thể tạo một lớp cấu hình Java riêng biệt cho các khía cạnh

@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 
} 

Và impor t trên lớp cấu hình trong lớp AppConfig chính của bạn

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

Bây giờ tạo đậu khía cạnh của bạn

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"); 
    } 

} 

Bạn có thể sử dụng pointcut cùng với lời khuyên chú thích như trên.

Các vấn đề liên quan