spring使一个bean变成非单例

概述
通过Spring管理的类,默认是单例模式,但是如果有的类需要使用独立的属性,则需要配置为多例模式的. 但是多例模式不仅仅只是加一个声明,使用@Autowired进行注入,可能并不会是你想要的结果.因为多例模式的类是需要单独调用的.
不搞清楚原理直接测试:
需要多例的类上加上注解@Scope(“prototype”)

@Component
@Scope("prototype")
public class ExampleService{
public void test(){
	System.out.println("test,current bean is" + this);
}

}

引用直接使用@Autowired

@Controller
public class ExampleService{
@Autowired
private ExampleService exampleService;

@RequestMapping("test")
public void test(){
	exampleService.test();
}

}

结果: 每个request过来的时候,exampleService实例均为同一个实例.

解决办法:
第一种:不使用@Autowired

@Controller
public class ExampleService{
@Autowired
private org.springframework.beans.factory.BeanFactory beanFactory;

@RequestMapping("test")
public void test(){
	ExampleService exampleService = beanFactory.getBean(ExampleService.class);
	exampleService.test();
}

}

第二种:使用bean工厂

@Autowired
 private ApplicationContext context;

@Bean
public WebSocketHandler websocketBHandler() {
PerConnectionWebSocketHandler perConnectionHandler = new PerConnectionWebSocketHandler(WebSocketBHandler.class);
perConnectionHandler.setBeanFactory(context.getAutowireCapableBeanFactory());
//设置bean工厂,否则bean工厂WebSocketBHandler将不会自动连接
return perConnectionHandler;
}

然后使用ApplicationContext进行代理bean工厂

注入
@Autowired
private ApplicationContext context;
使用
this.Bservice = context.getBean(BService.class, this);

 
 

官方文档说明
4.5.3 Singleton beans with prototype-bean dependencies When you use singleton-scoped beans with dependencies on prototype beans, be aware that dependencies are resolved at instantiation time. Thus if you dependency-inject a prototype-scoped bean into a singleton-scoped bean, a new prototype bean is instantiated and then dependency-injected into the singleton bean. The prototype instance is the sole instance that is ever supplied to the singleton-scoped bean. However, suppose you want the singleton-scoped bean to acquire a new instance of the prototype-scoped bean repeatedly at runtime. You cannot dependency-inject a prototype-scoped bean into your singleton bean, because that injection occurs only once, when the Spring container is instantiating the singleton bean and resolving and injecting its dependencies. If you need a new instance of a prototype bean at runtime more than once, see Section 4.4.6, “Method injection”
《参考:https://eoekun.top/2017/07/Spring多例使用@Autowired无效》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值