spring-012: entire-spring-bean-lifecycle-from-registration-to-destruction-with-sample-examples

Here I systematically explore Spring’s lifecycle methods by implementing them one by one in a structured way


Step 1: Understanding registerBeanDefinition() in Practice

We are starting with how Spring registers bean definitions before instantiation using BeanDefinitionRegistry.


What Happens at This Stage?

  • Spring loads and registers bean definitions from:
    • @ComponentScan
    • @Bean methods inside @Configuration
    • XML-based configuration (if used)
  • At this point, no beans are instantiated yet! Spring is just storing the metadata about each bean.

Practical Example: Registering a Bean Manually

  1. We define a class CustomBeanRegistrar that implements BeanDefinitionRegistryPostProcessor.
  2. Inside postProcessBeanDefinitionRegistry(), we register a bean definition manually.
  3. We create a bean class (MyDynamicBean) that will be instantiated when accessed.
<span>@Configuration</span>
<span>public</span> <span>class</span> <span>CustomBeanRegistrar</span> <span>implements</span> <span>BeanDefinitionRegistryPostProcessor</span> <span>{</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>postProcessBeanDefinitionRegistry</span><span>(</span><span>BeanDefinitionRegistry</span> <span>registry</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>// Define a new bean manually</span>
<span>GenericBeanDefinition</span> <span>beanDefinition</span> <span>=</span> <span>new</span> <span>GenericBeanDefinition</span><span>();</span>
<span>beanDefinition</span><span>.</span><span>setBeanClass</span><span>(</span><span>MyDynamicBean</span><span>.</span><span>class</span><span>);</span>
<span>registry</span><span>.</span><span>registerBeanDefinition</span><span>(</span><span>"myDynamicBean"</span><span>,</span> <span>beanDefinition</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Custom bean definition registered: MyDynamicBean"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>postProcessBeanFactory</span><span>(</span><span>ConfigurableListableBeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>// Not needed for this example</span>
<span>}</span>
<span>}</span>
<span>@Configuration</span>
<span>public</span> <span>class</span> <span>CustomBeanRegistrar</span> <span>implements</span> <span>BeanDefinitionRegistryPostProcessor</span> <span>{</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>postProcessBeanDefinitionRegistry</span><span>(</span><span>BeanDefinitionRegistry</span> <span>registry</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
        <span>// Define a new bean manually</span>
        <span>GenericBeanDefinition</span> <span>beanDefinition</span> <span>=</span> <span>new</span> <span>GenericBeanDefinition</span><span>();</span>
        <span>beanDefinition</span><span>.</span><span>setBeanClass</span><span>(</span><span>MyDynamicBean</span><span>.</span><span>class</span><span>);</span>
        <span>registry</span><span>.</span><span>registerBeanDefinition</span><span>(</span><span>"myDynamicBean"</span><span>,</span> <span>beanDefinition</span><span>);</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Custom bean definition registered: MyDynamicBean"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>postProcessBeanFactory</span><span>(</span><span>ConfigurableListableBeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
        <span>// Not needed for this example</span>
    <span>}</span>
<span>}</span>
@Configuration public class CustomBeanRegistrar implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { // Define a new bean manually GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setBeanClass(MyDynamicBean.class); registry.registerBeanDefinition("myDynamicBean", beanDefinition); System.out.println("Custom bean definition registered: MyDynamicBean"); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // Not needed for this example } }

Enter fullscreen mode Exit fullscreen mode


Key Takeaways

This method is used to dynamically register beans (e.g., based on conditions, external configs).

At this stage, beans are just “blueprints”—actual instances are not created yet.

Best Practice: Only use this when dynamic bean registration is needed (e.g., custom plugins).


Step 2: Understanding postProcessBeforeInstantiation()

Now that we’ve covered bean definition registration, the next lifecycle method is InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation().


What Happens at This Stage?

  • This method runs before the actual instantiation of a bean.
  • It allows you to:
    • Modify or replace the bean instance before it is created.
    • Prevent normal instantiation by returning a proxy or a custom instance.

Practical Example: Intercepting Bean Instantiation

We’ve implemented InstantiationAwareBeanPostProcessor to log when this method is called.

<span>@Component</span>
<span>class</span> <span>CustomInstantiationAwareBeanPostProcessor</span> <span>implements</span> <span>InstantiationAwareBeanPostProcessor</span> <span>{</span>
<span>@Override</span>
<span>public</span> <span>Object</span> <span>postProcessBeforeInstantiation</span><span>(</span><span>Class</span><span><?></span> <span>beanClass</span><span>,</span> <span>String</span> <span>beanName</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Before instantiating bean: "</span> <span>+</span> <span>beanName</span><span>);</span>
<span>return</span> <span>null</span><span>;</span> <span>// Returning null allows normal instantiation</span>
<span>}</span>
<span>}</span>
<span>@Component</span>
<span>class</span> <span>CustomInstantiationAwareBeanPostProcessor</span> <span>implements</span> <span>InstantiationAwareBeanPostProcessor</span> <span>{</span>
    <span>@Override</span>
    <span>public</span> <span>Object</span> <span>postProcessBeforeInstantiation</span><span>(</span><span>Class</span><span><?></span> <span>beanClass</span><span>,</span> <span>String</span> <span>beanName</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Before instantiating bean: "</span> <span>+</span> <span>beanName</span><span>);</span>
        <span>return</span> <span>null</span><span>;</span> <span>// Returning null allows normal instantiation</span>
    <span>}</span>
<span>}</span>
@Component class CustomInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor { @Override public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { System.out.println("Before instantiating bean: " + beanName); return null; // Returning null allows normal instantiation } }

Enter fullscreen mode Exit fullscreen mode

Key Observations

This method executes before the constructor is called.

You can return a different instance instead of allowing the default instantiation.

Best Practice: Use it for AOP (Aspect-Oriented Programming) scenarios like creating proxies.


Step 3: Understanding setBeanName()

Now that we’ve covered postProcessBeforeInstantiation(), the next lifecycle method is BeanNameAware#setBeanName().


What Happens at This Stage?

  • After the bean is instantiated, Spring calls setBeanName().
  • This allows the bean to know its own name in the application context.
  • This happens before dependency injection.

Practical Example: Bean Recognizing Its Own Name

We’ve extended the existing application to include BeanNameAware inside MyDynamicBean:

<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span> <span>{</span>
<span>private</span> <span>String</span> <span>beanName</span><span>;</span>
<span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span> <span>{</span>
    <span>private</span> <span>String</span> <span>beanName</span><span>;</span>

    <span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
    <span>}</span>
<span>}</span>
class MyDynamicBean implements BeanNameAware { private String beanName; public MyDynamicBean() { System.out.println("MyDynamicBean instantiated!"); } @Override public void setBeanName(String name) { this.beanName = name; System.out.println("Bean name set: " + name); } }

Enter fullscreen mode Exit fullscreen mode

Key Observations

The method is called immediately after instantiation.

The bean can store its own name for later use.

Best Practice: Use this when the bean needs to log or manipulate its own name.


Step 4: Understanding setBeanClassLoader()

Now that we’ve covered setBeanName(), the next lifecycle method is BeanClassLoaderAware#setBeanClassLoader().


What Happens at This Stage?

  • After setting the bean name, Spring calls setBeanClassLoader(ClassLoader classLoader).
  • This method allows the bean to access the ClassLoader that loaded it.
  • The ClassLoader is responsible for loading classes into memory.

Practical Example: Accessing Bean ClassLoader

We’ve extended our MyDynamicBean class to implement BeanClassLoaderAware:

<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span> <span>{</span>
<span>private</span> <span>String</span> <span>beanName</span><span>;</span>
<span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
<span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span> <span>{</span>
    <span>private</span> <span>String</span> <span>beanName</span><span>;</span>
    <span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>

    <span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
    <span>}</span>
<span>}</span>
class MyDynamicBean implements BeanNameAware, BeanClassLoaderAware { private String beanName; private ClassLoader classLoader; public MyDynamicBean() { System.out.println("MyDynamicBean instantiated!"); } @Override public void setBeanName(String name) { this.beanName = name; System.out.println("Bean name set: " + name); } @Override public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; System.out.println("Bean ClassLoader set: " + classLoader); } }

Enter fullscreen mode Exit fullscreen mode

Key Observations

The setBeanClassLoader() method is called after setBeanName().

The ClassLoader allows the bean to dynamically load classes at runtime.

Best Practice: Use it when you need to load classes dynamically (e.g., plugins, external dependencies).


Step 5: Understanding setBeanFactory()

Now that we’ve covered setBeanClassLoader(), the next lifecycle method is BeanFactoryAware#setBeanFactory().


What Happens at This Stage?

  • After setting the bean name and class loader, Spring calls setBeanFactory().
  • This method provides access to the BeanFactory, which is the core Spring container that holds all bean instances.
  • The bean can now programmatically retrieve other beans from the factory.

Practical Example: Accessing the BeanFactory

We’ve extended MyDynamicBean to implement BeanFactoryAware:

<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span><span>,</span> <span>BeanFactoryAware</span> <span>{</span>
<span>private</span> <span>String</span> <span>beanName</span><span>;</span>
<span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
<span>private</span> <span>BeanFactory</span> <span>beanFactory</span><span>;</span>
<span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanFactory</span><span>(</span><span>BeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>this</span><span>.</span><span>beanFactory</span> <span>=</span> <span>beanFactory</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"BeanFactory set: "</span> <span>+</span> <span>beanFactory</span><span>);</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span><span>,</span> <span>BeanFactoryAware</span> <span>{</span>
    <span>private</span> <span>String</span> <span>beanName</span><span>;</span>
    <span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
    <span>private</span> <span>BeanFactory</span> <span>beanFactory</span><span>;</span>

    <span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanFactory</span><span>(</span><span>BeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
        <span>this</span><span>.</span><span>beanFactory</span> <span>=</span> <span>beanFactory</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"BeanFactory set: "</span> <span>+</span> <span>beanFactory</span><span>);</span>
    <span>}</span>
<span>}</span>
class MyDynamicBean implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware { private String beanName; private ClassLoader classLoader; private BeanFactory beanFactory; public MyDynamicBean() { System.out.println("MyDynamicBean instantiated!"); } @Override public void setBeanName(String name) { this.beanName = name; System.out.println("Bean name set: " + name); } @Override public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; System.out.println("Bean ClassLoader set: " + classLoader); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; System.out.println("BeanFactory set: " + beanFactory); } }

Enter fullscreen mode Exit fullscreen mode


Key Observations

The setBeanFactory() method is called after setBeanClassLoader().

The BeanFactory allows beans to retrieve other beans programmatically.

Best Practice: Use dependency injection (@Autowired) instead of directly accessing BeanFactory, unless you need dynamic lookups.


Step 6: Understanding setEnvironment()

Now that we’ve covered setBeanFactory(), the next lifecycle method is EnvironmentAware#setEnvironment().


What Happens at This Stage?

  • After setting bean factory access, Spring calls setEnvironment().
  • This method allows the bean to access environment properties, such as:
    • System properties (System.getProperty("key"))
    • Application properties (application.properties / application.yml)
    • Profiles (spring.profiles.active)
    • Other configurable settings.

Practical Example: Accessing Environment Variables

We’ve extended MyDynamicBean to implement EnvironmentAware:

<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span><span>,</span> <span>BeanFactoryAware</span><span>,</span> <span>EnvironmentAware</span> <span>{</span>
<span>private</span> <span>String</span> <span>beanName</span><span>;</span>
<span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
<span>private</span> <span>BeanFactory</span> <span>beanFactory</span><span>;</span>
<span>private</span> <span>Environment</span> <span>environment</span><span>;</span>
<span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanFactory</span><span>(</span><span>BeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>this</span><span>.</span><span>beanFactory</span> <span>=</span> <span>beanFactory</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"BeanFactory set: "</span> <span>+</span> <span>beanFactory</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setEnvironment</span><span>(</span><span>Environment</span> <span>environment</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>environment</span> <span>=</span> <span>environment</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Environment set: "</span> <span>+</span> <span>environment</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Active Profile: "</span> <span>+</span> <span>environment</span><span>.</span><span>getActiveProfiles</span><span>());</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Server Port: "</span> <span>+</span> <span>environment</span><span>.</span><span>getProperty</span><span>(</span><span>"server.port"</span><span>));</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span><span>,</span> <span>BeanFactoryAware</span><span>,</span> <span>EnvironmentAware</span> <span>{</span>
    <span>private</span> <span>String</span> <span>beanName</span><span>;</span>
    <span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
    <span>private</span> <span>BeanFactory</span> <span>beanFactory</span><span>;</span>
    <span>private</span> <span>Environment</span> <span>environment</span><span>;</span>

    <span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanFactory</span><span>(</span><span>BeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
        <span>this</span><span>.</span><span>beanFactory</span> <span>=</span> <span>beanFactory</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"BeanFactory set: "</span> <span>+</span> <span>beanFactory</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setEnvironment</span><span>(</span><span>Environment</span> <span>environment</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>environment</span> <span>=</span> <span>environment</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Environment set: "</span> <span>+</span> <span>environment</span><span>);</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Active Profile: "</span> <span>+</span> <span>environment</span><span>.</span><span>getActiveProfiles</span><span>());</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Server Port: "</span> <span>+</span> <span>environment</span><span>.</span><span>getProperty</span><span>(</span><span>"server.port"</span><span>));</span>
    <span>}</span>
<span>}</span>
class MyDynamicBean implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, EnvironmentAware { private String beanName; private ClassLoader classLoader; private BeanFactory beanFactory; private Environment environment; public MyDynamicBean() { System.out.println("MyDynamicBean instantiated!"); } @Override public void setBeanName(String name) { this.beanName = name; System.out.println("Bean name set: " + name); } @Override public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; System.out.println("Bean ClassLoader set: " + classLoader); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; System.out.println("BeanFactory set: " + beanFactory); } @Override public void setEnvironment(Environment environment) { this.environment = environment; System.out.println("Environment set: " + environment); System.out.println("Active Profile: " + environment.getActiveProfiles()); System.out.println("Server Port: " + environment.getProperty("server.port")); } }

Enter fullscreen mode Exit fullscreen mode


Key Observations

The setEnvironment() method is called after setBeanFactory().

The environment allows access to application properties and profiles.

Best Practice: Use it when a bean needs to read environment properties dynamically.


Step 7: Understanding setEmbeddedValueResolver()

Now that we’ve covered setEnvironment(), the next lifecycle method is EmbeddedValueResolverAware#setEmbeddedValueResolver().


What Happens at This Stage?

  • After setting environment access, Spring calls setEmbeddedValueResolver().
  • This method provides a StringValueResolver that allows resolving embedded placeholders (e.g., ${server.port} or #{expression}).
  • Useful when dealing with property placeholders or Spring Expression Language (SpEL).

Practical Example: Resolving Embedded Placeholders

We’ve extended MyDynamicBean to implement EmbeddedValueResolverAware:

<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span><span>,</span> <span>BeanFactoryAware</span><span>,</span> <span>EnvironmentAware</span><span>,</span> <span>EmbeddedValueResolverAware</span> <span>{</span>
<span>private</span> <span>String</span> <span>beanName</span><span>;</span>
<span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
<span>private</span> <span>BeanFactory</span> <span>beanFactory</span><span>;</span>
<span>private</span> <span>Environment</span> <span>environment</span><span>;</span>
<span>private</span> <span>StringValueResolver</span> <span>valueResolver</span><span>;</span>
<span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanFactory</span><span>(</span><span>BeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>this</span><span>.</span><span>beanFactory</span> <span>=</span> <span>beanFactory</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"BeanFactory set: "</span> <span>+</span> <span>beanFactory</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setEnvironment</span><span>(</span><span>Environment</span> <span>environment</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>environment</span> <span>=</span> <span>environment</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Environment set: "</span> <span>+</span> <span>environment</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Active Profile: "</span> <span>+</span> <span>environment</span><span>.</span><span>getActiveProfiles</span><span>());</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Server Port: "</span> <span>+</span> <span>environment</span><span>.</span><span>getProperty</span><span>(</span><span>"server.port"</span><span>));</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setEmbeddedValueResolver</span><span>(</span><span>StringValueResolver</span> <span>resolver</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>valueResolver</span> <span>=</span> <span>resolver</span><span>;</span>
<span>String</span> <span>resolvedValue</span> <span>=</span> <span>valueResolver</span><span>.</span><span>resolveStringValue</span><span>(</span><span>"${server.port}"</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Embedded Value Resolved: "</span> <span>+</span> <span>resolvedValue</span><span>);</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span><span>,</span> <span>BeanFactoryAware</span><span>,</span> <span>EnvironmentAware</span><span>,</span> <span>EmbeddedValueResolverAware</span> <span>{</span>
    <span>private</span> <span>String</span> <span>beanName</span><span>;</span>
    <span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
    <span>private</span> <span>BeanFactory</span> <span>beanFactory</span><span>;</span>
    <span>private</span> <span>Environment</span> <span>environment</span><span>;</span>
    <span>private</span> <span>StringValueResolver</span> <span>valueResolver</span><span>;</span>

    <span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanFactory</span><span>(</span><span>BeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
        <span>this</span><span>.</span><span>beanFactory</span> <span>=</span> <span>beanFactory</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"BeanFactory set: "</span> <span>+</span> <span>beanFactory</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setEnvironment</span><span>(</span><span>Environment</span> <span>environment</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>environment</span> <span>=</span> <span>environment</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Environment set: "</span> <span>+</span> <span>environment</span><span>);</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Active Profile: "</span> <span>+</span> <span>environment</span><span>.</span><span>getActiveProfiles</span><span>());</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Server Port: "</span> <span>+</span> <span>environment</span><span>.</span><span>getProperty</span><span>(</span><span>"server.port"</span><span>));</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setEmbeddedValueResolver</span><span>(</span><span>StringValueResolver</span> <span>resolver</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>valueResolver</span> <span>=</span> <span>resolver</span><span>;</span>
        <span>String</span> <span>resolvedValue</span> <span>=</span> <span>valueResolver</span><span>.</span><span>resolveStringValue</span><span>(</span><span>"${server.port}"</span><span>);</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Embedded Value Resolved: "</span> <span>+</span> <span>resolvedValue</span><span>);</span>
    <span>}</span>
<span>}</span>
class MyDynamicBean implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, EnvironmentAware, EmbeddedValueResolverAware { private String beanName; private ClassLoader classLoader; private BeanFactory beanFactory; private Environment environment; private StringValueResolver valueResolver; public MyDynamicBean() { System.out.println("MyDynamicBean instantiated!"); } @Override public void setBeanName(String name) { this.beanName = name; System.out.println("Bean name set: " + name); } @Override public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; System.out.println("Bean ClassLoader set: " + classLoader); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; System.out.println("BeanFactory set: " + beanFactory); } @Override public void setEnvironment(Environment environment) { this.environment = environment; System.out.println("Environment set: " + environment); System.out.println("Active Profile: " + environment.getActiveProfiles()); System.out.println("Server Port: " + environment.getProperty("server.port")); } @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { this.valueResolver = resolver; String resolvedValue = valueResolver.resolveStringValue("${server.port}"); System.out.println("Embedded Value Resolved: " + resolvedValue); } }

Enter fullscreen mode Exit fullscreen mode


Key Observations

The setEmbeddedValueResolver() method is called after setEnvironment().

Allows resolving placeholders like ${property.name} dynamically.

Best Practice: Use this when a bean needs to dynamically resolve properties or SpEL expressions.


Step 8: Understanding setResourceLoader()

Now that we’ve covered setEmbeddedValueResolver(), the next lifecycle method is ResourceLoaderAware#setResourceLoader().


What Happens at This Stage?

  • After setting the embedded value resolver, Spring calls setResourceLoader().
  • This method provides a ResourceLoader, which allows loading external resources such as:
    • Files from the classpath (classpath:/config.xml)
    • Files from the file system (file:/tmp/config.xml)
    • URLs (https://example.com/config.xml)

Practical Example: Accessing Resources

We’ve extended MyDynamicBean to implement ResourceLoaderAware:

<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span><span>,</span> <span>BeanFactoryAware</span><span>,</span> <span>EnvironmentAware</span><span>,</span> <span>EmbeddedValueResolverAware</span><span>,</span> <span>ResourceLoaderAware</span> <span>{</span>
<span>private</span> <span>String</span> <span>beanName</span><span>;</span>
<span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
<span>private</span> <span>BeanFactory</span> <span>beanFactory</span><span>;</span>
<span>private</span> <span>Environment</span> <span>environment</span><span>;</span>
<span>private</span> <span>StringValueResolver</span> <span>valueResolver</span><span>;</span>
<span>private</span> <span>ResourceLoader</span> <span>resourceLoader</span><span>;</span>
<span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanFactory</span><span>(</span><span>BeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>this</span><span>.</span><span>beanFactory</span> <span>=</span> <span>beanFactory</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"BeanFactory set: "</span> <span>+</span> <span>beanFactory</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setEnvironment</span><span>(</span><span>Environment</span> <span>environment</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>environment</span> <span>=</span> <span>environment</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Environment set: "</span> <span>+</span> <span>environment</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Active Profile: "</span> <span>+</span> <span>environment</span><span>.</span><span>getActiveProfiles</span><span>());</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Server Port: "</span> <span>+</span> <span>environment</span><span>.</span><span>getProperty</span><span>(</span><span>"server.port"</span><span>));</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setEmbeddedValueResolver</span><span>(</span><span>StringValueResolver</span> <span>resolver</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>valueResolver</span> <span>=</span> <span>resolver</span><span>;</span>
<span>String</span> <span>resolvedValue</span> <span>=</span> <span>valueResolver</span><span>.</span><span>resolveStringValue</span><span>(</span><span>"${server.port}"</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Embedded Value Resolved: "</span> <span>+</span> <span>resolvedValue</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setResourceLoader</span><span>(</span><span>ResourceLoader</span> <span>resourceLoader</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>resourceLoader</span> <span>=</span> <span>resourceLoader</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"ResourceLoader set: "</span> <span>+</span> <span>resourceLoader</span><span>);</span>
<span>// Example usage: Load a file from classpath</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Loading resource example: "</span> <span>+</span> <span>resourceLoader</span><span>.</span><span>getResource</span><span>(</span><span>"classpath:application.properties"</span><span>).</span><span>exists</span><span>());</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span><span>,</span> <span>BeanFactoryAware</span><span>,</span> <span>EnvironmentAware</span><span>,</span> <span>EmbeddedValueResolverAware</span><span>,</span> <span>ResourceLoaderAware</span> <span>{</span>
    <span>private</span> <span>String</span> <span>beanName</span><span>;</span>
    <span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
    <span>private</span> <span>BeanFactory</span> <span>beanFactory</span><span>;</span>
    <span>private</span> <span>Environment</span> <span>environment</span><span>;</span>
    <span>private</span> <span>StringValueResolver</span> <span>valueResolver</span><span>;</span>
    <span>private</span> <span>ResourceLoader</span> <span>resourceLoader</span><span>;</span>

    <span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanFactory</span><span>(</span><span>BeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
        <span>this</span><span>.</span><span>beanFactory</span> <span>=</span> <span>beanFactory</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"BeanFactory set: "</span> <span>+</span> <span>beanFactory</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setEnvironment</span><span>(</span><span>Environment</span> <span>environment</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>environment</span> <span>=</span> <span>environment</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Environment set: "</span> <span>+</span> <span>environment</span><span>);</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Active Profile: "</span> <span>+</span> <span>environment</span><span>.</span><span>getActiveProfiles</span><span>());</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Server Port: "</span> <span>+</span> <span>environment</span><span>.</span><span>getProperty</span><span>(</span><span>"server.port"</span><span>));</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setEmbeddedValueResolver</span><span>(</span><span>StringValueResolver</span> <span>resolver</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>valueResolver</span> <span>=</span> <span>resolver</span><span>;</span>
        <span>String</span> <span>resolvedValue</span> <span>=</span> <span>valueResolver</span><span>.</span><span>resolveStringValue</span><span>(</span><span>"${server.port}"</span><span>);</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Embedded Value Resolved: "</span> <span>+</span> <span>resolvedValue</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setResourceLoader</span><span>(</span><span>ResourceLoader</span> <span>resourceLoader</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>resourceLoader</span> <span>=</span> <span>resourceLoader</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"ResourceLoader set: "</span> <span>+</span> <span>resourceLoader</span><span>);</span>

        <span>// Example usage: Load a file from classpath</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Loading resource example: "</span> <span>+</span> <span>resourceLoader</span><span>.</span><span>getResource</span><span>(</span><span>"classpath:application.properties"</span><span>).</span><span>exists</span><span>());</span>
    <span>}</span>
<span>}</span>
class MyDynamicBean implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, EnvironmentAware, EmbeddedValueResolverAware, ResourceLoaderAware { private String beanName; private ClassLoader classLoader; private BeanFactory beanFactory; private Environment environment; private StringValueResolver valueResolver; private ResourceLoader resourceLoader; public MyDynamicBean() { System.out.println("MyDynamicBean instantiated!"); } @Override public void setBeanName(String name) { this.beanName = name; System.out.println("Bean name set: " + name); } @Override public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; System.out.println("Bean ClassLoader set: " + classLoader); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; System.out.println("BeanFactory set: " + beanFactory); } @Override public void setEnvironment(Environment environment) { this.environment = environment; System.out.println("Environment set: " + environment); System.out.println("Active Profile: " + environment.getActiveProfiles()); System.out.println("Server Port: " + environment.getProperty("server.port")); } @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { this.valueResolver = resolver; String resolvedValue = valueResolver.resolveStringValue("${server.port}"); System.out.println("Embedded Value Resolved: " + resolvedValue); } @Override public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; System.out.println("ResourceLoader set: " + resourceLoader); // Example usage: Load a file from classpath System.out.println("Loading resource example: " + resourceLoader.getResource("classpath:application.properties").exists()); } }

Enter fullscreen mode Exit fullscreen mode


Key Observations

The setResourceLoader() method is called after setEmbeddedValueResolver().

The ResourceLoader allows loading external files dynamically.

Best Practice: Use ResourceLoader when a bean needs to load external configurations or static assets.


Step 9: Understanding setApplicationEventPublisher()

Now that we’ve covered setResourceLoader(), the next lifecycle method is ApplicationEventPublisherAware#setApplicationEventPublisher().


What Happens at This Stage?

  • After setting the resource loader, Spring calls setApplicationEventPublisher().
  • This method provides an ApplicationEventPublisher, which allows the bean to:
    • Publish custom application events.
    • Trigger event-driven components (such as @EventListener).

Practical Example: Publishing an Event

We’ve extended MyDynamicBean to implement ApplicationEventPublisherAware:

<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span><span>,</span> <span>BeanFactoryAware</span><span>,</span> <span>EnvironmentAware</span><span>,</span> <span>EmbeddedValueResolverAware</span><span>,</span> <span>ResourceLoaderAware</span><span>,</span> <span>ApplicationEventPublisherAware</span> <span>{</span>
<span>private</span> <span>String</span> <span>beanName</span><span>;</span>
<span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
<span>private</span> <span>BeanFactory</span> <span>beanFactory</span><span>;</span>
<span>private</span> <span>Environment</span> <span>environment</span><span>;</span>
<span>private</span> <span>StringValueResolver</span> <span>valueResolver</span><span>;</span>
<span>private</span> <span>ResourceLoader</span> <span>resourceLoader</span><span>;</span>
<span>private</span> <span>ApplicationEventPublisher</span> <span>eventPublisher</span><span>;</span>
<span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setBeanFactory</span><span>(</span><span>BeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>this</span><span>.</span><span>beanFactory</span> <span>=</span> <span>beanFactory</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"BeanFactory set: "</span> <span>+</span> <span>beanFactory</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setEnvironment</span><span>(</span><span>Environment</span> <span>environment</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>environment</span> <span>=</span> <span>environment</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Environment set: "</span> <span>+</span> <span>environment</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Active Profile: "</span> <span>+</span> <span>environment</span><span>.</span><span>getActiveProfiles</span><span>());</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Server Port: "</span> <span>+</span> <span>environment</span><span>.</span><span>getProperty</span><span>(</span><span>"server.port"</span><span>));</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setEmbeddedValueResolver</span><span>(</span><span>StringValueResolver</span> <span>resolver</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>valueResolver</span> <span>=</span> <span>resolver</span><span>;</span>
<span>String</span> <span>resolvedValue</span> <span>=</span> <span>valueResolver</span><span>.</span><span>resolveStringValue</span><span>(</span><span>"${server.port}"</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Embedded Value Resolved: "</span> <span>+</span> <span>resolvedValue</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setResourceLoader</span><span>(</span><span>ResourceLoader</span> <span>resourceLoader</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>resourceLoader</span> <span>=</span> <span>resourceLoader</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"ResourceLoader set: "</span> <span>+</span> <span>resourceLoader</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Loading resource example: "</span> <span>+</span> <span>resourceLoader</span><span>.</span><span>getResource</span><span>(</span><span>"classpath:application.properties"</span><span>).</span><span>exists</span><span>());</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setApplicationEventPublisher</span><span>(</span><span>ApplicationEventPublisher</span> <span>eventPublisher</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>eventPublisher</span> <span>=</span> <span>eventPublisher</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"ApplicationEventPublisher set: "</span> <span>+</span> <span>eventPublisher</span><span>);</span>
<span>// Publish a custom event</span>
<span>eventPublisher</span><span>.</span><span>publishEvent</span><span>(</span><span>new</span> <span>CustomEvent</span><span>(</span><span>this</span><span>,</span> <span>"Test Event Message"</span><span>));</span>
<span>}</span>
<span>}</span>
<span>// Custom Event Class</span>
<span>class</span> <span>CustomEvent</span> <span>extends</span> <span>org</span><span>.</span><span>springframework</span><span>.</span><span>context</span><span>.</span><span>ApplicationEvent</span> <span>{</span>
<span>private</span> <span>final</span> <span>String</span> <span>message</span><span>;</span>
<span>public</span> <span>CustomEvent</span><span>(</span><span>Object</span> <span>source</span><span>,</span> <span>String</span> <span>message</span><span>)</span> <span>{</span>
<span>super</span><span>(</span><span>source</span><span>);</span>
<span>this</span><span>.</span><span>message</span> <span>=</span> <span>message</span><span>;</span>
<span>}</span>
<span>public</span> <span>String</span> <span>getMessage</span><span>()</span> <span>{</span>
<span>return</span> <span>message</span><span>;</span>
<span>}</span>
<span>}</span>
<span>// Listener for Custom Events</span>
<span>@Component</span>
<span>class</span> <span>CustomEventListener</span> <span>{</span>
<span>@org</span><span>.</span><span>springframework</span><span>.</span><span>context</span><span>.</span><span>event</span><span>.</span><span>EventListener</span>
<span>public</span> <span>void</span> <span>handleCustomEvent</span><span>(</span><span>CustomEvent</span> <span>event</span><span>)</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Received Custom Event: "</span> <span>+</span> <span>event</span><span>.</span><span>getMessage</span><span>());</span>
<span>}</span>
<span>}</span>
<span>class</span> <span>MyDynamicBean</span> <span>implements</span> <span>BeanNameAware</span><span>,</span> <span>BeanClassLoaderAware</span><span>,</span> <span>BeanFactoryAware</span><span>,</span> <span>EnvironmentAware</span><span>,</span> <span>EmbeddedValueResolverAware</span><span>,</span> <span>ResourceLoaderAware</span><span>,</span> <span>ApplicationEventPublisherAware</span> <span>{</span>
    <span>private</span> <span>String</span> <span>beanName</span><span>;</span>
    <span>private</span> <span>ClassLoader</span> <span>classLoader</span><span>;</span>
    <span>private</span> <span>BeanFactory</span> <span>beanFactory</span><span>;</span>
    <span>private</span> <span>Environment</span> <span>environment</span><span>;</span>
    <span>private</span> <span>StringValueResolver</span> <span>valueResolver</span><span>;</span>
    <span>private</span> <span>ResourceLoader</span> <span>resourceLoader</span><span>;</span>
    <span>private</span> <span>ApplicationEventPublisher</span> <span>eventPublisher</span><span>;</span>

    <span>public</span> <span>MyDynamicBean</span><span>()</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MyDynamicBean instantiated!"</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanName</span><span>(</span><span>String</span> <span>name</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>beanName</span> <span>=</span> <span>name</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean name set: "</span> <span>+</span> <span>name</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanClassLoader</span><span>(</span><span>ClassLoader</span> <span>classLoader</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>classLoader</span> <span>=</span> <span>classLoader</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Bean ClassLoader set: "</span> <span>+</span> <span>classLoader</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setBeanFactory</span><span>(</span><span>BeanFactory</span> <span>beanFactory</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
        <span>this</span><span>.</span><span>beanFactory</span> <span>=</span> <span>beanFactory</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"BeanFactory set: "</span> <span>+</span> <span>beanFactory</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setEnvironment</span><span>(</span><span>Environment</span> <span>environment</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>environment</span> <span>=</span> <span>environment</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Environment set: "</span> <span>+</span> <span>environment</span><span>);</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Active Profile: "</span> <span>+</span> <span>environment</span><span>.</span><span>getActiveProfiles</span><span>());</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Server Port: "</span> <span>+</span> <span>environment</span><span>.</span><span>getProperty</span><span>(</span><span>"server.port"</span><span>));</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setEmbeddedValueResolver</span><span>(</span><span>StringValueResolver</span> <span>resolver</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>valueResolver</span> <span>=</span> <span>resolver</span><span>;</span>
        <span>String</span> <span>resolvedValue</span> <span>=</span> <span>valueResolver</span><span>.</span><span>resolveStringValue</span><span>(</span><span>"${server.port}"</span><span>);</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Embedded Value Resolved: "</span> <span>+</span> <span>resolvedValue</span><span>);</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setResourceLoader</span><span>(</span><span>ResourceLoader</span> <span>resourceLoader</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>resourceLoader</span> <span>=</span> <span>resourceLoader</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"ResourceLoader set: "</span> <span>+</span> <span>resourceLoader</span><span>);</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Loading resource example: "</span> <span>+</span> <span>resourceLoader</span><span>.</span><span>getResource</span><span>(</span><span>"classpath:application.properties"</span><span>).</span><span>exists</span><span>());</span>
    <span>}</span>

    <span>@Override</span>
    <span>public</span> <span>void</span> <span>setApplicationEventPublisher</span><span>(</span><span>ApplicationEventPublisher</span> <span>eventPublisher</span><span>)</span> <span>{</span>
        <span>this</span><span>.</span><span>eventPublisher</span> <span>=</span> <span>eventPublisher</span><span>;</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"ApplicationEventPublisher set: "</span> <span>+</span> <span>eventPublisher</span><span>);</span>

        <span>// Publish a custom event</span>
        <span>eventPublisher</span><span>.</span><span>publishEvent</span><span>(</span><span>new</span> <span>CustomEvent</span><span>(</span><span>this</span><span>,</span> <span>"Test Event Message"</span><span>));</span>
    <span>}</span>
<span>}</span>

<span>// Custom Event Class</span>
<span>class</span> <span>CustomEvent</span> <span>extends</span> <span>org</span><span>.</span><span>springframework</span><span>.</span><span>context</span><span>.</span><span>ApplicationEvent</span> <span>{</span>
    <span>private</span> <span>final</span> <span>String</span> <span>message</span><span>;</span>

    <span>public</span> <span>CustomEvent</span><span>(</span><span>Object</span> <span>source</span><span>,</span> <span>String</span> <span>message</span><span>)</span> <span>{</span>
        <span>super</span><span>(</span><span>source</span><span>);</span>
        <span>this</span><span>.</span><span>message</span> <span>=</span> <span>message</span><span>;</span>
    <span>}</span>

    <span>public</span> <span>String</span> <span>getMessage</span><span>()</span> <span>{</span>
        <span>return</span> <span>message</span><span>;</span>
    <span>}</span>
<span>}</span>

<span>// Listener for Custom Events</span>
<span>@Component</span>
<span>class</span> <span>CustomEventListener</span> <span>{</span>
    <span>@org</span><span>.</span><span>springframework</span><span>.</span><span>context</span><span>.</span><span>event</span><span>.</span><span>EventListener</span>
    <span>public</span> <span>void</span> <span>handleCustomEvent</span><span>(</span><span>CustomEvent</span> <span>event</span><span>)</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Received Custom Event: "</span> <span>+</span> <span>event</span><span>.</span><span>getMessage</span><span>());</span>
    <span>}</span>
<span>}</span>
class MyDynamicBean implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, EnvironmentAware, EmbeddedValueResolverAware, ResourceLoaderAware, ApplicationEventPublisherAware { private String beanName; private ClassLoader classLoader; private BeanFactory beanFactory; private Environment environment; private StringValueResolver valueResolver; private ResourceLoader resourceLoader; private ApplicationEventPublisher eventPublisher; public MyDynamicBean() { System.out.println("MyDynamicBean instantiated!"); } @Override public void setBeanName(String name) { this.beanName = name; System.out.println("Bean name set: " + name); } @Override public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; System.out.println("Bean ClassLoader set: " + classLoader); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; System.out.println("BeanFactory set: " + beanFactory); } @Override public void setEnvironment(Environment environment) { this.environment = environment; System.out.println("Environment set: " + environment); System.out.println("Active Profile: " + environment.getActiveProfiles()); System.out.println("Server Port: " + environment.getProperty("server.port")); } @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { this.valueResolver = resolver; String resolvedValue = valueResolver.resolveStringValue("${server.port}"); System.out.println("Embedded Value Resolved: " + resolvedValue); } @Override public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; System.out.println("ResourceLoader set: " + resourceLoader); System.out.println("Loading resource example: " + resourceLoader.getResource("classpath:application.properties").exists()); } @Override public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher) { this.eventPublisher = eventPublisher; System.out.println("ApplicationEventPublisher set: " + eventPublisher); // Publish a custom event eventPublisher.publishEvent(new CustomEvent(this, "Test Event Message")); } } // Custom Event Class class CustomEvent extends org.springframework.context.ApplicationEvent { private final String message; public CustomEvent(Object source, String message) { super(source); this.message = message; } public String getMessage() { return message; } } // Listener for Custom Events @Component class CustomEventListener { @org.springframework.context.event.EventListener public void handleCustomEvent(CustomEvent event) { System.out.println("Received Custom Event: " + event.getMessage()); } }

Enter fullscreen mode Exit fullscreen mode


Key Observations

The setApplicationEventPublisher() method is called after setResourceLoader().

The ApplicationEventPublisher allows beans to trigger application events.

Best Practice: Use ApplicationEventPublisher for decoupling components via event-driven programming.


Step 10: Understanding setMessageSource()

Now that we’ve covered setApplicationEventPublisher(), the next lifecycle method is MessageSourceAware#setMessageSource().


What Happens at This Stage?

  • After setting the ApplicationEventPublisher, Spring calls setMessageSource().
  • This method provides a MessageSource, which allows beans to:
    • Retrieve localized messages (for internationalization).
    • Access messages.properties files for text translations.

Practical Example: Retrieving Messages

We’ve extended MyDynamicBean to implement MessageSourceAware:

<span>@Override</span>
<span>public</span> <span>void</span> <span>setMessageSource</span><span>(</span><span>MessageSource</span> <span>messageSource</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>messageSource</span> <span>=</span> <span>messageSource</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MessageSource set: "</span> <span>+</span> <span>messageSource</span><span>);</span>
<span>// Retrieve a message from messages.properties (if configured)</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Example message: "</span> <span>+</span> <span>messageSource</span><span>.</span><span>getMessage</span><span>(</span><span>"example.message"</span><span>,</span> <span>null</span><span>,</span> <span>"Default Message"</span><span>,</span> <span>null</span><span>));</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setMessageSource</span><span>(</span><span>MessageSource</span> <span>messageSource</span><span>)</span> <span>{</span>
    <span>this</span><span>.</span><span>messageSource</span> <span>=</span> <span>messageSource</span><span>;</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"MessageSource set: "</span> <span>+</span> <span>messageSource</span><span>);</span>

    <span>// Retrieve a message from messages.properties (if configured)</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Example message: "</span> <span>+</span> <span>messageSource</span><span>.</span><span>getMessage</span><span>(</span><span>"example.message"</span><span>,</span> <span>null</span><span>,</span> <span>"Default Message"</span><span>,</span> <span>null</span><span>));</span>
<span>}</span>
@Override public void setMessageSource(MessageSource messageSource) { this.messageSource = messageSource; System.out.println("MessageSource set: " + messageSource); // Retrieve a message from messages.properties (if configured) System.out.println("Example message: " + messageSource.getMessage("example.message", null, "Default Message", null)); }

Enter fullscreen mode Exit fullscreen mode


Key Observations

The setMessageSource() method is called after setApplicationEventPublisher().

MessageSource allows retrieving localized messages dynamically.

Best Practice: Use MessageSource for internationalization and text localization.


Step 11: Understanding setApplicationContext()

Now that we’ve covered setMessageSource(), the next lifecycle method is ApplicationContextAware#setApplicationContext().


What Happens at This Stage?

  • After setting the MessageSource, Spring calls setApplicationContext().
  • This method provides an ApplicationContext, which allows beans to:
    • Access all beans in the Spring container.
    • Retrieve environment properties.
    • Interact with the lifecycle of the entire application.

Practical Example: Accessing the ApplicationContext

We’ve extended MyDynamicBean to implement ApplicationContextAware:

<span>@Override</span>
<span>public</span> <span>void</span> <span>setApplicationContext</span><span>(</span><span>ApplicationContext</span> <span>applicationContext</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>this</span><span>.</span><span>applicationContext</span> <span>=</span> <span>applicationContext</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"ApplicationContext set: "</span> <span>+</span> <span>applicationContext</span><span>);</span>
<span>// Example: Retrieving a bean dynamically</span>
<span>MyDynamicBean</span> <span>anotherBean</span> <span>=</span> <span>applicationContext</span><span>.</span><span>getBean</span><span>(</span><span>MyDynamicBean</span><span>.</span><span>class</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Retrieved bean from ApplicationContext: "</span> <span>+</span> <span>anotherBean</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setApplicationContext</span><span>(</span><span>ApplicationContext</span> <span>applicationContext</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
    <span>this</span><span>.</span><span>applicationContext</span> <span>=</span> <span>applicationContext</span><span>;</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"ApplicationContext set: "</span> <span>+</span> <span>applicationContext</span><span>);</span>

    <span>// Example: Retrieving a bean dynamically</span>
    <span>MyDynamicBean</span> <span>anotherBean</span> <span>=</span> <span>applicationContext</span><span>.</span><span>getBean</span><span>(</span><span>MyDynamicBean</span><span>.</span><span>class</span><span>);</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Retrieved bean from ApplicationContext: "</span> <span>+</span> <span>anotherBean</span><span>);</span>
<span>}</span>
@Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; System.out.println("ApplicationContext set: " + applicationContext); // Example: Retrieving a bean dynamically MyDynamicBean anotherBean = applicationContext.getBean(MyDynamicBean.class); System.out.println("Retrieved bean from ApplicationContext: " + anotherBean); }

Enter fullscreen mode Exit fullscreen mode


Key Observations

The setApplicationContext() method is called after setMessageSource().

ApplicationContext provides access to all registered beans dynamically.

Best Practice: Use @Autowired instead of manually accessing the ApplicationContext, unless necessary.


Step 12: Understanding setServletContext()

Now that we’ve covered setApplicationContext(), the next lifecycle method is ServletContextAware#setServletContext() (applicable for web applications).


What Happens at This Stage?

  • After setting the ApplicationContext, Spring calls setServletContext().
  • This method provides access to the ServletContext, allowing the bean to:
    • Interact with web-related resources.
    • Retrieve application-wide configuration parameters.
    • Access web-related objects like request/session attributes.

Practical Example: Accessing the ServletContext

We’ve extended MyDynamicBean to implement ServletContextAware:

<span>@Override</span>
<span>public</span> <span>void</span> <span>setServletContext</span><span>(</span><span>ServletContext</span> <span>servletContext</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>servletContext</span> <span>=</span> <span>servletContext</span><span>;</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"ServletContext set: "</span> <span>+</span> <span>servletContext</span><span>);</span>
<span>// Example: Retrieving a context parameter</span>
<span>String</span> <span>contextParam</span> <span>=</span> <span>servletContext</span><span>.</span><span>getInitParameter</span><span>(</span><span>"someConfig"</span><span>);</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Context Parameter: "</span> <span>+</span> <span>contextParam</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>setServletContext</span><span>(</span><span>ServletContext</span> <span>servletContext</span><span>)</span> <span>{</span>
    <span>this</span><span>.</span><span>servletContext</span> <span>=</span> <span>servletContext</span><span>;</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"ServletContext set: "</span> <span>+</span> <span>servletContext</span><span>);</span>

    <span>// Example: Retrieving a context parameter</span>
    <span>String</span> <span>contextParam</span> <span>=</span> <span>servletContext</span><span>.</span><span>getInitParameter</span><span>(</span><span>"someConfig"</span><span>);</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"Context Parameter: "</span> <span>+</span> <span>contextParam</span><span>);</span>
