SpringBean的作用域:
Singleton 单例模式,Spring IOC容器只会存在一个共享的Bean实例。
Prototype 原型模式,(多例模式),每次getBean都会实例化一个新的对象
范围 描述
Singleton (默认值)将每个Spring IoC容器的单个bean定义范围限定为单个对象实例。
prototype 将单个bean定义的作用域限定为任意数量的对象实例。
request 将单个bean定义的范围限定为单个HTTP请求的生命周期。也就是说,每个HTTP请求都有一个在单个bean定义的后面创建的bean实例。
session 将单个bean定义的范围限定为HTTP的生命周期Session。
application 将单个bean定义定位到ServletContext的生命周期。
websocket 将单个bean定义的作用域限定为的生命周期WebSocket。
请求,会话,应用程序和WebSocket范围
在request,session,application,和websocket范围只有当你使用一个基于web的Spring可ApplicationContext实现(例如 XmlWebApplicationContext)。如果您将这些作用域与常规的Spring IoC容器一起使用,例如ClassPathXmlApplicationContext,IllegalStateException则会引发报错未知bean作用域的。
@RequestScope
@SessionScope
@ApplicationScope
自定义Bean的性质
初始化回调
org.springframework.beans.factory.InitializingBean容器在bean上设置了所有必需的属性后,该接口使bean可以执行初始化工作。该InitializingBean接口指定一个方法:
void afterPropertiesSet() throws Exception;
public class AnotherExampleBean implements InitializingBean {
@Override
public void afterPropertiesSet() {
// do some initialization work
}
}
xml方式
public class ExampleBean {
public void init() {
// do some initialization work
}
}
销毁回调
org.springframework.beans.factory.DisposableBean当包含该接口的容器被销毁时,实现该接口可使Bean获得回调。该 DisposableBean接口指定一个方法:
void destroy() throws Exception;
public class AnotherExampleBean implements DisposableBean {
@Override
public void destroy() {
// do some destruction work (like releasing pooled connections)
}
}
xml方式
public class ExampleBean {
public void cleanup() {
// do some destruction work (like releasing pooled connections)
}
}
启动和关闭回调
Lifecycle接口为任何有自己生命周期需求的对象定义了基本方法(例如启动和停止某些后台进程):
public interface Lifecycle {
void start();
void stop();
boolean isRunning();
}
任何spring管理的对象都可以实现生命周期接口。然后,当ApplicationContext本身接收到启动和停止信号(例如,对于运行时的停止/重启场景)时,它将这些调用级联到该上下文中定义的所有生命周期实现。它通过委托给LifecycleProcessor来实现这一点,如下所示:
public interface LifecycleProcessor extends Lifecycle {
void onRefresh();
void onClose();
}
SmartLifecycle定义的stop方法接受回调。任何实现都必须在该实现的关闭过程完成后调用该回调函数的run()方法。这将在必要时启用异步关闭,因为LifecycleProcessor接口的默认实现DefaultLifecycleProcessor等待每个阶段内的对象组的超时值来调用回调。默认的每个阶段超时时间是30秒。您可以通过在上下文中定义一个名为lifecycleProcessor的bean来覆盖默认的lifecycle processor实例。如果你只想修改超时,那么定义如下就足够了:
ApplicationContextAware and BeanNameAware
当ApplicationContext创建一个实现了org.springframework.context的对象实例时。ApplicationContextAware接口,为实例提供了对该ApplicationContext的引用。下面的清单显示了ApplicationContextAware接口的定义:
public interface ApplicationContextAware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
当ApplicationContext创建一个实现了org.springframework.beans.factory的类时。在BeanNameAware接口中,向类提供了对其关联对象定义中定义的名称的引用。下面的清单显示了BeanNameAware接口的定义:
public interface BeanNameAware {
void setBeanName(String name) throws BeansException;
}