Spring中单例模式下存在多例对象的处理方法
标签(空格分隔): Spring
在日常的开发过程中,在使用Spring时主要使用IOC/DI、AOP特性,通常在IOC容器中,对象默认的作用域scope属性都是singleton类型,也就是单例模式,但是如果说这个对象里头的某个属性是多例的,我们该如何注入呢?肯定不能直接使用@Autoware属性进行注入,因为ioc容器创建对象之后,一直存放在IOC容器中,也就是说对象内的所有属性都只有一份,所以里面也都是单例。那如何解决属性为多例的情况呢?
1、在Spring的Bean文件中配置该属性的作用域为scope。代码如下:
<!-- 定义Httpclient对象 指定scope表示该对象为多例-->
<!-- 相当于方法:HttpClients.custom().setConnectionManager(cm).build(); -->
<bean class="org.apache.http.impl.client.CloseableHttpClient"
factory-bean="httpClientBuilder" factory-method="build" scope="prototype" />
2、所属对象中,实现接口BeanFactoryAware,并声明beanFactory对象属性和setter方法,代码如下:
public class ApiHttpClientService implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
3、从容器中获取多例对象,代码如下:
private CloseableHttpClient getHttpClient() {
// 每次都从Spring容器中获取Httpclient对象,保证该对象是多例
return this.beanFactory.getBean(CloseableHttpClient.class);
}