WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Spring Framework · Intermediate · question 23 of 100

How can you create a custom scope for a Spring Bean?

📕 Buy this interview preparation book: 100 Spring Framework questions & answers — PDF + EPUB for $5

In Spring, a scope defines the lifecycle of a bean and determines how long the bean will stay in the memory. Along with the standard scopes provided by Spring, it is possible to create custom scopes. Custom scopes allow you to define your own lifecycle for a bean.

To create a custom scope for a Spring bean, you need to implement the ‘Scope‘ interface. The ‘Scope‘ interface has two methods that need to be implemented:

1. ‘String getConversationId()‘: This method should return a unique identifier for the current conversation.

2. ‘Object get(String name, ObjectFactory<?> objectFactory)‘: This method should return the object for the given name. If the object doesn’t exist, it should be created using the ‘ObjectFactory‘ parameter and stored in the scope.

Here’s an example of implementing the Scope interface to create a custom scope:

public class CustomScope implements Scope {

    private ConcurrentHashMap<String, Object> scope = new ConcurrentHashMap<>();

    @Override
    public Object get(String name, ObjectFactory<?> objectFactory) {
        if(!scope.contains(name)) {
            // Create a new instance if it doesn't exist
            scope.put(name, objectFactory.getObject());
        }
        return scope.get(name);
    }

    @Override
    public Object remove(String name) {
        return scope.remove(name);
    }

    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
         // register callback if needed
    }

    @Override
    public String getConversationId() {
        return UUID.randomUUID().toString();
    }
}

In this example, we create a custom scope using the ‘ConcurrentHashMap‘. In the ‘get()‘ method, we check if the object exists in the scope. If it doesn’t, we create and store a new instance using the ‘ObjectFactory‘ parameter. The ‘remove()‘ method removes the object from the scope, while ‘registerDestructionCallback()‘ registers a callback to destroy the object.

Once you have implemented the ‘Scope‘ interface, you need to register the custom scope with the ‘ConfigurableBeanFactory‘. Here’s an example of how to do this:

@Configuration
public class CustomScopeConfig {

   @Bean
   public CustomScope myCustomScope() {
       return new CustomScope();
   }

   @Autowired
   private CustomScope myCustomScope;

   @PostConstruct
   public void registerMyCustomScope() {
       ConfigurableBeanFactory beanFactory = (ConfigurableBeanFactory) context.getAutowireCapableBeanFactory();
       beanFactory.registerScope("myScope", myCustomScope);
   }
}

In this example, we create a configuration class that registers our custom scope with the ‘ConfigurableBeanFactory‘. We create an instance of our custom scope and register it with the bean factory using the ‘registerScope()‘ method. Now, we can use ‘"myScope"` as the scope of our beans when we define them. For example:

 @Bean
 @Scope("myScope")
 public MyCustomBean myCustomBean() {
     return new MyCustomBean();
 }

In this example, we have created a bean with the scope ‘"myScope"`. This makes Spring use our custom scope to determine the lifecycle of this bean.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Spring Framework interview — then scores it.
📞 Practice Spring Framework — free 15 min
📕 Buy this interview preparation book: 100 Spring Framework questions & answers — PDF + EPUB for $5

All 100 Spring Framework questions · All topics