Results 1 to 8 of 8

Thread: CGLIB proxy method calls constructor twice?

  1. #1
    Join Date
    Jun 2009
    Posts
    190

    Default CGLIB proxy method calls constructor twice?

    Hi,

    Can someone please explain the statement on CGLIB proxy :-

    The constructor of your proxied object will be called twice. Why would the constructor be called twice?

    How is it different from jdk proxy creatiion method?

    -Hetal

  2. #2
    Join Date
    May 2007
    Location
    Saint Petersburg, Russian Federation
    Posts
    1,189

    Default

    Cglib proxy creates new class that extends from your target bean class and cglib proxy is an instance of that new class. Superclass constructor (target bean class constructor actually) is called on proxy object instantiation.

    Spring aop uses proxy-base approach, i.e. it creates target bean and proxy for it as two distinct objects, hence, target bean class constructor is called twice.

  3. #3
    Join Date
    Jun 2009
    Posts
    190

    Default

    Thanks for your reply.

    I have one doubt that as per what you say if the target bean constructor is being called twice, now if i have a singleton bean, which is not declared as final, then do we mean to say that AOP will not work with Singleton beans?

    May be this is a very silly question but just asked as it came to my mind.

    -Hetal

  4. #4
    Join Date
    May 2007
    Location
    Saint Petersburg, Russian Federation
    Posts
    1,189

    Default

    Hetal,

    Singleton scope means that the single bean should be used for the bean definition by the container. That doesn't mean that another instance of that class can't be created. E.g. it's possible to declare two beans of the same class as singletons.

    Spring container uses AOP proxy instead of 'raw' beans for resolving dependencies, i.e. it injects the proxy instead of 'raw' beans to all other interested beans but the same proxy is reused for the same bean declaration.

  5. #5
    Join Date
    Jun 2009
    Posts
    190

    Default

    Thanks for your inputs.

    As per what i had understood was that the bean defined as Singleton are different from GOF Singleton pattern but atleast within the same application context you cannot have 2 Singleton beans refering to the same class as mentioned by you . and within the same context, it should share the instance available and not create a new one.

    Please correct me incase i am wrong.

  6. #6
    Join Date
    May 2007
    Location
    Saint Petersburg, Russian Federation
    Posts
    1,189

    Default

    Hetal,

    The reference is quite clear about that:
    HTML Code:
    When a bean is a singleton, only one shared  instance of the bean will be managed, and all requests for beans with an id or ids matching that bean definition will result in that one specific bean instance being returned by the Spring container.
    
    To put it another way, when you define a bean definition and it is scoped as a singleton, then the Spring IoC container will create exactly one instance of the object defined by that bean definition. This single instance will be stored in a cache of such singleton beans, and all subsequent requests and references for that named bean will result in the cached object being returned.
    ...
    Please be aware that Spring's concept of a singleton bean is quite different from the Singleton pattern as defined in the seminal Gang of Four (GoF) patterns book. The GoF Singleton hard codes the scope of an object such that one and only one instance of a particular class will ever be created per ClassLoader. The scope of the Spring singleton is best described as per container and per bean. This means that if you define one bean for a particular class in a single Spring container, then the Spring container will create one and only one instance of the class defined by that bean definition.

  7. #7
    Join Date
    Jun 2009
    Posts
    190

    Default

    Denis,

    I am sorry but i think that i have not explained things to you clearly. My question was with rerence to your first response stating that "Spring aop uses proxy-base approach, i.e. it creates target bean and proxy for it as two distinct objects, hence, target bean class constructor is called twice. " With a reference to this statement i was wondering that when my target class is a singleton bean , how would it create another instance within the same container.

    I hope i am more clear now.

  8. #8
    Join Date
    May 2007
    Location
    Saint Petersburg, Russian Federation
    Posts
    1,189

    Default

    'Singleton' scope feature means that single object is used within the single bean definition. AOP doesn't break that - it created 'raw' bean and proxy but uses proxy in all places target bean definition is necessary.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •