Spring入门学习——第二章 Spring中的Bean

第二章 Spring中的Bean

2.1 Bean的配置

Spring可以看作一个大型工厂,这个工厂的作用就是生产和管理Sping容器中的Bean。
Spring容器支持XML和Proproties两种格式的配置文件,在实际开发中,最常使用的就是XML格式的配置方式。这种配置方式通过XML文件来注册并管理Bean之间的依赖关系。
在Spring容器中,XML文件的根元素是,中包含了多个子元素,每一个中定义了一个Bean,并描述了该Bean如何被装配到Spring容器中。
元素中同样包含了多个属性以及子元素,如下图所示。
Spring入门学习——第二章 Spring中的Bean_第1张图片
如果在Bean中未指定id和name,则Spring会将class值当做id来使用。

2.2 Bean的实例化

在面向对象的程序中,想要使用某个对象,就要先对该对象进行实例化。同理,在Spring中,要想使用容器中的Bean,也需要实例化Bean。实例化方式如下:

2.2.1 构造器实例化(最常用的实例化方式)

构造器实例化是指Spring容器通过Bean对应类中默认的无参构造方法来实例化Bean。
Spring入门学习——第二章 Spring中的Bean_第2张图片

2.2.2 静态工厂方式实例化

该方式要求开发者创建一个静态工厂的方法来创建Bean的实例,其Bean配置中的calss属性所指定的不再是bean实例的实现类,而是静态工程类,同时还需要使用factory-method属性来指定所创建的静态工厂方法。
静态工厂类MyBean2Factory
Spring入门学习——第二章 Spring中的Bean_第3张图片
bean.xml
在这里插入图片描述

2.2.3 实例工厂方式实例化

此种方式的工厂类中,不再使用静态方法创建Bean实例,而是采用直接创建Bean实例的方式。同时,在配置文件中,需要实例化的Bean也不是通过class属性直接指向的实例化类,而是通过factory-bean属性指向配置的实例工厂,然后通过factort-method属性确定使用工厂中的哪个方法。
Spring入门学习——第二章 Spring中的Bean_第4张图片
bean.xml
Spring入门学习——第二章 Spring中的Bean_第5张图片

2.3 Bean的作用域

通过Spring容器创建一个bean的实例时,不仅可以完成bean的实例化,还可以为Bean指定特定的作用域。

2.3.1 作用域的种类

Bean的作用域如下图所示。
Spring入门学习——第二章 Spring中的Bean_第6张图片
Spring入门学习——第二章 Spring中的Bean_第7张图片
其中,singleton和prototype最为常用。

2.3.2 singleton作用域(Spring默认作用域)

singleton是spring容器默认的作用域,当Bean的作用域为singleton时,Spring容器就只会存在一个共享的Bean实例,并且所有对该Bean的请求,只要id与该Bean的id属性匹配,就会返回同一个Bean实例。Sinleton作用域对于无会话状态的Bean(如Dao组件、Service组件等)来说,是最理想的选择。
在Spring配置文件中,Bean的作用域是通过元素的scop属性来指定的。
bean.xml
在这里插入图片描述
Test.java
Spring入门学习——第二章 Spring中的Bean_第8张图片
控制台输出:
在这里插入图片描述
从结果可以看出来,两次调用ac.getBean(“scope”)获取的都是同一个实例,说明spring容器只创建了一个Scope类的实例。

2.3.3 prototype作用域

对需要保持会话对象的Bean(如Struts2的Action类)应该使用prototype作用域。在使用prototype作用域时,Spring容器会为每个该Bean的请求都创建一个新的实例。
Bean.xml
在这里插入图片描述
控制台输出:
在这里插入图片描述
两次输出的Bean实例并不相同,这说明在prototype的作用域下,创建了两个不同的Scope实例。

2.4 Bean的生命周期

Spring入门学习——第二章 Spring中的Bean_第9张图片
在这里插入图片描述
Spring入门学习——第二章 Spring中的Bean_第10张图片
Spring入门学习——第二章 Spring中的Bean_第11张图片
Spring入门学习——第二章 Spring中的Bean_第12张图片

2.5 Bean的装配方式

Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。

2.5.1 基于XML的装配

Spring提供了两种基于XML的装配方式:设值注入(Setter Injection)和构造注入(Constructor Injection)。
Spring入门学习——第二章 Spring中的Bean_第13张图片
User.java
Spring入门学习——第二章 Spring中的Bean_第14张图片
Bean.xml
Spring入门学习——第二章 Spring中的Bean_第15张图片
控制台输出:
在这里插入图片描述

2.5.2 基于Annotation的装配

在Spring中,尽管使用XML配置文件可以实现Bean的装配工作,但如果应用中有很多Bean时,会导致配置文件过于臃肿,不利于后续的维护和升级。为此,Spring提供了对Annotation(注解)的全面支持。
Spring入门学习——第二章 Spring中的Bean_第16张图片
如下案例是对上述注解的使用(没添加接口文件)。
UserDaoImpl.java
Spring入门学习——第二章 Spring中的Bean_第17张图片
UserServiceImpl.java
Spring入门学习——第二章 Spring中的Bean_第18张图片
UserController.java
Spring入门学习——第二章 Spring中的Bean_第19张图片
Bean.xml
Spring入门学习——第二章 Spring中的Bean_第20张图片
AnnotationAssembleTest.java
Spring入门学习——第二章 Spring中的Bean_第21张图片
控制台输出:
在这里插入图片描述
从控制台输出的结果可以看出,Spring容器已经成功获取UserController的实例,并通过调用实例中的方法执行了各层的输出语句,这说明已经成功实现了基于Annotation的装配。
注意:上述的@Resouce注解替换为@Autowired,也可以达到同样的效果。

2.5.3 自动装配

Spring入门学习——第二章 Spring中的Bean_第22张图片
Bean.xml
Spring入门学习——第二章 Spring中的Bean_第23张图片
Spring入门学习——第二章 Spring中的Bean_第24张图片
控制台输出语句:
在这里插入图片描述

你可能感兴趣的:(Spring入门学习)