Spring框架支持六个范围,其中四个仅在使用web-awareApplicationContext时可用。Spring支持以下6种bean作用域:singleton:单例模式(默认值),Spring容器中只会创建一个实例。prototype:原型模式,每次通过Spring容器获取一个bean,容器都会创建一个新的实例。request:为每个HTTP请求创建一个实例,但只在http请求范围内有效。session:在http会话生命周期中,共享一个实例,不同的会话有不同的实例。application:在ServletContext的生命周期中,只有一个实例。webSocket:webSocket范围内只有一个实例。SingletonscopeSpring容器的默认作用域,只管理一个共享的单例bean实例,id与bean定义的id匹配的bean请求,spring容器会返回一个具体的bean实例。换句话说,当您将一个bean定义为单例时,SpringIoC容器将只创建该bean的一个实例。该实例存储在缓存中,所有后续请求和对该bean的引用都将返回缓存的对象。定义一个基于java配置的单例bean@ConfigurationpublicclassAppConfiguration{@Bean@Scope("singleton")//默认作用域publicUserServiceuserService(){returnnewUserService();}}prototypescope原型模式会导致每次请求都会创建一个新的bean实例,即当一个bean被注入到另一个bean中时,或者通过getBean()方法调用请求时新创建一个bean实例。通常,有状态bean使用原型作用域,而无状态bean使用单例作用域。与其他范围不同,spring容器不管理原型范围的整个生命周期。容器通过其他方式实例化、配置、组装原型对象,这些都交给客户端,不再记录原型实例。定义一个基于java配置的原型bean@ConfigurationpublicclassAppConfiguration{@Bean@Scope("prototype")publicUserServiceuserService(){returnnewUserService();}}具有原型bean依赖关系的单例bean当使用具有原型bean依赖关系的实例bean时,请注意依赖关系是在实例化时解析的。因此,如果将依赖项原型注入到单例bean中,则会实例化一个新的原型bean,然后将依赖项注入到单例bean中。原型实例是唯一提供给单例bean的实例。Request、Session、Application和WebSocket作用域Request、Session、Application和WebSocket作用域仅在使用web-awareSpringApplicationContext实现(例如XmlWebApplicationContext)时可用。如果这些范围与常规SpringIoC容器(如ClassPathXmlApplicationContext)一起使用,则会抛出IllegalStateException,未知的bean范围。鉴于现在的技术开发都是采用前后端分离的模式进行开发,很少单独使用Springwebmvc模式。这四个作用域这里就不一一介绍了,大家可以参考官方文档了解。InitializingBean和DisposableBean在Spring中,为了与容器bean的生命周期管理交互,可以实现InitializingBean和DisposableBean接口。AfterPropertieSet()在容器初始化的时候执行,而在容器销毁的时候调用destroy(),使得bean在初始化和销毁??的时候执行一定的操作。@PostConstruct和@PreDestroy注解通常被认为是在新版本的Spring应用程序中接收生命周期回调的最佳实践。使用这些注释意味着您的bean没有耦合到特定于Spring的接口。实现InitializingBean接口,该接口将在所有bean设置其属性后运行afterPropertiesSet()。实现DisposableBean接口,在Spring容器释放bean后运行destroy()。InitializingBean和DisposableBean示例在此示例中,我们将使用afterPropertiesSet()方法在应用程序启动期间使用用户对象填充内存列表数据结构。我们还将使用destroy()方法在应用程序关闭期间从列表中删除用户对象。包com.demo.spring;导入java.util.ArrayList;导入java.util.Iterator;导入java.util.List;导入org.springframework.beans.factory.DisposableBean;导入org.springframework.beans.factory.InitializingBean;importorg.springframework.stereotype.Component;@ComponentpublicclassDatabaseInitaizerimplementsInitializingBean,DisposableBean{privateList
