imo once for *every* instance you create.
And each proxy == instance imo.
Marius, Stuuu, think we need you guys to clarify this.
txs and LieGrue,
strub
--- On Mon, 5/9/11, Pete Muir <pmuir(a)redhat.com> wrote:
From: Pete Muir <pmuir(a)redhat.com>
Subject: Re: AW: [cdi-dev] Proxy implementation leaks
To: "Mark Struberg" <struberg(a)yahoo.de>
Cc: "Arne Limburg" <arne.limburg(a)openknowledge.de>,
"cdi-dev(a)lists.jboss.org" <cdi-dev(a)lists.jboss.org>
Date: Monday, May 9, 2011, 3:32 PM
You can't enhance the class without
either a javaagent or bytecode instr.
If you use subclassing you only need to call the ctor of
the superclass once, not twice as it stands today.
On 9 May 2011, at 16:30, Mark Struberg wrote:
> was about to ask the same ;)
>
> If there is some subclassing involved, then you will
need to call the constructor of the superclass. You cannot
solve this another way without changing the original class.
>
> There is only one magic trick, but this is a pretty
heavyweight one:
> 1.) dynamically create an interface with all the
methods from the class hierarchy from the proxied class
> 2.) create a java.lang.reflect.proxy for the
interface
> 3.) dynamically _change_ the original proxied class to
additionally implement the freshly generated interface
>
> This is pretty much work, but imo the only way which
works.
> The downsides are that you need to 'enhance' the
original class, which might cause ClassCastExceptions and
lots of other nasty problems...
>
> LieGrue,
> strub
>
> --- On Mon, 5/9/11, Arne Limburg <arne.limburg(a)openknowledge.de>
wrote:
>
>> From: Arne Limburg <arne.limburg(a)openknowledge.de>
>> Subject: AW: [cdi-dev] Proxy implementation leaks
>> To: "Pete Muir" <pmuir(a)redhat.com>,
"Mark Struberg" <struberg(a)yahoo.de>
>> Cc: "cdi-dev(a)lists.jboss.org"
<cdi-dev(a)lists.jboss.org>
>> Date: Monday, May 9, 2011, 3:26 PM
>> Hi Pete,
>>
>> how would you instantiate a client proxy, if not
via a
>> constructor? You need one call for the proxy and
one call
>> for the 'contextual instance'.
>> Or am I missing some available java-magic?
>>
>> Regards,
>> Arne
>>
>> -----Ursprüngliche Nachricht-----
>> Von: cdi-dev-bounces(a)lists.jboss.org
>> [mailto:cdi-dev-bounces@lists.jboss.org]
>> Im Auftrag von Pete Muir
>> Gesendet: Montag, 9. Mai 2011 17:20
>> An: Mark Struberg
>> Cc: cdi-dev(a)lists.jboss.org
>> Betreff: Re: [cdi-dev] Proxy implementation leaks
>>
>> Thanks Mark, I knew there was a reason for the
lazy init.
>>
>> The two-ctor call is not necessary though.
>>
>> On 9 May 2011, at 16:15, Mark Struberg wrote:
>>
>>> actually this behaviour is pretty clear in EE.
It's
>> the same thing as we have with EJBs since almost
ever.
>> That's why @PostConstruct exists.
>>>
>>> Whenever object proxies or hidden/transparent
>> serialisation happens, then we need to create the
>> object/proxy on the other side/new invocation. And
everytime
>> this happens, the constructer will obviously get
called.
>>>
>>> So this is not a bug and surely not a leak!
>>>
>>> This was on our list when I did a talk about
CDI
>> pitfalls at the JSFdays last year together with
Dan.
>>>
>>> Maybe we should doument this better, but it's
nothing
>> for the spec, but the user documentation imo.
>>>
>>> Also the lazy init is imo a well specified and
welcome
>> behaviour. Look at the discussions way back about
how to
>> prevent cyclic injection problems.
>>>
>>> LieGrue,
>>> strub
>>>
>>> --- On Mon, 5/9/11, Christian Bauer <christian.bauer(a)gmail.com>
>> wrote:
>>>
>>>> From: Christian Bauer <christian.bauer(a)gmail.com>
>>>> Subject: [cdi-dev] Proxy implementation
leaks
>>>> To: cdi-dev(a)lists.jboss.org
>>>> Date: Monday, May 9, 2011, 2:46 PM
>>>> Started working with Weld 1.1.1 and
>>>> found two issues that probably should be
addressed
>> (maybe just
>>>> documented). They both look to me like
leaking
>> implementation details
>>>> because proxies are used for components
which are
>> not @Singleton or
>>>> @Dependent.
>>>>
>>>> @ApplicationScoped
>>>> public class Bug {
>>>>
>>>> public Bug() {
>>>>
>>>>
System.out.println("##########
>>>> CONSTRUCT");
>>>> }
>>>>
>>>> public void foo()
{
>>>>
>> System.out.println("#####
>>>> FOO");
>>>> }
>>>>
>>>> public static void
main(String[]
>> args) {
>>>> Weld
weld = new
>> Weld();
>>>>
WeldContainer
>> weldContainer
>>>> = weld.initialize();
>>>>
>>>> Bug
bug =
>>>>
weldContainer.instance().select(Bug.class).get();
>> // Creates new
>>>> instance of Bug
>>>>
bug.foo(); // Creates
>> new
>>>> instance of Bug!!!
>>>>
bug.foo(); // Uses
>> existing
>>>> instance
>>>>
>>>>
weld.shutdown();
>>>> }
>>>> }
>>>>
>>>> The proxy of Bug will call its superclass
>> constructor several times
>>>> during the lifecycle of the Bug component.
I don't
>> know if that is
>>>> really necessary, but if it is, you can
now no
>> longer use
>>>> constructors to initialize your component.
This is
>> an issue because
>>>>
>>>> - it's not documented that constructors
of
>> @ApplciationScoped (etc.,
>>>> proxied) components behave differently
than
>> @Singleton/@Dependent
>>>> constructors
>>>>
>>>> - even if it's documented, it's
questionable if
>> that really should be
>>>> the case.
>>>>
>>>> Taking away constructors as the primary
means of
>> initializing a
>>>> component - e.g. obtaining resources such
as
>> database connections,
>>>> reading config files, etc. - is a major
change in
>> the Java
>>>> programming model. Users have to be
strongly
>> advised to use
>>>> @PostConstruct then.
>>>>
>>>> The other issue I immediately found is
also
>> related to behavior of
>>>> proxies and how transitive
initializing/injection
>> is implemented (not
>>>> sure if this is actually specified
somewhere):
>>>>
>>>> @ApplicationScoped
>>>> public class Foo {
>>>>
>>>> @Inject
>>>> Bar bar;
>>>>
>>>> }
>>>>
>>>> @ApplicationScoped
>>>> public class Bar {
>>>>
>>>> @Inject
>>>> Baz baz;
>>>>
>>>> @PostConstruct
>>>> void init() { ... }
>>>>
>>>> }
>>>>
>>>> When I obtain a reference to Foo, I get a
proxy of
>> Foo with a
>>>> reference to a proxy of Bar. The init()
method of
>> Bar is never
>>>> called. The Baz component is never
activated.
>>>>
>>>> This means I can't transitively initialize
an
>> application-scoped
>>>> graph of components. I was trying to use
CDI for
>> wiring in a Swing
>>>> application and I imagine this would be a
common
>> usecase. It should
>>>> either be documented that there is a
difference
>> between
>>>> @Singleton/@Dependent and
proxy-implemented
>> scopes, or unification
>>>> should be considered.
>>>>
>>>>
>>>>
_______________________________________________
>>>> cdi-dev mailing list
>>>> cdi-dev(a)lists.jboss.org
>>>>
https://lists.jboss.org/mailman/listinfo/cdi-dev
>>>>
>>
>>
>> _______________________________________________
>> cdi-dev mailing list
>> cdi-dev(a)lists.jboss.org
>>
https://lists.jboss.org/mailman/listinfo/cdi-dev
>>