Spring Bean

Spring的核心容器就是一个大工厂,所有的对象,也就是所有的Bean(包括数据源等)都是Spring核心容器管理的对象。只要是一个Java类,Spring就可以把它当作Bean来管理。

Spring Bean的好处

  • Lifecycle method生命周期方法:更好实现对象的初始化和资源销毁;
  • Scope作用域:提供如singleton、prototype等作用域,使在创建对象时根据访问次数来选择相关作用域。
  • Lazy延迟加载方法(懒加载):对象用时调用,不用时无需加载和实例化;

根据以上三种方法,实现Bean对象的有效管理。
同时,Spring框架可以基于用户设计管理对象与对象之间的依赖关系,来降低两者之间的耦合,从而提供程序的复用性和扩展性。

Bean作用域

Bean提供五种作用域,默认情况下采用单例模式

  • singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式,配置为:
  • prototype:原型模式,每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而singleton全局只有一个对象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。
  • request:在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。
    ,针对每一次Http请求,Spring容器根据该bean的定义创建一个全新的实例,且该实例仅在当前Http请求内有效,而其它请求无法看到当前请求中状态的变化,当当前Http请求结束,该bean实例也将会被销毁。
  • session:在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。
    ,同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,则实例将被销毁。
  • global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。
在实际开发中是存在多例的需求的(如购物车,用户的订单等

我们可以通过设置scope的值来改变某一个Bean的作用域



    

Spring Bean 为什么默认是单例模式

单例bean的优势

由于不会每次都新创建新对象所以有一下几个性能上的优势:

  • 减少了新生成实例的消耗

新生成实例消耗包括两方面,第一,Spring会通过反射或者cglib来生成bean实例这都是耗性能的操作,其次给对象分配内存也会涉及复杂算法。

  • 减少jvm垃圾回收

由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。

  • 可以快速获取到bean

因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的所以很快。

单例有啥劣势?

如果是有状态的话在并发环境下线程不安全。

这里我的理解是单例模式分为饿汉模式和懒汉模式,其中懒汉模式在没有锁的情况下遇到并发同时访问就会出现线程不安全问题。

生命周期

bean在单例模式下的生命周期:

bean在单例模式下,spring容器启动时解析xml发现该bean标签后,直接创建该bean的对象存入内部map中保存,此后无论调用多少次getBean()获取该bean都是从map中获取该对象返回,一直是一个对象。此对象一直被Spring容器持有,直到容器退出时,随着容器的退出对象被销毁。

bean在多例模式下的生命周期:

bean在多例模式下,spring容器启动时解析xml发现该bean标签后,只是将该bean进行管理,并不会创建对象,此后每次使用 getBean()获取该bean时,spring都会重新创建该对象返回,每次都是一个新的对象。这个对象spring容器并不会持有,什么销毁取决于使用该对象的用户自己什么时候销毁该对象。

BeanFactory

从应用中我们可以了解到,使用Spring的好处就是,程序员不用再关心对象的创建过程与对象之间依赖关系,这些都交给Spring去管理了。spring通过BeanFactory来管理这些对象,我们只需做到以下几点:

  • 告诉spring哪些类是需要交给它去管理的;
  • 怎么告诉spring这些类;
  • 怎样维护依赖关系(setter或contructor);
  • 怎样体现setter、contructor;

BeanFactory和FactoryBean的区别

BeanFactory

BeanFactory是一个spring中的一个工厂,可以产生bean,可以通过getBean获取;

FactoryBean

FactoryBean是spring中一个特殊的bean,它可以产生bean,实现了FactoryBean接口的类,可以通过getObject获取生产出来的bean。FactoryBean和它所产生出来的bean的存在形式也不一样,如果你想要直接获取FactoryBean本身则通过getBean(bean名字)获取,如果想要获取它生产出来的bean则通过getBean(&bean名字)来获取。

你可能感兴趣的:(Spring Bean)