开发者

Can I inject same class using Spring?

I have a class say UserService which implements Service and annotated with Service StereoType, I'm using Spring AOP and want to do temporary workaround for this(I know this can be done in better way)

@Service
public class UserService implements Service开发者_如何学编程{
   @Autowired
   private Service self;
}

I tried this but got BeanNotFoundException, did I missed anything?

I know I have to go with AspectJ with @Configurable but just looking for little temporary workaround


Why on earth would you need to do this? In any method where you need to refer to the current instance, ie self you simply use the this keyword.

Are we missing something? If there's something else you're trying to do, try to clarify your question and we'll take a stab at it.

In case you're wondering, this doesn't work because the bean can't be injected until it has been fully constructed --> this means that Spring has to have injected all properties of the bean. Effectively what you've done is created a circular dependency because Spring tries to instantiate the bean and when it does, it discovers that it needs to Autowire another bean. When it tries to find that bean it can't because the bean hasn't been added to the list of initialized beans (because it's currently being initialized). Does that make sense? This is why you get the BeanNotFoundException because the bean can't be initialized.


You can edit your class to be

@Service
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON, proxyMode = ScopedProxyMode.INTERFACES)
public class UserService implements Service
{
    @Autowired
    private Service self;
}

this should work


I know this isn't quite answering the question, but I'd suggest re-writing your code so that you do not need to rely on aspects being applied to the self-invocation. For example, if you have some transactional method, just make sure that the transaction stuff gets properly setup in the calling method.

If you really need to, you could make your class ApplicationContextAware and fetch the bean-with-aspects from the context


This works fine -

@Service(value = "someService")
public class UserService implements Service{
   @Resource(name = "someService")
   private Service self;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