版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Bean的配置Bean的实例化Bean配置方式Bean的作用域Bean的生命周期第7章
SpringBean2024/1/29学习目标/Target2了解Bean的常用属性及其子元素掌握实例化Bean的3种方式
熟悉Bean的作用域和生命周期
了解常用作用域singleton和prototype
掌握Bean的3种装配方式章节概述/Summary3第6章详细讲解了控制反转和依赖注入,它们实现了组件的实例化不再由应用程序完成,转而交由Spring容器完成,从而将组件之间的依赖关系进行了解耦。控制反转和依赖注入都是通过Bean实现的,Bean是注册到Spring容器中的Java类,任何一个Java类都可以是一个Bean。Bean由Spring进行管理,本章将针对Bean的管理进行详细讲解。目录/CONTENTSBean的配置Bean的作用域Bean配置方式Bean的实例化4Bean的生命周期14325Bean的配置01第7章SpringBean什么是Spring中的Bean?Bean的配置6如果把Spring看做一个大型工厂,则Spring容器中的Bean就是该工厂的产品。要想使用这个工厂生产和管理Bean,就需要在配置文件中告诉它需要哪些Bean,以及需要使用何种方式将这些Bean装配到一起。
小提示:Bean的本质就是Java中的类,而Spring中的Bean其实就是对实体类的引用,来生产Java类对象,从而实现生产和管理Bean。Bean的配置7Spring容器支持两种格式的配置文件XML文件Properties文件
在实际开发中,最常使用的是XML文件格式的配置方式,这种配置方式是通过XML文件来注册并管理Bean之间的依赖关系。Spring容器所支持的配置文件格式
Spring容器支持XML和Properties两种格式的配置文件,在实际开发中,最常用的是XML格式的配置文件。XML是标准的数据传输和存储格式,方便查看和操作数据。在Spring中,XML配置文件的根元素是<beans>,<beans>元素包含<bean>子元素,每个<bean>子元素可以定义一个Bean,通过<bean>元素将Bean注册到Spring容器中。Bean的配置8
XML配置文件的根元素是<beans>,<beans>中包含了多个<bean>子元素,每一个<bean>子元素定义了一个Bean,并描述了该Bean如何被装配到Spring容器中。关于<beans>元素的常用属性如下表所示:属性描述idid属性是<bean>元素的唯一标识符,Spring容器对Bean的配置和管理通过id属性完成,装配Bean时也需要根据id值获取对象。
name
name属性可以为Bean指定多个名称,每个名称之间用逗号或分号隔开。
classclass属性可以指定Bean的具体实现类,其属性值为对象所属类的全路径。scopescope属性用于设定Bean实例的作用范围,其属性值有:singleton(单例)、prototype(原型)、request、session和globalsession。<bean>元素的常用子元素9元素描述<constructor-arg>
使用<constructor-arg>元素可以为Bean的属性指定值。
<property>
<property>元素的作用是调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入。
ref
ref是<property>、<constructor-arg>等元素的属性,可用于指定Bean工厂中某个Bean实例的引用;也可用于指定Bean工厂中某个Bean实例的引用。value
value是<property>、<constructor-arg>等元素的属性,用于直接指定一个常量值;也可以用于直接指定一个常量值。<list><list>元素是<property>等元素的子元素,用于指定Bean的属性类型为List或数组。
<set><set>元素是<property>等元素的子元素,用于指定Bean的属性类型为set。<map><map>元素是<property>等元素的子元素,用于指定Bean的属性类型为Map。<entry>entry>元素是<map>元素的子元素,用于设定一个键值对。<entry>元素的key属性指定字符串类型的键。Bean的配置10
在配置文件中,通常一个普通的Bean只需要定义id(或name)和class两个属性即可,定义Bean的方式如下所示:<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd">
<beanid="bean1"class="com.test.Bean1"/><beanname="bean2"class="com.test.Bean2"/></beans>
小提示:如果在Bean中未指定id和name,则Spring会将class值当作id使用。BeanFactory接口的常用方法BeanFactory接口11方法名称描述getBean(Stringname)根据参数名称获取Bean
getBean(Stringname,Class<T>type)根据参数名称、参数类型获取Bean
<T>TgetBean(Class<T>requiredType)根据参数类型获取Bean
ObjectgetBean(Stringname,Object...args)根据参数名称获取Bean
isTypeMatch(Stringname,ResolvableTypetype)判断是否有与参数名称、参数类型匹配的Bean
Class<?>getType(Stringname)根据参数名称获取类型String[]getAliases(Stringname)根据实例的名字获取实例的别名数组booleancontainsBean(Stringname)根据Bean的名称判断Spring容器是否含有指定的Bean
BeanFactory接口实例的语法格式Spring提供了几个BeanFactory接口的实现类,其中最常用的是XmlBeanFactory,它可以读取XML文件并根据XML文件中的配置信息生成BeanFactory接口的实例,BeanFactory接口的实例用于管理Bean。XmlBeanFactory类读取XML文件生成BeanFactory接口实例的具体语法格式如下。BeanFactory接口12BeanFactorybeanFactory=newXmlBeanFactory (newFileSystemResource(”D:/bean.xml”));ApplicationContext接口的特点
ApplicationContext接口建立在BeanFactory接口的基础之上,它丰富了BeanFactory接口的特性,例如,添加了对国际化、资源访问、事件传播等方面的支持。
ApplicationContext接口可以为单例的Bean实行预初始化,并根据<property>元素执行setter方法,单例的Bean可以直接使用,提升了程序获取Bean实例的性能。ApplicationContext接口13ApplicationContext接口的常用实现类ApplicationContext接口14类名称描述ClassPathXmlApplicationContext
从类路径加载配置文件,实例化ApplicationContext接口FileSystemXmlApplicationContext
从文件系统加载配置文件,实例化ApplicationContext接口AnnotationConfigApplicationContext
从注解中加载配置文件,实例化ApplicationContext接口WebApplicationContext
在Web应用中使用,从相对于Web根目录的路径中加载配置文件,实例化ApplicationContext接口ConfigurableWebApplicationContext扩展了WebApplicationContext类,它可以通过读取XML配置文件的方式实例化WebApplicationContext类Bean的实例化02第7章SpringBeanBean的实例化有哪些方式?Bean的实例化16
在面向对象的程序中,想要使用某个对象,就需要先实例化这个对象。同样,在Spring中,要想使用容器中的Bean,也需要实例化Bean。实例化Bean有三种方式,分别为构造器实例化、静态工厂方式实例化和实例工厂方式实例化(其中最常用的是构造器实例化)。构造器实例化17创建Web项目,导入相关Jar包;创建名为Bean1的Java类;创建Spring配置文件beans1.xml,并配置Bean1实体类Bean;创建测试类,测试程序。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-4.3.xsd"><beanid="bean1"class="com.test.instance.constructor.Bean1"/></beans>
构造器实例化是指Spring容器通过Bean对应的类中默认的构造函数来实例化Bean。接下来演示构造器实例化的使用:publicclassInstanceTest1{publicstaticvoidmain(String[]args){ StringxmlPath="com/test/instance/constructor/beans1.xml";ApplicationContextapplicationContext= newClassPathXmlApplicationContext(xmlPath); Bean1bean=(Bean1)applicationContext.getBean("bean1");System.out.println(bean);}}静态工厂方式实例化18创建名为Bean2的Java类;创建一个Java工厂类,在类中使用静态方法获取Bean2实例;创建Spring配置文件beans2.xml,并配置工厂类Bean;创建测试类,测试程序。<beanid="bean2"class="com.test.instance.static_factory.MyBean2Factory" factory-method="createBean"/>
静态工厂是实例化Bean的另一种方式。该方式要求自己创建一个静态工厂的方法来创建Bean的实例。接下来演示静态工厂实例化的使用:publicclassInstanceTest2{publicstaticvoidmain(String[]args){ StringxmlPath="com/test/instance/static_factory/beans2.xml"; ApplicationContextapplicationContext= newClassPathXmlApplicationContext(xmlPath); System.out.println(applicationContext.getBean("bean2"));}}publicclassMyBean2Factory{ publicstaticBean2createBean(){returnnewBean2();}}实例工厂方式实例化19创建名为Bean3的Java类;创建一个Java工厂类,在类中使用非静态方法获取Bean3实例;创建Spring配置文件beans3.xml,并配置工厂类Bean;创建测试类,测试程序。<beanid="myBean3Factory"class="com.test.instance.factory.MyBean3Factory"/><beanid="bean3"factory-bean="myBean3Factory"factory-method="createBean"/>
实例工厂是采用直接创建Bean实例的方式,在配置文件中,通过factory-bean属性配置一个实例工厂,然后使用factory-method属性确定使用工厂中的哪个方法。接下来演示实例工厂实例化的使用:publicclassInstanceTest3{publicstaticvoidmain(String[]args){ StringxmlPath="com/test/instance/factory/beans3.xml"; ApplicationContextapplicationContext= newClassPathXmlApplicationContext(xmlPath); System.out.println(applicationContext.getBean("bean3"));}}publicclassMyBean3Factory{publicBean3createBean(){returnnewBean3();}}使用不同方式实现Bean的实例化20需求说明修改第6章的案例,开发第一个Spring项目,输出“Hello,Spring!”,具体要求如下。(1)编写HelloSpring.java,输出“Hello,Spring!”。(2)将Spring字符串通过Spring赋值到HelloSpring.java中。(3)分别使用构造器实例化Bean、静态工厂实例化Bean和实例工厂实例化Bean。共性问题集中讲解21常见问题及解决办法代码规范问题调试技巧共性问题集中讲解Bean配置方式
——基于XML的配置03第7章SpringBean什么是Bean的装配?Bean的装配方式23
Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配),本节将主要讲解这三种装配方式的使用。基于XML的装配24基于XML的装配(2种方式)构造注入(ConstructorInjection)设值注入(SetterInjection)必备以下条件必备以下条件Bean类必须有一个无参构造方法Bean类必须为属性提供setter方法Bean类必须提供有参构造方法在配置文件中,使用<property>元素来为每个属性注入值配置文件中,使用<constructor-arg>元素来为参数注入值
基于XML的装配,使用方式如下:创建Java类,提供有参、无参构造以及属性setter方法;创建Spring配置文件beans5.xml,使用2种方式配置Bean;创建测试类,测试程序。<beanid="user1"class="com.test.assemble.User"> <constructor-argindex="0"value="tom"/>...</bean><beanid="user2"class="com.test.assemble.User"> <propertyname=“username”value=“张三”/>...</bean>publicclassXmlBeanAssembleTest{publicstaticvoidmain(String[]args){ StringxmlPath="com/test/assemble/beans5.xml"; ApplicationContextapplicationContext= newClassPathXmlApplicationContext(xmlPath);System.out.println(applicationContext.getBean("user1"));System.out.println(applicationContext.getBean("user2"));}}publicUser(Stringusername,Integerpassword,List<String>list){ super(); this.username=username; this.password=password; this.list=list;}publicUser(){super();}......//省略属性setter方法基于XML的装配25使用构造方法注入实现为属性赋值26需求说明(1)修改第6章的案例,输出内容如下。张三说:“Spring的初衷是使JavaEE轻量级框架开发更加简单。”李四说:“Spring的IoC,也称DI,是OOP中的一种设计理念,用来降低代码之间的耦合度。”(2)将说话人和说话内容都通过构造方法注入。共性问题集中讲解27常见问题及解决办法代码规范问题调试技巧共性问题集中讲解使用p命名空间实现属性setter方法注入28从Spring2.0的配置文件开始采用schema形式,可以使用不同的命名空间管理不同类型的配置,使配置文件更具扩展性。例如,曾经使用AOP命名空间的元素可以实现置入切面的功能,在本章及之后章节内容的学习中读者还会接触更多其他命名空间的配置。此外,Spring基于schema形式的配置为许多领域的问题提供了简化的配置方法,大大简化了配置。<!--使用p命名空间注入属性值--><beanid="user"class="cn.dsscm.pojo.User"p:username="张三"p:age="23"
p:email="zhangsan@163.com"/>使用p命名空间实现属性setter方法注入29对于直接量(基本数据类型、string类型)的属性语法p:属性名="属性值"对于引用Bean的属性语法p:属性名-ref="Bean的id"使用p命名空间实现直接量的注入30需求说明(1)修改本章上机练习2的实现代码,对说话人和说话内容使用p命名空间通过属性setter方法注入。(2)输出内容如下。张三说:“Spring的初衷是使JavaEE轻量级框架开发更加简单。”李四说:“Spring的IoC,也称DI,是OOP中的一种设计理念,用来降低代码之间的耦合度。”共性问题集中讲解31常见问题及解决办法代码规范问题调试技巧共性问题集中讲解注入不同数据类型32注入直接量(基本数据类型、string类型)引用其他Bean引用内部Bean注入集合类型属性注入空字符串和nullBean配置方式
——基于注解的配置04第7章SpringBean基于Annotation的装配34
基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带来一定的困难。为此,Spring提供了对Annotation(注解)技术的全面支持。注解描述@Component指定一个普通的Bean,可以作用在任何层次。@Controller指定一个控制器组件Bean,用于将控制层的类标识为Spring中的Bean,功能上等同于@Component。@Service指定一个业务逻辑组件Bean,用于将业务逻辑层的类标识为Spring中的Bean,功能上等同于@Component。@Repository指定一个数据访问组件Bean,用于将数据访问层的类标识为Spring中的Bean,功能上等同于@Component。@Scope指定Bean实例的作用域。@Value指定Bean实例的注入值。@Autowired指定要自动装配的对象。@Resource指定要注入的对象。@Qualifier指定要自动装配的对象名称,通常与@Autowired联合使用。@PostConstruct指定Bean实例完成初始化后调用的方法。@PreDestroy指定Bean实例销毁前调用的方法。基于Annotation的装配35基于Annotation装配的使用方式如下:JDBC驱动器:由数据库厂商创建,也称为JDBC驱动程序。负责与特定的数据库连接,以及处理通信细节。创建接口UserDao,并定义方法;创建接口实现类UserDaoImpl,用@Repository声明类;创建接口UserService,并定义方法;创建接口实现类UserServiceImpl,用@Service声明类,并使用@Resource注入UserDao属性;创建控制器类,用@Controller声明,并使用@Resource注入UserService属性;创建Spring配置文件,配置Bean;创建测试类,测试程序。@Repository("userDao")publicclassUserDaoImplimplementsUserDao{publicvoidsave(){System.out.println("userdao...save...");}}publicclassAnnotationAssembleTest{publicstaticvoidmain(String[]args){StringxmlPath="com/test/annotation/beans6.xml"; ApplicationContextapplicationContext= newClassPathXmlApplicationContext(xmlPath); UserControlleruserController= (UserController)applicationContext.getBean("userController"); userController.save();}}<context:annotation-config/><beanid="userDao"class="com.test.annotation.UserDaoImpl"/><beanid="userService"class="com.test.annotation.UserServiceImpl"/><beanid="userController"class="com.test.annotation.UserController"/>@Service("userService")publicclassUserServiceImplimplementsUserService{ @Resource(name="userDao") privateUserDaouserDao; publicvoidsave(){ this.userDao.save(); }}@Controller("userController")publicclassUserController{ @Resource(name="userService") privateUserServiceuserService; publicvoidsave(){ this.userService.save(); }}
小提示:
除了可以像示例中通过<bean>元素来配置Bean外,还可以通过包扫描的形式来配置一个包下的所有Bean:<context:component-scanbase-package="com.test.annotation"/>Bean配置方式
——自动配置05第7章SpringBean自动装配37
所谓自动装配,就是将一个Bean自动的注入到到其他Bean的Property中。Spring的<bean>元素中包含一个autowire属性,我们可以通过设置autowire的属性值来自动装配Bean。autowire属性有5个值,其值及说明下表所示:属性值描述default(默认值)由<bean>的上级元素<beans>的default-autowire属性值确定。byName
根据<bean>元素id属性的值自动装配。
byType
根据<bean>元素的数据类型(Type)自动装配,如果一个Bean的数据类型,兼容另一个Bean中的数据类型,则自动装配。constructor根据构造函数参数的数据类型,进行byType模式的自动装配。no默认值,不使用自动装配,Bean依赖必须通过<ref>元素或ref属性定义。自动装配38自动装配,使用方式如下:JDBC驱动器:由数据库厂商创建,也称为JDBC驱动程序。负责与特定的数据库连接,以及处理通信细节。修改上一节UserServiceImple和UserController,分别增加类属性的setter方法;修改Spring配置文件,使用autowire属性配置Bean;重新测试程序。<beanid="userDao"class="com.test.annotation.UserDaoImpl"/><beanid="userService"class="com.test.annotation.UserServiceImpl"autowire="byName"/><beanid="userController"class="com.test.annotation.UserController"autowire="byName"/>Bean的作用域06第7章SpringBean作用域的种类40
Spring中为Bean的实例定义了7种作用域,如下表所示:
注意:在上表7种作用域中,singleton和prototype是最常用的两种作用域。作用域名城描述singleton单例模式。在单例模式下,Spring容器中只会存在一个共享的Bean实例,所有对Bean的请求,只要请求的id(或name)与Bean的定义相匹配,会返回Bean的同一个实例。prototype
原型模式,每次从容器中请求Bean时,都会产生一个新的实例。request每一个HTTP请求都会有自己的Bean实例,该作用域只能在基于Web的SpringApplicationContext中使用。session每一个HTTPsession请求都会有自己的Bean实例,该作用域只能在基于Web的SpringApplicationContext中使用。globalsession限定一个Bean的作用域为Web应用(HTTPsession)的生命周期,只有在Web应用中使用Spring时,该作用域才有效。
Spring中Bean的作用域41singleton与prototype区别:示例新实例getBean()getBean()getBean()新实例新实例<beanid="user"
class="cn.pojo.User"
scope="prototype"/>示例<beanid="user"
class="cn.pojo.User"
scope="singleton"/>
在Spring配置文件中,可以使用<bean>元素的scope属性,将Bean的作用域定义成singleton。singleton作用域42
singleton是Spring容器默认的作用域,当Bean的作用域为singleton时,Spring容器就只会存在一个共享的Bean实例。singleton作用域对于无会话状态的Bean(如Dao组件、Service组件)来说,是最理想的选择。例如:<beanid="scope"class="com.test.scope.Scope"scope="singleton"/>
在Spring中如何配置singleton作用域?
在Spring配置文件中,同样使用<bean>元素的scope属性,将Bean的作用域定义成prototype。prototype作用域43
对需要保持会话状态的Bean(如Struts2的Action类)应该使用prototype作用域。在使用prototype作用域时,Spring容器会为每个对该Be
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人车库买卖合同
- 2024版在线教育平台内容授权使用合同2篇
- 游泳设备采购合同范例
- 电动水泵购买合同范例
- 浙江摊位出租合同范例
- 企业租赁经营合同
- 汽车贷款担保合同
- 简易劳动合同范本版5
- 租房拆墙协议合同范例
- 甘肃买卖合同范例
- Unit 1 Reading and thinking说课课件 高中英语人教版必修第一册
- 《余弦定理》-完整版课件
- 15MW风力机叶片载荷计算与分析解析
- 酒店基础英语培训课件
- 单词记忆方法
- 2022年南京市玄武区社区工作者招聘笔试题库及答案解析
- 高校电子课件:珠算教程(第六版)
- 路面施工技术全套课件
- JJF 1321-2011 元素分析仪校准规范-(高清现行)
- 住宅建筑工程施工重点与难点应对措施方案
- 景区玻璃水滑、玻璃滑道项目申请报告可行性研究报告
评论
0/150
提交评论