Hi John!

Summary: we use it as iterable

Long story for completeness:

Basically we get a thing from our business partner (inputThing) and map it
to our representation of thing (ProcessedThing)

Each ThingCriterion can veto the processedThing and then they used
inputThing to print a pretty error message. When the Thing is enhanced
(happens all the time) we implement new ThingCriterion  and they get picked
up automatically...



    @Inject
    private Instance<ThingCriterion> thingCriteria;


    public List<ValidationProblem> validateList(final ProcessedThing thing,
final InputThing inputThing) {
        List<ValidationProblem> results = new ArrayList<>();
        for (final ThingCriterion criterion : thingCriteria) {
            results.addAll(criterion.validate(thing, inputThing));
        }
        return results;
    }


Romain,

Thanks for your help. Great suggestion will it have better perf then just
putting @ApplicationScoped on my ThingCriterion beans? Probably not
important just curious.

cheers

On 27 February 2015 at 19:25, Romain Manni-Bucau <[email protected]>
wrote:

> When I used this pattern I always did (for perf reason but side effect is
>  behavior is what you want):
>
> @PostConstruct
> private void resolve() {
>    value = instance......get();
> }
>
> then in the code don't use instance at all but value.
>
>
>
> 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>
>
> 2015-02-27 19:15 GMT+01:00 John D. Ament <[email protected]>:
>
>> Are you calling get() on the Instance with each request (or whatever0
>> that comes into this bean?
>>
>> On Fri, Feb 27, 2015 at 1:13 PM Karl Kildén <[email protected]>
>> wrote:
>>
>>> To explain myself further ALL I had on my heap was my
>>> Instance<MyInterface>... and gc released 0.5% memory :)
>>>
>>> I had 200 000 of them at least. They where supposed to be four
>>> singletons. My idea was inject into @ApplicationScoped and omit to give
>>> them scope because they will be @ApplicationScoped anyways... Seems every
>>> invocation of my @ApplicationScoped bean recreated all instances.
>>>
>>> What I had was unrecoverable mem leak. Now I could be doing something
>>> stupid or Instance<MyInterface> has a problem or something else...
>>>
>>> Cheers
>>>
>>>
>>>
>>> On 27 February 2015 at 19:05, Romain Manni-Bucau <[email protected]>
>>> wrote:
>>>
>>>> If dependent it will be kept in enclosing bean.
>>>>  Le 27 févr. 2015 19:00, "Lars-Fredrik Smedberg" <[email protected]>
>>>> a écrit :
>>>>
>>>> So does this mean that there will be a memory leak in the case Karl
>>>>> described?
>>>>>
>>>>> I have used similar constructs before so im curios (@Inject @Provider
>>>>> <some dep scoped bean> in an @ApplicationScoped bean and called get () on
>>>>> the injected provider).
>>>>>
>>>>> I thought for a while that it might get garbage collected when the
>>>>> created bean is outof scope or maybe then there is no way for @PreDestroy
>>>>> to be called?
>>>>>
>>>>> Regards
>>>>> LF
>>>>>
>>>>> I thought that the created dep scoped bean would be
>>>>> On Feb 27, 2015 6:07 PM, "Romain Manni-Bucau" <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> Yes.
>>>>>>
>>>>>> Will be destoyed with the bean where it is injected IIRC so the app
>>>>>> here.
>>>>>> Le 27 févr. 2015 16:59, <[email protected]> a écrit :
>>>>>>
>>>>>>> Hello! I have a bean with @ApplicationScoped. When I inject
>>>>>>> Instance<MyInterface> instance and my actual beans implementing 
>>>>>>> MyInstance
>>>>>>> are dependentscoped they get recreated over and over and are not gc'd.
>>>>>>>
>>>>>>> Expected behavior?
>>>>>>>
>>>>>>> Cheers
>>>>>>
>>>>>>
>>>
>

Reply via email to