<span>}</span>
@Override public void setServletContext(ServletContext servletContext) { this.servletContext = servletContext; System.out.println("ServletContext set: " + servletContext); // Example: Retrieving a context parameter String contextParam = servletContext.getInitParameter("someConfig"); System.out.println("Context Parameter: " + contextParam); }

Enter fullscreen mode Exit fullscreen mode


Key Observations

The setServletContext() method is called after setApplicationContext().

ServletContext allows interaction with web-specific components.

Best Practice: Use ServletContext only when necessary; prefer Spring beans for managing web configurations.


Step 13: Understanding postProcessBeforeInitialization()

Now that we’ve covered setServletContext(), the next lifecycle method is BeanPostProcessor#postProcessBeforeInitialization().


What Happens at This Stage?

  • Spring calls postProcessBeforeInitialization() before the initialization callbacks (@PostConstruct, InitializingBean#afterPropertiesSet()).
  • This method allows beans to:
    • Modify bean properties before initialization.
    • Apply proxying, validation, or logging before initialization.

Practical Example: Intercepting Bean Initialization

We’ve added a BeanPostProcessor to modify beans before initialization:

<span>@Component</span>
<span>class</span> <span>CustomBeanPostProcessor</span> <span>implements</span> <span>BeanPostProcessor</span> <span>{</span>
<span>@Override</span>
<span>public</span> <span>Object</span> <span>postProcessBeforeInitialization</span><span>(</span><span>Object</span> <span>bean</span><span>,</span> <span>String</span> <span>beanName</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"postProcessBeforeInitialization called for: "</span> <span>+</span> <span>beanName</span><span>);</span>
<span>return</span> <span>bean</span><span>;</span>
<span>}</span>
<span>}</span>
<span>@Component</span>
<span>class</span> <span>CustomBeanPostProcessor</span> <span>implements</span> <span>BeanPostProcessor</span> <span>{</span>
    <span>@Override</span>
    <span>public</span> <span>Object</span> <span>postProcessBeforeInitialization</span><span>(</span><span>Object</span> <span>bean</span><span>,</span> <span>String</span> <span>beanName</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
        <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"postProcessBeforeInitialization called for: "</span> <span>+</span> <span>beanName</span><span>);</span>
        <span>return</span> <span>bean</span><span>;</span>
    <span>}</span>
<span>}</span>
@Component class CustomBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization called for: " + beanName); return bean; } }

