Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom spring scopes?

Tags:

java

spring

Anyone know of any other custom spring scopes than Servlet Context Scope and ThreadScope ?

If you've made some closed-source custom scope I'd really also be interested in hearing what it does and how it worked out for you. (I'd imagine someone would make a WindowScope in a desktop app ?)

I'm open to all use cases, I'm looking to expand my horizon here.

like image 957
krosenvold Avatar asked Jan 16 '09 14:01

krosenvold


People also ask

Can we create custom scope in spring boot?

Spring provides a mechanism for creating custom scopes for scenarios such as this. In this quick tutorial, we will demonstrate how to create, register, and use a custom scope in a Spring application.

Are Spring beans thread-safe?

Is Spring singleton thread safe? The short answer is: no, it isn't. And you probably already know why. It's because of the long life cycle of singleton beans.


2 Answers

We implemented our own custom Spring scope. A lot of our code works at a relatively low level, close to the database, and we maintain a conceptual level on top of that with its own object model of data sources, links, attributes etc.

Anyway, a lot of beans require a so-called StorageDictionary (an encapsulation of this object graph) to do their work. When we make non-trivial changes to the object graph, the dictionary sometimes needs to be blown away and recreated. Consequently, we implemented a custom scope for objects that were dictionary scoped, and part of the invalidation of a given dictionary involves clearing this custom scope. This lets Spring handle a nice form of automatic caching for these objects. You get the same object back every time up until the dictionary is invalidated, at which point you get a new object.

This helps not only with consistency but also allows the objects themselves to cache references to entities within the dictionary, safe within the knowledge that the cache will be valid for as long as they themselves are retrievable by Spring. This in turn lets us build these as immutable objects (so long as they can be wired via constructor injection), which is a very good thing to do anyway wherever possible.

This technique won't work everywhere and does depend heavily on the characteristics of the software (e.g. if the dictionary was modified regularly this would be horribly inefficient, and if it was updated never this would be unnecessary and slightly less efficient than direct access). However, it has definitely helped us pass off this management of lifecycle to Spring in a way that is conceptually straightforward and in my opinion quite elegant.

like image 52
Andrzej Doyle Avatar answered Oct 16 '22 02:10

Andrzej Doyle


In my company we've created two custom scopes, one that will use Thread or Request and another that will use either Thread or Session. The idea is that a single scope can be used for scoped beans without having to change configuration based on the execution environment (JUnit or Servlet container). This also really comes in handy for when you run items in Quartz and no longer have a Request or Session scope available.

like image 31
cliff.meyers Avatar answered Oct 16 '22 04:10

cliff.meyers