Uploaded image for project: 'CDI Specification Issues'
  1. CDI Specification Issues
  2. CDI-228

Clarify that _all_ @Dependent beans created for a containers method invocation will get destroyed after the method exits

    Details

    • Type: Clarification
    • Status: Closed (View Workflow)
    • Priority: Critical
    • Resolution: Done
    • Affects Version/s: 1.1.EDR
    • Fix Version/s: 1.1.PFD
    • Component/s: Contexts
    • Labels:
      None

      Description

      This clarification is intended for all methods which gets invoked by the CDI container and create a new @Dependent contextual instance especially for this invocation. This can happen in @Observes, @Produces, @Disposal and @Inject methods as well as in @Inject contructors. Basically any @Dependent method-parameter InjectionPoint.

      Despite it's atm not specified whether this @Dependent instance will get stored, most containers store it in the CreationalContext of the bean containing the invoked method. This behaviour can lead to mem leaks and non-serializibility issues.

      TASK: Define that any @Dependent contextual instance will get properly destroyed after such method invocations.

      There are 2 things we need to think about:
      1.) any @PreDestroy method of those beans will get invoked after the method invocation, even if the @Dependent instance will stored away in a member field and still being used later. This will not make any problems in most cases. We just need to make people aware that this will happen.

      2.) As any Decorator or Interceptor is also an @Dependent instance on our 'temporary' created @Dependent method parameter, those Interceptors and Decorators will not be available after the method invocation. Storing away this bean and re-using it later will probably cause an Exception.

      I still think this is a small problem compared to creating tons of mem leaks. There are quite a few workarounds possible:
      *) Instead of @Inject methods you can use @Inject field + @PostConstruct to initialize it.
      *) We might add an additional annotation which denotes either @Transactional or au contraire: @Keep for the method-param InjectionPoint

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  pmuir Pete Muir
                  Reporter:
                  struberg Mark Struberg
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  6 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: