[cdi-dev] Feedback - CDI bootstrap API (CDI-26)

Romain Manni-Bucau rmannibucau at gmail.com
Wed Mar 4 07:41:49 EST 2015


try (CDIContainer container = CDIContainer.newCDIContainer()) {
UnmanagedInstance<MyMain> main = new Unmanaged<MyMain>(MyMain.class)
.create();
main.get().run(args); // we can even reuse main(String[]) args here
main.destroy();
}

Now let's call destroy close and we get:

try (CDIContainer container = CDIContainer.newCDIContainer()) {
try (UnmanagedInstance<MyMain> main = new
Unmanaged<MyMain>(MyMain.class).create())
{
main.get().run(args);
}
}



Romain Manni-Bucau
@rmannibucau <https://twitter.com/rmannibucau> |  Blog
<http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> |
LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
<http://www.tomitribe.com>

2015-03-04 13:35 GMT+01:00 John D. Ament <john.d.ament at gmail.com>:

> I don't understand the relationship to Java SE mode.
>
> On Wed, Mar 4, 2015 at 7:33 AM Romain Manni-Bucau <rmannibucau at gmail.com>
> wrote:
>
>> instead of
>>
>>  Unmanaged<Foo> unmanagedFoo = new Unmanaged<Foo>(Foo.class);
>>  UnmanagedInstance<Foo> fooInstance = unmanagedFoo.newInstance();
>>  Foo foo = fooInstance.produce().inject().postConstruct().get();
>>  ... // Use the foo instance
>>  fooInstance.preDestroy().dispose();
>>
>>
>> just doing
>>
>>
>>  UnmanagedInstance<Foo> fooInstance = new Unmanaged<Foo>(Foo.class).create();
>>  ... // Use the foo instance
>>  fooInstance.destroy();
>>
>>
>> Would make the main then quite trivial and more user friendly IMO
>>
>>
>>
>> Romain Manni-Bucau
>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>> <http://rmannibucau.wordpress.com> | Github
>> <https://github.com/rmannibucau> | LinkedIn
>> <https://www.linkedin.com/in/rmannibucau> | Tomitriber
>> <http://www.tomitribe.com>
>>
>> 2015-03-04 13:31 GMT+01:00 John D. Ament <john.d.ament at gmail.com>:
>>
>>> Get what enhancements?
>>>
>>> On Wed, Mar 4, 2015 at 7:28 AM Romain Manni-Bucau <rmannibucau at gmail.com>
>>> wrote:
>>>
>>>> ok, initialize was returning a CDI instance then.
>>>>
>>>> If CDI instance is so present why bothering container api with it? Just
>>>> looks like another Unmanaged. In this case I would enhance Unmanaged to
>>>> have shortcut like create() (shortcut for
>>>> produce()/inject()/postConstruct()) and destroy
>>>> (preDestroy()/dispose()). Said otherwise: the need is already in the API so
>>>> why not letting EE getting these enhancement as well?
>>>>
>>>>
>>>> Romain Manni-Bucau
>>>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>>>> <http://rmannibucau.wordpress.com> | Github
>>>> <https://github.com/rmannibucau> | LinkedIn
>>>> <https://www.linkedin.com/in/rmannibucau> | Tomitriber
>>>> <http://www.tomitribe.com>
>>>>
>>>> 2015-03-04 13:09 GMT+01:00 John D. Ament <john.d.ament at gmail.com>:
>>>>
>>>>> Same way as defined in the spec
>>>>>
>>>>> CDI.current().destroy(..)
>>>>>
>>>>> On Wed, Mar 4, 2015 at 6:44 AM Romain Manni-Bucau <
>>>>> rmannibucau at gmail.com> wrote:
>>>>>
>>>>>> hmm, and if the bean is @Dependent? how do you release it?
>>>>>>
>>>>>>
>>>>>> Romain Manni-Bucau
>>>>>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>>>>>> <http://rmannibucau.wordpress.com> | Github
>>>>>> <https://github.com/rmannibucau> | LinkedIn
>>>>>> <https://www.linkedin.com/in/rmannibucau> | Tomitriber
>>>>>> <http://www.tomitribe.com>
>>>>>>
>>>>>> 2015-03-04 12:37 GMT+01:00 John D. Ament <john.d.ament at gmail.com>:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Wed, Mar 4, 2015 at 6:35 AM Romain Manni-Bucau <
>>>>>>> rmannibucau at gmail.com> wrote:
>>>>>>>
>>>>>>>> 2015-03-04 12:29 GMT+01:00 John D. Ament <john.d.ament at gmail.com>:
>>>>>>>>
>>>>>>>>> Hmm.. comments in line.
>>>>>>>>>
>>>>>>>>> On Wed, Mar 4, 2015 at 4:49 AM Antoine Sabot-Durand <
>>>>>>>>> antoine at sabot-durand.net> wrote:
>>>>>>>>>
>>>>>>>>>> Hi John,
>>>>>>>>>>
>>>>>>>>>> I think it could be a good idea to write down all of these to
>>>>>>>>>> have a more stable doc for discussion. You should update the google doc
>>>>>>>>>> with the result of this discussion.
>>>>>>>>>>
>>>>>>>>>> I agree with the following points in this thread :
>>>>>>>>>>
>>>>>>>>>> - Minimize the number of new Class / Interface. CDI and
>>>>>>>>>> CDIProvider usage is still not very clear for end user so we should add the
>>>>>>>>>> strict minimum and try to enhance existing API / SPI when possible
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> It seems odd to me that we're rehashing decisions made during the
>>>>>>>>> EG meetings.  Not putting it in CDI was discussed in several meetings at
>>>>>>>>> the beginning of the year, and it seemed like the agreement was putting it
>>>>>>>>> in CDI was a bad idea.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> - Be able to bootstrap CDI without returning BeanManager (env if
>>>>>>>>>> the API give possibility to access it if needed). End user don’t need that
>>>>>>>>>> : CDI app can start with an observer for instance
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Agreed, but I think we need to provide some entry point to allow
>>>>>>>>> those who aren't comfortable with programming with events to leverage it.
>>>>>>>>> Returning the CDI instance makes that easier to do than returning the
>>>>>>>>> BeanManager.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>> Can you detail it please? CDI value is only its getBeanManager()
>>>>>>>> method IMO so it sounds like it is 1-1 for me.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Taken from the docs I"m working on:
>>>>>>>
>>>>>>> MyBean myBean = container.initialize().select(MyBean.class).get();
>>>>>>> myBean.doWork();
>>>>>>>
>>>>>>> Vs the 3-4 lines it takes to get a reference using just BeanManager.
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>>> Something not dealt with but that we should keep in mind :
>>>>>>>>>> - Providing a Java SE solution that could be easily used for a
>>>>>>>>>> servlet bootstrap of CDI. I don’t know if we’ll standardize this but we
>>>>>>>>>> definitely should keep this use case in mind
>>>>>>>>>>
>>>>>>>>>> and my bonus, it’s out of scope but I didn’t see anytime there
>>>>>>>>>> that prevent this nice to have:
>>>>>>>>>> - support the possibility to boot multiple BeanManager in Java SE.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> We talked about this one as well on the EG, either this year or
>>>>>>>>> late last year.  I thought the decision at that time was that we wouldn't
>>>>>>>>> allow multiple containers at once in SE.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>> wouldn't specify rather than wouldn't allow I think
>>>>>>>>
>>>>>>>>
>>>>>>>>> Antoine
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Le 1 mars 2015 à 15:13, John D. Ament <john.d.ament at gmail.com> a
>>>>>>>>>> écrit :
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> So, I think I've gathered enough feedback at this point, and seen
>>>>>>>>>> some of the API changes.  I'll hopefully be including some doc changes this
>>>>>>>>>> week, but one question - do we want to start the SE specific stuff as its
>>>>>>>>>> own asciidoc file?
>>>>>>>>>>
>>>>>>>>>> Changes made:
>>>>>>>>>>
>>>>>>>>>> - Changed return value to CDI<Object> to provide better
>>>>>>>>>> capability out of the box.
>>>>>>>>>> - Added AutoCloseable to CDIContainer, provided default
>>>>>>>>>> implementation of calling shutdown.
>>>>>>>>>> - Added synchronization support to the method body that retrieves
>>>>>>>>>> the singleton instance (BTW, I'm not sure if this is even useful TBH as
>>>>>>>>>> each impl, including the RI, needs to provide this class in its own format).
>>>>>>>>>> - Made the params map typed to <String,Object>
>>>>>>>>>>
>>>>>>>>>> @Romain Your case isn't really supportable yet, until we have
>>>>>>>>>> static injection support.  You'd still have to have a managed version of
>>>>>>>>>> Runner to work against.
>>>>>>>>>>
>>>>>>>>>> John
>>>>>>>>>>
>>>>>>>>>> On Sat, Feb 28, 2015 at 4:11 PM Romain Manni-Bucau <
>>>>>>>>>> rmannibucau at gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> Yes but not the way to get an instance. Even Unmanaged does it.
>>>>>>>>>>>
>>>>>>>>>>> What can be awesome is to have static inject for it:
>>>>>>>>>>>
>>>>>>>>>>> public class Runner {
>>>>>>>>>>>
>>>>>>>>>>> @Inject
>>>>>>>>>>> private static MyMain main;
>>>>>>>>>>>
>>>>>>>>>>> public static void main(String[] arg) {
>>>>>>>>>>>     try (CDIContainer c = CDIContainer.newContainer()) {
>>>>>>>>>>>         main.doWork();
>>>>>>>>>>>     }
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> }
>>>>>>>>>>>
>>>>>>>>>>> And not a single additional line :).
>>>>>>>>>>>  Le 28 févr. 2015 19:05, "John D. Ament" <john.d.ament at gmail.com>
>>>>>>>>>>> a écrit :
>>>>>>>>>>>
>>>>>>>>>>> Maybe I'm misreading, but I don't see us adding another API to
>>>>>>>>>>>> do the same thing here - we're introducing new functionality.
>>>>>>>>>>>>
>>>>>>>>>>>> CDIContainer/Loader on startup/shutdown of the application
>>>>>>>>>>>>
>>>>>>>>>>>> CDI for runtime usage within the application to interact with
>>>>>>>>>>>> the container.
>>>>>>>>>>>>
>>>>>>>>>>>> John
>>>>>>>>>>>>
>>>>>>>>>>>> On Fri, Feb 27, 2015 at 3:40 AM Romain Manni-Bucau <
>>>>>>>>>>>> rmannibucau at gmail.com> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> sure I fully agree excepted I think introducing yet another
>>>>>>>>>>>>> API to do
>>>>>>>>>>>>> the same thing is not good so super tempting to skip it and
>>>>>>>>>>>>> wait for
>>>>>>>>>>>>> feedbacks rather than introducing it eagerly.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Romain Manni-Bucau
>>>>>>>>>>>>> @rmannibucau
>>>>>>>>>>>>> http://www.tomitribe.com
>>>>>>>>>>>>> http://rmannibucau.wordpress.com
>>>>>>>>>>>>> https://github.com/rmannibucau
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> 2015-02-27 8:05 GMT+01:00 Jozef Hartinger <jharting at redhat.com
>>>>>>>>>>>>> >:
>>>>>>>>>>>>> > My point is that from the application perspective, the user
>>>>>>>>>>>>> obtains one
>>>>>>>>>>>>> > container handle for eventual shutdown (CDIContainer) and
>>>>>>>>>>>>> then looks up a
>>>>>>>>>>>>> > different container handle (CDI) that they can use for real
>>>>>>>>>>>>> work (lookup /
>>>>>>>>>>>>> > event dispatch / etc.) It would be cleaner if the container
>>>>>>>>>>>>> gave away a
>>>>>>>>>>>>> > single handle that can do all of that.
>>>>>>>>>>>>> >
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > On 02/26/2015 05:42 PM, Romain Manni-Bucau wrote:
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > Not sure I get how a CDI instance can help.
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > But container.getBeanManager() sounds nice is not a shortcut
>>>>>>>>>>>>> for
>>>>>>>>>>>>> > CDI.current().getBm() otherwise it looks like duplication to
>>>>>>>>>>>>> me.
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > Can we make container not contextual - dont think so? If so
>>>>>>>>>>>>> it makes sense
>>>>>>>>>>>>> > otherwise I fear it doesnt add much.
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > Le 26 févr. 2015 16:19, "Jozef Hartinger" <
>>>>>>>>>>>>> jharting at redhat.com> a écrit :
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >> I like the initialize + close() combination and the
>>>>>>>>>>>>> try-with-resources
>>>>>>>>>>>>> >> usage.
>>>>>>>>>>>>> >> What looks weird to me is that at line one you obtain a
>>>>>>>>>>>>> container handle:
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >> try (CDIContainer container = CDIContainer.newCDIContai...
>>>>>>>>>>>>> >> CDI.current().getBeanManager() ...
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >> and then at line two you call a static method to perform a
>>>>>>>>>>>>> container
>>>>>>>>>>>>> >> lookup :-/
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >> An API that allows you to use the container handle you
>>>>>>>>>>>>> already got is way
>>>>>>>>>>>>> >> better IMO, e.g.:
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >> try (CDIContainer container = CDIContainer.newCDIContai...
>>>>>>>>>>>>> >> container.getBeanManager()
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >> If CDIContainer.newCDIContainer() returns an CDI instance
>>>>>>>>>>>>> or its subclass,
>>>>>>>>>>>>> >> we get this easily.
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >> On 02/26/2015 08:58 AM, Romain Manni-Bucau wrote:
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> Hi guys
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> why note keeping it simple?
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> try (CDIContainer container =
>>>>>>>>>>>>> CDIContainer.newCDIContainer(/* optional
>>>>>>>>>>>>> >>> map to configure vendor features */)) {
>>>>>>>>>>>>> >>>       CDI.current().getBeanManager()....
>>>>>>>>>>>>> >>> }
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> Not sure the point having initialize() + having shutdown =
>>>>>>>>>>>>> close
>>>>>>>>>>>>> >>> really makes the API more fluent and modern IMO.
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> Also to be fully SE I guess provider() method would be
>>>>>>>>>>>>> needed even if
>>>>>>>>>>>>> >>> optional (SPI usage by default):
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> try (CDIContainer container =
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> CDIContainer.provider("org.jboss.weld.
>>>>>>>>>>>>> WeldCdiContainerProvider").newCDIContainer())
>>>>>>>>>>>>> >>> {
>>>>>>>>>>>>> >>>       CDI.current().getBeanManager()....
>>>>>>>>>>>>> >>> }
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> Finally I think having a kind of getInstance shortcut
>>>>>>>>>>>>> could be a plus for
>>>>>>>>>>>>> >>> SE:
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> try (CDIContainer container =
>>>>>>>>>>>>> CDIContainer.newCDIContainer()) {
>>>>>>>>>>>>> >>>       container.newInstance(MyAppRunner.class /* optional
>>>>>>>>>>>>> qualifiers */
>>>>>>>>>>>>> >>> ).run(args);
>>>>>>>>>>>>> >>> }
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> Using container to get an instance would create the
>>>>>>>>>>>>> instance and bind
>>>>>>>>>>>>> >>> it to the container lifecycle (mainly for predestroy)
>>>>>>>>>>>>> avoiding this
>>>>>>>>>>>>> >>> boilerplate code in all main which will surely only be
>>>>>>>>>>>>> used to launch
>>>>>>>>>>>>> >>> a soft.
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> wdyt?
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> Romain Manni-Bucau
>>>>>>>>>>>>> >>> @rmannibucau
>>>>>>>>>>>>> >>> http://www.tomitribe.com
>>>>>>>>>>>>> >>> http://rmannibucau.wordpress.com
>>>>>>>>>>>>> >>> https://github.com/rmannibucau
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>>
>>>>>>>>>>>>> >>> 2015-02-26 8:32 GMT+01:00 Jozef Hartinger <
>>>>>>>>>>>>> jharting at redhat.com>:
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> Comments inline
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> On 02/25/2015 05:53 PM, John D. Ament wrote:
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> Sorry Jozef, your email fell into the pits of google
>>>>>>>>>>>>> inbox's "smart
>>>>>>>>>>>>> >>>> sorting"
>>>>>>>>>>>>> >>>> features.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> On Thu, Feb 12, 2015 at 3:18 AM Jozef Hartinger <
>>>>>>>>>>>>> jharting at redhat.com>
>>>>>>>>>>>>> >>>> wrote:
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> Hi John, comments inline:
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> On 02/11/2015 06:02 PM, John D. Ament wrote:
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> Jozef,
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> Most of what you see there is taken from the original
>>>>>>>>>>>>> doc, since
>>>>>>>>>>>>> >>>>> everyone
>>>>>>>>>>>>> >>>>> seemed to be in agreement.  I think the map is just a
>>>>>>>>>>>>> safeguard in case
>>>>>>>>>>>>> >>>>> of
>>>>>>>>>>>>> >>>>> additional boot options available in some
>>>>>>>>>>>>> implementations (e.g. I think
>>>>>>>>>>>>> >>>>> OWB/OpenEJB have some options.. currently OpenEJB
>>>>>>>>>>>>> supports an embedded
>>>>>>>>>>>>> >>>>> CDI
>>>>>>>>>>>>> >>>>> boot mode).
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> No, I am fine with the map. What I am questioning is the
>>>>>>>>>>>>> type of the
>>>>>>>>>>>>> >>>>> map.
>>>>>>>>>>>>> >>>>> Usually, data structures with a similar purpose use
>>>>>>>>>>>>> Strings as their
>>>>>>>>>>>>> >>>>> keys.
>>>>>>>>>>>>> >>>>> This applies to ServletContext attributes,
>>>>>>>>>>>>> InvocationContext data,
>>>>>>>>>>>>> >>>>> Servlet
>>>>>>>>>>>>> >>>>> request/session attributes and others. I am therefore
>>>>>>>>>>>>> wondering whether
>>>>>>>>>>>>> >>>>> there is a usecase for the proposed unbound key
>>>>>>>>>>>>> signature or not.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> I think that's more of a placeholder, I was assuming it
>>>>>>>>>>>>> would be
>>>>>>>>>>>>> >>>> Map<String,Object> once we clarify everything.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> We spoke a few times about BeanManager vs CDI.
>>>>>>>>>>>>> BeanManager was
>>>>>>>>>>>>> >>>>> preferable
>>>>>>>>>>>>> >>>>> since there's no easy way to get the the instance, CDI
>>>>>>>>>>>>> is easier to get
>>>>>>>>>>>>> >>>>> and
>>>>>>>>>>>>> >>>>> more aligned with how you would get it.  Usually people
>>>>>>>>>>>>> expect the
>>>>>>>>>>>>> >>>>> BeanManager to be injected or available via JNDI,
>>>>>>>>>>>>> neither would be the
>>>>>>>>>>>>> >>>>> case
>>>>>>>>>>>>> >>>>> here.
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> If CDI 2.0 targets Java SE then this container
>>>>>>>>>>>>> initialization API will
>>>>>>>>>>>>> >>>>> become something that ordinary application developers
>>>>>>>>>>>>> use to start/stop
>>>>>>>>>>>>> >>>>> CDI
>>>>>>>>>>>>> >>>>> in their applications. It therefore cannot be considered
>>>>>>>>>>>>> an SPI but
>>>>>>>>>>>>> >>>>> instead
>>>>>>>>>>>>> >>>>> should be something easy to use. On the other hand,
>>>>>>>>>>>>> BeanManager is
>>>>>>>>>>>>> >>>>> definitely an SPI. It is used in extension, frameworks
>>>>>>>>>>>>> and generally
>>>>>>>>>>>>> >>>>> for
>>>>>>>>>>>>> >>>>> integration. Not much by applications directly.
>>>>>>>>>>>>> Therefore, I don't see
>>>>>>>>>>>>> >>>>> how
>>>>>>>>>>>>> >>>>> the container bootstrap API and BeanManager fit
>>>>>>>>>>>>> together. IMO the
>>>>>>>>>>>>> >>>>> bootstrap
>>>>>>>>>>>>> >>>>> API should expose something that makes common tasks
>>>>>>>>>>>>> (obtaining a
>>>>>>>>>>>>> >>>>> contextual
>>>>>>>>>>>>> >>>>> reference and firing and event) easy, which the CDI
>>>>>>>>>>>>> class does.
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> Plus do not forget that BeanManager can be obtained
>>>>>>>>>>>>> easily using
>>>>>>>>>>>>> >>>>> CDI.getBeanManager().
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> I'm not disagreeing.  There's a few things I'd consider:
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> - Is this mostly for new apps or existing?  If existing,
>>>>>>>>>>>>> it's probably
>>>>>>>>>>>>> >>>> using
>>>>>>>>>>>>> >>>> some internal API, if new it can use whatever API we give.
>>>>>>>>>>>>> >>>> - I don't want to return void, we should give some kind
>>>>>>>>>>>>> of reference
>>>>>>>>>>>>> >>>> into
>>>>>>>>>>>>> >>>> the container when we're done booting.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> Agreed, we should not be returning void.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> - CDI is a one step retrievable reference, where as
>>>>>>>>>>>>> BeanManager is a two
>>>>>>>>>>>>> >>>> step reference.  With that said, BeanManager makes more
>>>>>>>>>>>>> sense to return
>>>>>>>>>>>>> >>>> here.  Another thought could be we invent some new class
>>>>>>>>>>>>> that has both,
>>>>>>>>>>>>> >>>> but
>>>>>>>>>>>>> >>>> that's really redundant.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> Why do you think BeanManager makes more sense here?
>>>>>>>>>>>>> Especially given the
>>>>>>>>>>>>> >>>> assumption that application code is going to call this
>>>>>>>>>>>>> init/shutdown
>>>>>>>>>>>>> >>>> API, I
>>>>>>>>>>>>> >>>> don't see BeanManager as making more sense.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> Yes, this is the container start API.  Sounds like you
>>>>>>>>>>>>> have some good
>>>>>>>>>>>>> >>>>> ideas for things like XML configuration or programmatic
>>>>>>>>>>>>> configuration,
>>>>>>>>>>>>> >>>>> both
>>>>>>>>>>>>> >>>>> of which are being tracked under separate tickets.  One
>>>>>>>>>>>>> idea might be
>>>>>>>>>>>>> >>>>> for an
>>>>>>>>>>>>> >>>>> optional param in the map to control packages to
>>>>>>>>>>>>> scan/ignore, in that
>>>>>>>>>>>>> >>>>> map.
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> I am wondering whether this configuration should be
>>>>>>>>>>>>> something optional
>>>>>>>>>>>>> >>>>> built on top of the bootstrap API or whether we should
>>>>>>>>>>>>> consider making
>>>>>>>>>>>>> >>>>> it
>>>>>>>>>>>>> >>>>> mandatory. Either way, we cannot add the bootstrap API
>>>>>>>>>>>>> to the spec
>>>>>>>>>>>>> >>>>> without
>>>>>>>>>>>>> >>>>> explicitly defining how it behaves. My implicit
>>>>>>>>>>>>> assumption of the
>>>>>>>>>>>>> >>>>> proposal
>>>>>>>>>>>>> >>>>> is that the container is supposed to scan the entire
>>>>>>>>>>>>> classpath for
>>>>>>>>>>>>> >>>>> explicit
>>>>>>>>>>>>> >>>>> or implicit bean archives (including e.g. rt.jar),
>>>>>>>>>>>>> discover beans, fire
>>>>>>>>>>>>> >>>>> extensions, etc. This worries me as this default
>>>>>>>>>>>>> behavior is far from
>>>>>>>>>>>>> >>>>> being
>>>>>>>>>>>>> >>>>> lightweight, which CDI for Java SE initially aimed to be.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> Yes, the spec must be updated to reflect the behavior of
>>>>>>>>>>>>> SE mode.  I
>>>>>>>>>>>>> >>>> plan to
>>>>>>>>>>>>> >>>> get that completely into the google doc before opening
>>>>>>>>>>>>> any spec changes
>>>>>>>>>>>>> >>>> in a
>>>>>>>>>>>>> >>>> PR.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> We didn't want to over load the CDI interface.  It
>>>>>>>>>>>>> already does a lot.
>>>>>>>>>>>>> >>>>> This is really SPI code, CDI even though it's in the spi
>>>>>>>>>>>>> package is
>>>>>>>>>>>>> >>>>> used in
>>>>>>>>>>>>> >>>>> a lot of application code.
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> I would personally prefer to have it all in one place.
>>>>>>>>>>>>> Having
>>>>>>>>>>>>> >>>>> CDIContainer, CDIContainerLoader, CDI and CDIProvider
>>>>>>>>>>>>> makes it more
>>>>>>>>>>>>> >>>>> difficult to know when to use what.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> The problem is that most CDI (the interface) operations
>>>>>>>>>>>>> are against a
>>>>>>>>>>>>> >>>> running container.  I think we spoke about leveraging
>>>>>>>>>>>>> CDIProvider at one
>>>>>>>>>>>>> >>>> point (in fact, I mistakenly called CDIContainer
>>>>>>>>>>>>> CDIProvider not even
>>>>>>>>>>>>> >>>> realizing it was there).  I doubt that most app
>>>>>>>>>>>>> developers use it
>>>>>>>>>>>>> >>>> currently,
>>>>>>>>>>>>> >>>> there's not even a way to get a reference to it that I'm
>>>>>>>>>>>>> aware of.  It's
>>>>>>>>>>>>> >>>> used by the implementor only.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> I don't think there's a conflict. CDI class would still
>>>>>>>>>>>>> only provide
>>>>>>>>>>>>> >>>> methods
>>>>>>>>>>>>> >>>> to be run against a running container. The difference is
>>>>>>>>>>>>> that there
>>>>>>>>>>>>> >>>> would be
>>>>>>>>>>>>> >>>> additional static methods to get this running container
>>>>>>>>>>>>> (CDI class) to
>>>>>>>>>>>>> >>>> you
>>>>>>>>>>>>> >>>> by starting the container.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> Either way, I agree that reusing CDIProvider is a must.
>>>>>>>>>>>>> There is no
>>>>>>>>>>>>> >>>> reason
>>>>>>>>>>>>> >>>> to define a new class for the same purpose.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> I expect that my changes in the CDI spec around this will
>>>>>>>>>>>>> state, along
>>>>>>>>>>>>> >>>> the
>>>>>>>>>>>>> >>>> lines of:
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> To retrieve a CDIContainer to launch, do this:
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> CDIContainer container = CDIContainerLocator.getCDICont
>>>>>>>>>>>>> ainer();
>>>>>>>>>>>>> >>>> container.initialize();
>>>>>>>>>>>>> >>>> ... do work
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> Once you want to shutdown the container, do this:
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> container.shutdown();
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> (we may want to consider implementing AutoCloseable, an
>>>>>>>>>>>>> oversight on my
>>>>>>>>>>>>> >>>> part)
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> and then later on
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> - What happens if I call CDIContainerLocator in an app
>>>>>>>>>>>>> server
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> - It throws an IllegalStateException.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> - The container provides no beans of type CDIContainer,
>>>>>>>>>>>>> it is managed
>>>>>>>>>>>>> >>>> outside of the CDI container.
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> John
>>>>>>>>>>>>> >>>>>
>>>>>>>>>>>>> >>>>> On Wed Feb 11 2015 at 4:21:50 AM Jozef Hartinger <
>>>>>>>>>>>>> jharting at redhat.com>
>>>>>>>>>>>>> >>>>> wrote:
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> Hi John, some thoughts:
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> - instead of using BeanManager it makes more sense to
>>>>>>>>>>>>> me to return a
>>>>>>>>>>>>> >>>>>> CDI
>>>>>>>>>>>>> >>>>>> instance, which is a more user-friendly API (and it
>>>>>>>>>>>>> also exposes
>>>>>>>>>>>>> >>>>>> access to
>>>>>>>>>>>>> >>>>>> BeanManager)
>>>>>>>>>>>>> >>>>>> - is there a usecase for arbitrary keys of the "params"
>>>>>>>>>>>>> map or is
>>>>>>>>>>>>> >>>>>> Map<String, ?> sufficient?
>>>>>>>>>>>>> >>>>>> - if we could move the shutdown() method from
>>>>>>>>>>>>> CDIContainer to the
>>>>>>>>>>>>> >>>>>> actual
>>>>>>>>>>>>> >>>>>> container handle that we obtain from initialize(), that
>>>>>>>>>>>>> would look
>>>>>>>>>>>>> >>>>>> more
>>>>>>>>>>>>> >>>>>> object-oriented
>>>>>>>>>>>>> >>>>>> - what exactly is initialize() supposed to do? Is it
>>>>>>>>>>>>> supposed to start
>>>>>>>>>>>>> >>>>>> scanning the entire classpath for CDI beans? That could
>>>>>>>>>>>>> be a problem
>>>>>>>>>>>>> >>>>>> especially with spring-boot-like fat jars. I think we
>>>>>>>>>>>>> need an API to
>>>>>>>>>>>>> >>>>>> tell
>>>>>>>>>>>>> >>>>>> the container which classes / packages to consider.
>>>>>>>>>>>>> Something like
>>>>>>>>>>>>> >>>>>> Guice's
>>>>>>>>>>>>> >>>>>> binding API perhaps?
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> - the proposal makes me wonder whether retrofitting
>>>>>>>>>>>>> this functionality
>>>>>>>>>>>>> >>>>>> to
>>>>>>>>>>>>> >>>>>> the CDI class wouldn't be a better option. It could
>>>>>>>>>>>>> look like:
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> CDI container = CDI.initialize();
>>>>>>>>>>>>> >>>>>> container.select(Foo.class).get();
>>>>>>>>>>>>> >>>>>> container.shutdown();
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> compare it to:
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> CDIContainer container = CDIContainerLoader.
>>>>>>>>>>>>> getCDIContainer();
>>>>>>>>>>>>> >>>>>> BeanManager manager = container.initialize();
>>>>>>>>>>>>> >>>>>> manager.getBeans(...);
>>>>>>>>>>>>> >>>>>> container.shutdown(manager);
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> On 02/10/2015 06:58 PM, John D. Ament wrote:
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> All,
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> I have the updated API here, and wanted to solicit any
>>>>>>>>>>>>> final feedback
>>>>>>>>>>>>> >>>>>> before updating the google doc and spec pages.
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> https://github.com/johnament/cdi/commit/
>>>>>>>>>>>>> 2c362161e18dd521f8e83c27151ddad467a1c01c
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> Let me know your thoughts.
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> Thanks,
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> John
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> _______________________________________________
>>>>>>>>>>>>> >>>>>> cdi-dev mailing list
>>>>>>>>>>>>> >>>>>> cdi-dev at lists.jboss.org
>>>>>>>>>>>>> >>>>>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>> Note that for all code provided on this list, the
>>>>>>>>>>>>> provider licenses
>>>>>>>>>>>>> >>>>>> the
>>>>>>>>>>>>> >>>>>> code under the Apache License, Version 2
>>>>>>>>>>>>> >>>>>> (http://www.apache.org/licenses/LICENSE-2.0.html). For
>>>>>>>>>>>>> all other ideas
>>>>>>>>>>>>> >>>>>> provided on this list, the provider waives all patent
>>>>>>>>>>>>> and other
>>>>>>>>>>>>> >>>>>> intellectual
>>>>>>>>>>>>> >>>>>> property rights inherent in such information.
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>>>
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> _______________________________________________
>>>>>>>>>>>>> >>>> cdi-dev mailing list
>>>>>>>>>>>>> >>>> cdi-dev at lists.jboss.org
>>>>>>>>>>>>> >>>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>>>>>>>>>>>>> >>>>
>>>>>>>>>>>>> >>>> Note that for all code provided on this list, the
>>>>>>>>>>>>> provider licenses the
>>>>>>>>>>>>> >>>> code
>>>>>>>>>>>>> >>>> under the Apache License, Version 2
>>>>>>>>>>>>> >>>> (http://www.apache.org/licenses/LICENSE-2.0.html). For
>>>>>>>>>>>>> all other ideas
>>>>>>>>>>>>> >>>> provided on this list, the provider waives all patent and
>>>>>>>>>>>>> other
>>>>>>>>>>>>> >>>> intellectual
>>>>>>>>>>>>> >>>> property rights inherent in such information.
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >
>>>>>>>>>>>>>
>>>>>>>>>>>>  _______________________________________________
>>>>>>>>>> cdi-dev mailing list
>>>>>>>>>> cdi-dev at lists.jboss.org
>>>>>>>>>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>>>>>>>>>>
>>>>>>>>>> Note that for all code provided on this list, the provider
>>>>>>>>>> licenses the code under the Apache License, Version 2 (
>>>>>>>>>> http://www.apache.org/licenses/LICENSE-2.0.html). For all other
>>>>>>>>>> ideas provided on this list, the provider waives all patent and other
>>>>>>>>>> intellectual property rights inherent in such information.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> cdi-dev mailing list
>>>>>>>>> cdi-dev at lists.jboss.org
>>>>>>>>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>>>>>>>>>
>>>>>>>>> Note that for all code provided on this list, the provider
>>>>>>>>> licenses the code under the Apache License, Version 2 (
>>>>>>>>> http://www.apache.org/licenses/LICENSE-2.0.html). For all other
>>>>>>>>> ideas provided on this list, the provider waives all patent and other
>>>>>>>>> intellectual property rights inherent in such information.
>>>>>>>>>
>>>>>>>>
>>>>>>
>>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/cdi-dev/attachments/20150304/6285effb/attachment-0001.html 


More information about the cdi-dev mailing list