[cdi-dev] [JBoss JIRA] (CDI-414) Support for "self" injection or intercepted self invocation

Pavel Pscheidl (JIRA) issues at jboss.org
Tue May 17 07:18:00 EDT 2016


    [ https://issues.jboss.org/browse/CDI-414?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13238556#comment-13238556 ] 

Pavel Pscheidl commented on CDI-414:
------------------------------------

I think a good enough solution is to inject a Instance<T> object, where T is a generic type for the self-injecting bean.

{code:java}
public class Foo {
@Inject
private Instance<Foo> foo;
}
{code}

This works completely fine. Some kind of lazy-injecting proxy would be nice, but unnecessary. Since dependency injection is an acyclic graph, creating cycle dependecies is wrong. The code inside the bean should explicitely state (by calling foo.get()) that it wants to get "yet another" instance from the container.

Some (recursive) algorithms actually might want to use self-injected dependecies. However, the algorithm explicitely obtains the instance from the container and is in charge of stopping the recursion.

> Support for "self" injection or intercepted self invocation
> -----------------------------------------------------------
>
>                 Key: CDI-414
>                 URL: https://issues.jboss.org/browse/CDI-414
>             Project: CDI Specification Issues
>          Issue Type: Bug
>          Components: Resolution
>            Reporter: arjan tijms
>             Fix For: 2.0 (discussion)
>
>
> Many features of CDI and EJB work by means of a proxy that intercepts calls and adds 'aspects'. In Java it's however not possible to decorate the {{this}} pointer, so methods called on the same bean instance from within a method in the bean do not get their 'aspects' applied.
> This is a well known limitation, but in EJB it's possible to work around this by injecting a bean into itself. E.g.
> {code}
> @Stateless
> public class Foo {
>     @EJB
>     private Foo self;
>     // ...
> }
> {code}
> Also see http://adam-bien.com/roller/abien/entry/how_to_self_invoke_ejb
> Unfortunately using CDI and {{@Inject}} this doesn't work. Weld for instance fails the deployment and logs:
> {noformat}
> WELD-001443 Pseudo scoped bean has circular dependencies.
> {noformat}
> See also: http://adam-bien.com/roller/abien/entry/inject_vs_ejb
> Although there are workarounds, it would be great if {{@Inject}} in combination with CDI could support self injection as well.
> With that projects migrating from {{@EJB}} to {{@Inject}} can do so more easily and the capability can be convenient for new projects as well (e.g. calling two separate {{@Transactional}} methods from a single method without being required to create a new bean).



--
This message was sent by Atlassian JIRA
(v6.4.11#64026)


More information about the cdi-dev mailing list