[webbeans-dev] Re: Bean.getInjectionPoints()
Scott Ferguson
ferg at caucho.com
Fri Jan 2 00:22:07 EST 2009
On Jan 1, 2009, at 8:29 PM, Gavin King wrote:
>>
>> It shouldn't be necessary, since "SimpleBean implements Bean"
>> should be
>> responsible for its own validation. It doesn't make sense for the
>> Manager
>> implementation to validate the Bean, since that breaks the
>> encapsulation
>> model of both Manager and Bean. It's cleaner for Manager to assume
>> the Bean
>> is valid.
>
> That only works for Bean implementations provided in the
> specification. It does not work for Bean implementations provided by
> 3rd-party extensions. We need the dependency validation stuff to work
> in the second case also.
The validation would be a requirement on the extension, which should
be reasonable since a new Bean type would be a relatively rare and
sophisticated thing. If a 3rd party is capable of introspecting the
injection points, it's fully capable of calling the Manager methods
for validation.
Mostly, though, it's an encapsulation issue. The proposal exposes and
constrains information that really should be internal to the Bean
implementation just for the purpose of a relatively straightforward
validation.
>> On a related note, it would be cleaner if the Bean.create() method
>> was
>> changed to Bean.create(Context) in order to handle circular
>> references.
>>
>> The logic of Bean.create(Context) would be
>> 1. check if Bean is in Context (for circular ref), if so return the
>> bean.
>> 2. instantiate the Bean (do not inject/initialize) and put it in
>> Context
>> (so we have a ref)
>> 3. inject/initialize the bean as usual (this may trigger the circular
>> reference, which would be resolved by #1 on a second call).
>
> Bean already has a reference to the Manager and can call
> Manager.getContext(myScope). So the extra parameter would not be
> necessary.
True, but I did like the old DependentScoped concept of the previous
draft, and that kind of scope isn't available from the Manager. (I'm
not exactly sure why the dependent concept changed between drafts. I
assumed the new way was easier to define.)
> But what you're really saying is that it's better to handle circular
> references from Bean.create() than from Manager.getInstance(). OK,
> that's really interesting, let me chat to Pete Muir about that and get
> back to you.
>
> ...The responsibility for associating the new object with the Context
> should be in Bean.create() instead of in Context.get().
Right. It's easier to manage the circular problem there, or at least
was easier for me.
> This is not quite as simple as it sounds because it means adding a
> Context.put() operation, with hard-to-define semantics, and some way
> of ensuring that instances for which injection is not yet complete are
> not visible to other threads executing in the same context.
That's a good point. Although, I'd think the visibility issue would
exist with any API that supported circular refs, and the circular ref
issue is important. Certainly for ApplicationScoped services.
-- Scott
>
> --
> Gavin King
> gavin.king at gmail.com
> http://in.relation.to/Bloggers/Gavin
> http://hibernate.org
> http://seamframework.org
>
>
More information about the weld-dev
mailing list