Injected bean reset to NULL in the Aspect

2019-09-17 09:42发布

问题:

I am new Spring AOP and Aspectj. I have seen various posts related to injected bean in an aspect being null and I have run into a similar problem. I am still not clear how I should proceed to get past the problem I am currently encountering.

Issue: Currently we are using Spring 3.2.3 and all injection is through Annotation. In my case, the dependent bean is injected properly by Spring but at the point of execution the injected bean is NULL. BTW, this doesn't happen all the time but what I can say is the stack trace when it fails and when it succeeds is slightly different. When the injected bean is not null (I can successfully use the injected bean service), the call to the before advice (in the aspect) always happens before the target method is called as it should.When the injected bean is NULL, the call to the aspect is from the first statement of the target method. At this point, I think another aspect is instantiated and has no reference to the injected bean. Here is the aspect I have created:

@Component
@Aspect
public class Enable{

       private NameService nameService;

       @Autowired
       public void SetNameService(NameSerice service){          
            // service is injected properly
            this.nameSerice = service;
       }

       @Before("* *.*(..)")      
       public void callBefore(JoinPoint jp){    
            //sometimes nameService is null and sometimes it not not    
            this.nameService.lookup(...);    
       }
}

Examining the various posts, one way to get around this (as suggested in the post) is to configure the aspect in the XML configuration file and use the factory-method ="aspectOf" and in the configuration inject the reference to the NameService bean as a property. Our whole project uses Annotation based injection (as stated earlier). Assuming I can still configure the above aspect in an XML configuration file, how can I get the reference NameService bean Id so that I can add it to the configuration. I also saw a post related to using Configurable annotation but I assume that is for objects created outside the Spring IOC.

Currently, the aspects are woven using Aspectj compile option in pom.xml. Our root-context.xml contains the entry context:annotation-config and the aspect is injected into Spring IOC because component-scan is turned on for the folder where the aspect resides. Any help will be appreciated

回答1:

This is well common error when use aspects in spring, you should add

<context:spring-configured/>  

and

<aop:aspectj-autoproxy />

also add

@Configurable
@Aspect
public class Enable

To your appContext.xml

aspectOf is another style to do the above but I prefer use the nature of context.



回答2:

It might be too late to answer this question. But i have come across the same situation and i fixed it as below.

1) Have a setter and getter for "NameService" in your aspect class. 2) Mark "NameService" with @Component ("nameService") 3) Configure "nameService" in xml configuration using setter injection. 4) Re-Start your server after making changes.

This should resolve the problem of getting null for "NameService" in aspect.