asp.net做的网站模板,口碑好的常州网站优化,猪八戒设计平台官网,各大网站发布Spring Bean作用域
默认情况下#xff0c;所有的 Spring Bean 都是单例的#xff0c;也就是说在整个 Spring 应用中#xff0c; Bean 的实例只有一个
如果我们需要创建多个实例的对象#xff0c;那么应该将 Bean 的 scope 属性定义为 prototype#xff0c;如果 Spring 需…
Spring Bean作用域
默认情况下所有的 Spring Bean 都是单例的也就是说在整个 Spring 应用中 Bean 的实例只有一个
如果我们需要创建多个实例的对象那么应该将 Bean 的 scope 属性定义为 prototype如果 Spring 需要每次都返回一个相同的 Bean 实例则应将 Bean 的 scope 属性定义为 singleton。默认
Spring 5 共提供了 6 种 scope 作用域 这里只说 单例 和 多例的配置
多例
!-- User --
bean classcom.liu.c.User iduser scopeprototypeconstructor-arg nameage value15/constructor-arg namename value小张/
/beanpublic class TestUser {public static void main(String[] args) {String springProperties spring.xml;ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(springProperties);User user context.getBean(user, User.class);User user1 context.getBean(user, User.class);System.out.println(user.hashCode());System.out.println(user1.hashCode());}
}显然是不同的对象
1554358
17185802单例
bean classcom.liu.c.User iduser scopesingletonconstructor-arg nameage value15/constructor-arg namename value小张/
/beanhash值相同同一个对象单例模式
17139697
17139697OK Spring Bean的声明周期
在传统的 Java 应用中Bean 的生命周期很简单使用 Java 关键字 new 进行 Bean 的实例化后这个 Bean 就可以使用了。一旦这个 Bean 长期不被使用Java 自动进行垃圾回收。
Spring 中 Bean 的生命周期较复杂大致可以分为以下 5 个阶段 Bean 的实例化 Bean 属性赋值 Bean 的初始化 Bean 的使用 Bean 的销毁
Spring 根据 Bean 的作用域来选择 Bean 的管理方式 对于 singleton 作用域的 Bean 来说Spring IoC 容器能够精确地控制 Bean 何时被创建、何时初始化完成以及何时被销毁 对于 prototype 作用域的 Bean 来说Spring IoC 容器只负责创建然后就将 Bean 的实例交给客户端代码管理Spring IoC 容器将不再跟踪其生命周期。
我们可以在 Spring Bean 的 Java 类中通过实现 InitializingBean 和 DisposableBean 接口指定 Bean 的生命周期回调方法。
我们还可以在 Spring 的 XML 配置中通过 元素中的 init-method 和 destory-method 属性指定 Bean 的生命周期回调方法。
我们还可以通过 JSR-250 的 PostConstruct 和 PreDestroy 注解指定 Bean 的生命周期回调方法。
Spring Bean继承
在 Spring XML 配置中我们通过子 Bean 的 parent 属性来指定需要继承的父 Bean配置格式如下
!--父Bean--
bean idparentBean classxxx.xxxx.xxx.ParentBean property namexxx valuexxx/propertyproperty namexxx valuexxx/property
/bean
!--子Bean--
bean idchildBean classxxx.xxx.xxx.ChildBean parentparentBean/beanBean定义模板
在父 Bean 的定义中有一个十分重要的属性那就是 abstract 属性。如果一个父 Bean 的 abstract 属性值为 true则表明这个 Bean 是抽象的。
抽象的父 Bean 只能作为模板被子 Bean 继承它不能实例化也不能被其他 Bean 引用更不能在代码中根据 id 调用 getBean() 方法获取否则就会返回错误。
在父 Bean 的定义中既可以指定 class 属性也可以不指定 class 属性。如果父 Bean 定义没有明确地指定 class 属性那么这个父 Bean 的 abstract 属性就必须为 true。