Enter fullscreen mode Exit fullscreen mode


Key Observations

The postProcessBeforeInitialization() method is called before @PostConstruct and afterPropertiesSet().

Best Practice: Use this for bean modifications, logging, or applying custom initialization logic.


Step 14: Understanding @PostConstruct and afterPropertiesSet()

Now that we’ve covered postProcessBeforeInitialization(), the next lifecycle methods are @PostConstruct and InitializingBean#afterPropertiesSet().


What Happens at This Stage?

  • Spring calls initialization callbacks after postProcessBeforeInitialization(), including:
    • @PostConstruct: A method annotated with @PostConstruct runs after dependency injection is completed.
    • afterPropertiesSet(): This method is part of the InitializingBean interface and runs after all properties are set.
  • These methods are typically used for:
    • Validating required properties.
    • Setting up resources after dependency injection.

Practical Example: Using @PostConstruct and afterPropertiesSet()

We’ve modified MyDynamicBean to implement InitializingBean and added a @PostConstruct method:

<span>@PostConstruct</span>
<span>public</span> <span>void</span> <span>postConstruct</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"@PostConstruct method executed"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>afterPropertiesSet</span><span>()</span> <span>throws</span> <span>Exception</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"afterPropertiesSet() method executed"</span><span>);</span>
<span>}</span>
<span>@PostConstruct</span>
<span>public</span> <span>void</span> <span>postConstruct</span><span>()</span> <span>{</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"@PostConstruct method executed"</span><span>);</span>
<span>}</span>

