Spring 多实例注入

1. Spring 多实例注入的应用场景

Spring 容器中保存的 bean 默认是单例的,通常来说这样做可以降低 bean 对象创建的频率,在某些访问量大的场景下可以节省对象创建消耗的时间,提高响应性能。但在一些其他场景,比如脚本调度处理多个消息队列中的消息,这时候拉取各个队列消息的步骤是完全相同的,只不过各条队列的名称和密码不一样,很明显可以使用一个专门的 processor来处理,以便减少重复代码。只是如此一来,对于每条队列,必然要使用一个单独的processor实例,这就需要用到 Spring 的多实例注入了

2. Spring 多实例注入的使用

Spring 框架中, 在一个Java 类上添加注解@Scope("prototype")即声明该类为原型作用域,每次通过 Spring 容器获取其实例的时候都会返回一个新的对象。但是要注意,声明为多实例的 bean 对象通过注解 @Resource@Autowired 自动注入是无法保证每次获取的都是新的实例的,一个解决方法是通过Spring 的 ApplicationContext,直接获取容器中的 bean 实例,示例代码如下

  1. 首先在目标类上添加注解@Scope("prototype")声明其每次使用都需要新的实例

    @Component
    @Scope("prototype")
    public class MessageProcessor {
       ......
       private String queueName;
       private String passWord;
       ......
    }
    
  2. 创建实现ApplicationContextAware 接口的 SpringBeanProvider工具类。使用时注入 SpringBeanProvider 实例,调用其 getBean()方法,传入指定参数即可获取到类的新实例

    @Component
    public class SpringBeanProvider implements ApplicationContextAware {
    
     private ApplicationContext applicationContext;
    
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         this.applicationContext = applicationContext;
    
     }
    
     /**
      * 通过 beanName 获取 Bean
      * @param beanName
      * @return
      */
     public Object getBean(String beanName) {
         return applicationContext.getBean(beanName);
     }
    
     /**
      * 通过class获取Bean
      * @param clazz
      * @param <T>
      * @return
      */
     public <T> T getBean(Class<T> clazz) {
         return applicationContext.getBean(clazz);
     }
    
     /**
      * 通过 beanName ,以及Clazz返回指定的Bean
      * @param beanName
      * @param clazz
      * @param <T>
      * @return
      */
     public <T> T getBean(String beanName, Class<T> clazz) {
         return applicationContext.getBean(beanName, clazz);
     }
    }
    
发布了97 篇原创文章 · 获赞 88 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45505313/article/details/104441899
今日推荐