综述
(1)Spring通过BeanFactory灵活配置、管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理;
(2)BeanFactory有个ApplicationContext子接口,该接口比BeanFactory增强了更多的功能,该接口的实例有时被称为Spring的上下文,在通常的J2EE应用中,都应该考虑ApplicationContext接口,只有在J2EE应用非常关注内存的情况下,才考虑使用BeanFactory
(3)Spring以bean方式管理组件,J2EE的全部组件都被当做bean来管理,Spring中的组件可以是Java对象或者Java组件;
(4)在Spring整个应用中,各层的对象都处在Spring的管理下,这些对象以Bean的方式存在,Spring负责创建bean,并且管理其生命周期,bean在Spring容器中运行,无需感受Spring容器的存在,一样可以运行,接受Spring的依赖注入,包括bean的属性注入,合作者注入,依赖关系注入等
很关键的一点:Spring上下文(ApplicationContext)是产生bean的工厂,bean是工厂产生的实例,产生bean的实例时,需要知道bean的实现类,bean实例的使用者(即调用程序)面向的是接口,无需关心bean实例的实现类,Spring工厂(ApplicationContext)负责维护bean实例的实例化,使用者无需关心实例化。
1.定义和实例化
a.综述
(1)bean通过XML文件定义;
(2)Spring提供bean的实例化,以及依赖注入;
(3)bean实例通过BeanFactory进行访问
b.BeanFactory接口
BeanFactroy是一个Spring容器,用于创建,配置,管理bean,bean之间的依赖关系也有BeanFactory负责维护;
BeanFactory对bean的实例化过程,无须bean的调用者关心,调用者只需要通过getBean()方法获得指定bean的引用;
创建BeanFactory的实例时,必须提供bean的详细配置信息,bean的详细信息通过XML文件描述,创建BeanFactory实例时,需要提供XML文件作为参数
1.1 bean的定义
a)bean的定义必须包含两个属性
(1)id:确定bean的唯一标识符
(2)class指定该bean的具体实现类,而不是接口,通常情况下,Spring会直接使用new关键字创建该bean的实例,因此,必须提供bean的是实现类;
b)bean的基本行为
bean在Spring中有两种基本行为
Singleton和non-singleton
Singleton:整个Spring容器中只有一个该bean的实例存在,每次请求该id的bean,Spring都会返回该bean的共享实例;
non-singleton:每次请求该id的bean,Spring都会新建一个bean实例,然后返回给程序,通常,要求Web应用的控制bean通常被设置为non-singleton,因为每次HttpServletRequest都需要系统启动一个新Action来处理用户请求;
提倡使用non-singleton类型的bean,应为Spring容器创建或者销毁bean都会有一定的开销。
c)Spring中的bean VS. JavaBean
(1)JavaBean中的每个属性需要有getter和setter方法,JavaBean通常作为model,用来封装值对象,在各层之间传递(结合JSP设计模式中的MVC结构中,m:JavaBean,v:JSP,c:Servlet理解);
(2)Spring中的bean应该满足
a.每个bean实现类都应该提供无参数的构造器;
b.采用构造注入时,应提供对应的构造函数;
c.采用设值注入时,应提供对应的setter方法;
(3)真正的差异
a.用处:JavaBean作为值对象传递参数,而Spring中任何组件都可以被称为bean;
b.写法:JavaBean作为值对象,每个属性都要提供setter和getter方法,而bean只需要为接受设值注入的属性提供setter方法;
c.生命周期:JavaBean作为值对象传递,不接受任何容器管理其生命周期,bean的生命周期由Spring管理。
1.2bean的实例化
三种方法进行bean的实例化
a.调用构造器new一个bean实例
b.BeanFactory调用某个工厂类的静态工厂方法创建bean
c.BeanFactory调用实例工厂方法创建bean
(1)调用构造器new一个Bean实例
a.对于采用设值注入的bean,提供无参数的构造器,BeanFactory通过调用该构造器创建bean的实例,但没有为它注入属性值和依赖关系,通过默认的构造函数实例化该bean;
b.BeanFactory创建bean的实例后,根据配置文件决定依赖关系,最后将一个完整的bean返回给程序;
c.创建BeanFactory实例->BeanFactory实例通过调用默认构造器创建Bean的实例,并设置为默认值->BeanFactory根据定义文件对Bean进行依赖注入->返回一个JavaBean实例
(2)调用工厂类的静态工厂方法创建bean
a.class属性确定静态工厂类,而非bean的实现类,使用factory-method属性确定创建bean实例的方法名,如果方法需要参数,通过<constructor-arg>确定
(3)调用实例工厂方法创建bean
依赖注入的属性,均由property元素确定参数值。