<span>@Override</span>
<span>public</span> <span>void</span> <span>afterPropertiesSet</span><span>()</span> <span>throws</span> <span>Exception</span> <span>{</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"afterPropertiesSet() method executed"</span><span>);</span>
<span>}</span>
@PostConstruct public void postConstruct() { System.out.println("@PostConstruct method executed"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet() method executed"); }

Enter fullscreen mode Exit fullscreen mode


Key Observations

@PostConstruct runs before afterPropertiesSet().

Best Practice: Use @PostConstruct for setup logic, and afterPropertiesSet() when implementing InitializingBean.

Avoid implementing InitializingBean unless absolutely necessary, as @PostConstruct is more flexible.


Step 15: Understanding postProcessAfterInitialization()

Now that we’ve covered @PostConstruct and afterPropertiesSet(), the next lifecycle method is BeanPostProcessor#postProcessAfterInitialization().


What Happens at This Stage?

  • Spring calls postProcessAfterInitialization() after initialization callbacks (@PostConstruct, afterPropertiesSet()).
  • This method allows:
    • Applying proxying mechanisms (e.g., AOP).
    • Performing post-initialization modifications (e.g., wrapping the bean).

Practical Example: Intercepting Bean Post-Initialization

We’ve extended CustomBeanPostProcessor to implement postProcessAfterInitialization():

<span>@Override</span>
<span>public</span> <span>Object</span> <span>postProcessAfterInitialization</span><span>(</span><span>Object</span> <span>bean</span><span>,</span> <span>String</span> <span>beanName</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"postProcessAfterInitialization called for: "</span> <span>+</span> <span>beanName</span><span>);</span>
<span>return</span> <span>bean</span><span>;</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>Object</span> <span>postProcessAfterInitialization</span><span>(</span><span>Object</span> <span>bean</span><span>,</span> <span>String</span> <span>beanName</span><span>)</span> <span>throws</span> <span>BeansException</span> <span>{</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"postProcessAfterInitialization called for: "</span> <span>+</span> <span>beanName</span><span>);</span>
    <span>return</span> <span>bean</span><span>;</span>
<span>}</span>
@Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization called for: " + beanName); return bean; }

Enter fullscreen mode Exit fullscreen mode


Key Observations

The postProcessAfterInitialization() method is called after @PostConstruct and afterPropertiesSet().

Best Practice: Use this method for applying proxies or final modifications after the bean is fully initialized.


Step 16: Understanding @PreDestroy and destroy()

Now that we’ve covered postProcessAfterInitialization(), the final lifecycle methods are @PreDestroy and DisposableBean#destroy().


What Happens at This Stage?

  • Spring calls destruction callbacks before shutting down the application.
  • These methods ensure proper resource cleanup:
    • @PreDestroy: Runs before the bean is destroyed, ideal for closing resources.
    • destroy(): From DisposableBean, allows executing destruction logic.

Practical Example: Cleaning Up Resources

We’ve modified MyDynamicBean to implement DisposableBean and added a @PreDestroy method:

<span>@PreDestroy</span>
<span>public</span> <span>void</span> <span>preDestroy</span><span>()</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"@PreDestroy method executed"</span><span>);</span>
<span>}</span>
<span>@Override</span>
<span>public</span> <span>void</span> <span>destroy</span><span>()</span> <span>throws</span> <span>Exception</span> <span>{</span>
<span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"destroy() method executed"</span><span>);</span>
<span>}</span>
<span>@PreDestroy</span>
<span>public</span> <span>void</span> <span>preDestroy</span><span>()</span> <span>{</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"@PreDestroy method executed"</span><span>);</span>
<span>}</span>

<span>@Override</span>
<span>public</span> <span>void</span> <span>destroy</span><span>()</span> <span>throws</span> <span>Exception</span> <span>{</span>
    <span>System</span><span>.</span><span>out</span><span>.</span><span>println</span><span>(</span><span>"destroy() method executed"</span><span>);</span>
<span>}</span>
@PreDestroy public void preDestroy() { System.out.println("@PreDestroy method executed"); } @Override public void destroy() throws Exception { System.out.println("destroy() method executed"); }

Enter fullscreen mode Exit fullscreen mode


Key Observations

@PreDestroy runs before destroy().

Best Practice: Use @PreDestroy for graceful shutdown and destroy() if implementing DisposableBean.

Avoid implementing DisposableBean unless required, as @PreDestroy is more flexible.


Happy coding

原文链接:spring-012: entire-spring-bean-lifecycle-from-registration-to-destruction-with-sample-examples

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
Smash the waves would rather get in the way of the reef hill, also not willing to take a step back.
海浪宁可在挡路的礁山上撞得粉碎,也不肯后退一步
评论 抢沙发

请登录后发表评论

    暂无评论内容