spring 的bean默认是单例,这个用spring的人基本都知道。
如果需要多个实例,又要使用ioc怎么办呢?
当然是使用@Scope注解,指明ConfigurableBeanFactory.SCOPE_PROTOTYPE了。
/** * Scope identifier for the standard singleton scope: "singleton". * Custom scopes can be added via {@code registerScope}. * @see #registerScope */ String SCOPE_SINGLETON = "singleton"; /** * Scope identifier for the standard prototype scope: "prototype". * Custom scopes can be added via {@code registerScope}. * @see #registerScope */ String SCOPE_PROTOTYPE = "prototype";
但是在使用过程中 发现这样依然是单例。
难道spring的注解不稳定还是我使用有误?
首先推敲一下,为什么我们获取到的实例每次都一样。
spring出问题是不太可能了,这么常见的特性那么多人都用呢。
如果给一个组件加上
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
每次请求它的实例,spring的确会给返回一个新的。
问题是这个多例对象是被其他单例服务依赖的。
而单例服务初始化的时候,多例对象就已经被创建好了。当你去使用单例服务的时候,多例对象也不会被再次创建了。
那怎么解决呢?
一个首先想到的方法当然是注入多个,就是写多个@Autowired。
这样的确可以。而且如果对单例服务写多个,他们也是一样的,只有对多例的才行。
但是我们的服务绝大多数时候都不知道需要多少多例服务,服务是动态创建的。
所以另一种方法就是使用getBean方法:
@Autowired
private ApplicationContext applicationContext;
applicationContext.getBean()
只要每次调用getBean就可以获得一个新服务。
其实spring的@Scope注解提供了在单例服务里使用多例对象的能力,它提供了一个代理字段
/** * Specifies whether a component should be configured as a scoped proxy * and if so, whether the proxy should be interface-based or subclass-based. * <p>Defaults to {@link ScopedProxyMode#DEFAULT}, which typically indicates * that no scoped proxy should be created unless a different default * has been configured at the component-scan instruction level. * <p>Analogous to {@code <aop:scoped-proxy/>} support in Spring XML. * @see ScopedProxyMode */ ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
默认是不使用代理创建。我们只要把它改成使用代理即可:
@Component @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)
这样即使是在单例里面使用,每次获取多例对象也会拿到一个新的。
相关推荐
- **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...
在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...
在Spring框架中,Bean的创建和初始化是IoC(Inversion of Control)容器的核心功能,这一过程涉及到多个步骤。以下是对Spring Bean创建初始化流程的详细解释: 1. **初始化ApplicationContext**: 开始时,通过`...
Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...
解决这个问题的关键在于深入理解Spring的Bean生命周期和配置机制,检查配置文件、注解使用、依赖关系等,确保每个Bean的定义都是唯一的,且作用域设置正确。同时,对源码进行调试也是一个有效的排查手段,可以追踪到...
在Spring框架中,Bean的两种主要作用域是Singleton和Prototype。Singleton Bean表示在整个Spring IoC容器中只有一个实例,而Prototype Bean则表示每次请求都会创建一个新的实例。这两种作用域的使用场景和实现方式都...
- **SpringBean调试**:学会使用EOS提供的调试工具来定位和解决问题。 #### 报销单维护案例开发 报销单维护案例是一个更接近实际业务场景的例子,可以帮助开发者更深入地理解SpringBean的使用技巧。 - **场景...
对于Prototype作用域的Bean,Spring不会自动管理销毁,需要由用户负责。 在实际应用中,理解这些步骤有助于优化Bean的加载和管理,避免依赖问题,提高应用性能。例如,通过调整Bean的加载顺序,可以控制某些服务的...
`scope`属性可以设定Bean的作用域,如单例(singleton)或多例(prototype)。 总的来说,Spring Bean生命周期的理解和灵活运用,能帮助我们更好地控制Bean的行为,实现更高效、更可控的依赖管理和资源管理。通过...
获取springbean对象
在Spring框架中,bean的实例化是其核心功能之一,它允许我们管理应用程序中的对象生命周期。本篇将详细探讨两种工厂方法——实例工厂方法和静态工厂方法,用于创建Spring Bean。 首先,我们要理解Spring Bean的概念...
bean文件 springbean文件
Spring Bean 加载过程源码解析文档 Spring Bean 加载过程是 Spring 框架中最核心的部分之一,涉及到 ApplicationContext 的初始化、Bean 的加载和注册等过程。在 Spring Boot 应用程序中,SpringApplication 负责...
### Spring Bean 属性详解 Spring框架是Java平台上的一个开源框架,主要用来简化企业级应用程序的开发。在Spring中,核心概念之一就是Bean,它是一个简单的Java对象,由Spring IoC容器管理。Spring通过XML配置文件...
创建SpringBean配置工具类(安全)如: <bean id=... scope="prototype"></bean>
Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...
这意味着,如果多次从Spring容器中请求同一个`prototype` Bean,将会得到不同的对象。在配置文件中,`p2`被定义为`prototype` Bean,通过`scope="prototype"`指定。在`BeanTest`中,我们请求`p2`两次并进行比较,...
在Spring框架中,Bean的生命周期管理是其核心特性之一,它允许开发者控制Bean从创建到销毁的整个过程。本资源提供了在Spring 4.2环境下关于Bean生命周期的测试代码,帮助我们深入理解这一关键概念。 首先,让我们...
- prototype:每次请求都创建一个新的Bean实例。 - request:每个HTTP请求都会创建一个新的Bean实例,只适用于Web应用。 - session:在一个HTTP Session中只会创建一个Bean实例,同样只适用于Web应用。 4. ...
在Spring框架中,Bean的实例化顺序是一个关键概念,它涉及到如何管理和协调多个Bean的创建与依赖关系。这里,我们主要探讨的是Spring如何通过其IoC(Inversion of Control)容器来实例化Bean,并理解其背后的逻辑。 ...