2009-08-27 34 views
5

Sử dụng Spring Tôi đã gặp một số vấn đề khi thực hiện tiêm phụ thuộc vào lớp Aspect được chú thích. CacheService được tiêm khi khởi động bối cảnh của Spring, nhưng khi quá trình dệt diễn ra, nó nói rằng cacheService là null. Vì vậy, tôi buộc phải sửa lại bối cảnh mùa xuân bằng tay và lấy hạt từ đó. Có cách nào khác để thực hiện nó không?Phụ thuộc mùa xuân Tiêm một chú thích Aspect

Dưới đây là một ví dụ về Aspect của tôi:

import org.apache.log4j.Logger; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import com.mzgubin.application.cache.CacheService; 

@Aspect 
public class CachingAdvice { 

    private static Logger log = Logger.getLogger(CachingAdvice.class); 

    private CacheService cacheService; 

    @Around("execution(public *com.mzgubin.application.callMethod(..)) &&" 
      + "args(params)") 
    public Object addCachingToCreateXMLFromSite(ProceedingJoinPoint pjp, InterestingParams params) throws Throwable { 
    log.debug("Weaving a method call to see if we should return something from the cache or create it from scratch by letting control flow move on"); 

    Object result = null; 
    if (getCacheService().objectExists(params))}{ 
     result = getCacheService().getObject(params); 
    } else { 
     result = pjp.proceed(pjp.getArgs()); 
     getCacheService().storeObject(params, result); 
    } 
    return result; 
    } 

    public CacheService getCacheService(){ 
    return cacheService; 
    } 

    public void setCacheService(CacheService cacheService){ 
    this.cacheService = cacheService; 
    } 
} 

Trả lời

3

Vấn đề, như tôi hiểu nó, đó là mùa xuân đang tạo ra một bean thuộc loại này cho bạn, nhưng khuôn khổ AspectJ cũng đang tạo ra một instantiation của loại này bởi vì nó không biết mùa xuân đã làm như vậy.

Tôi tin rằng bạn muốn mang đến cho mùa xuân một nhà máy-phương pháp sử dụng để nhanh chóng đậu mà cũng cho phép AspectJ biết Aspect được tạo ra:

<!-- An @Aspect-annotated class --> 
<bean id="bar" class="com.foo.bar" factory-method="aspectOf"> 
    <property name="meaning" value="42" /> 
</bean> 

Để cung cấp tín dụng do, tôi đã xem qua câu hỏi này trước ngày hôm nay và sau đó tìm thấy câu trả lời elsewhere sau đó, vì vậy tôi sẽ quay lại để đóng vòng lặp.

Tôi không rõ ràng về sự kỳ diệu xảy ra ở đây, nhưng tôi thấy rằng có một lớp Aspects cung cấp một số hàm tạo tĩnh của hương vị này. Có lẽ AspectJ đang dệt các phương thức tĩnh có cùng tên trên mỗi Aspect cũng như tạo điều kiện thuận lợi cho kiểu xây dựng này.

2

Tôi cũng phải đối mặt với vấn đề như vậy.

Đây là cách nó đã được cố định:

@Aspect 
public class MyAspect { 
    @Resource // telling spring that at first look up bean by name; 
    Session session; // resource that won't of being setup; 

    private static class MyAspectHolder { 
    static final MyAspect instance = new MyAspect(); 
    } 

    ... 

    // special purpose method w/o it - stuff doesnt work; 
    public static MyAspect aspectOf() { 
    return MyAspectHolder.instance; 
    } 
} 

Và tất nhiên không quên <aop:aspectj-autoproxy /> trong cấu hình của bạn cùng với định nghĩa bean khía cạnh.

+0

vì vậy chỉ cần thiết lập phương thức aspectOf trong lớp khía cạnh của tôi dường như khắc phục điều này. Không chắc chắn lý do tại sao điều này chỉ đơn giản là làm việc vì hầu hết các bản sửa lỗi khác mà tôi đã thấy không có. BTW đã thử @Configurable thông qua các khía cạnh mùa xuân và một số người khác nhưng dường như không ai có thể gắn dây đúng cách với singleton aspectj. – PJH

+0

Nếu bạn viết khía cạnh khía cạnh cổ điển, trình truy cập tĩnh aspecOf được tạo bởi trình biên dịch aspectj: –

4

Vì khía cạnh được tạo trước vùng chứa Spring, bạn phải truy xuất khía cạnh từ phương thức factoryOf của Aspect (ExampleClass.class).

Từ cấu hình Spring XML, bạn có thể lấy các khía cạnh (object) như thế này:

<bean id="traceAspect" class="aspects.trace.TraceAspect" 
    factory-method="aspectOf" /> 

phương pháp Factory là những cách thông thường để lấy đối tượng được tạo bên ngoài container mùa xuân giống như một Enum.

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