0


Spring | Spring中的Bean--上

目录:

Spring中的Bean:

1.Bean的配置

  • Spring可以被看作是个一个大型工厂, 这个工厂的作用就是生产和管理Sping容器中的Bean。如果想要在项目中使用这个工厂,就需要开发者对Spring的配置文件进行配置
  • Spring容器支持 XMLProperties 两种格式的配置文件,在实际开发中,最常使用的就是XML格式的配置方式。这种配置方式通过XML文件注册并管理Bean之间的依赖关系
  • 在Spring中,XML配置文件的根元素 <beans**>标签, <bean**s**>中包含了多个<bean>子元素,每一个<bean>子元素定义了一个Bean并描述了该Bean如何被装配到Spring容器中。<bean>元素中同样包含了多个属性以及子元素,**如下表所示
  • 属性或子元素名称描述id是一个Bean唯一标识符,Spring容器对Bean的配置、管理都通过该 (id) 属性来完成。name****Spring容器同样可以通过此 (name) 属性容器中的Bean进行配置管理,name属性中可以为Bean指定多个名称,每个名称之间用逗号或分号隔开。class该属性指定了Bean具体实现类,它必须是一个完整的类名,使用类的全限定名。(如果Bean中没指定idnamespring会将class值当做id来使用)scope用来设定Bean实例的作用域,其属性值有: singleton(单例)、prototype(原型)、requestsessionglobal****Sessionapplicationwebsocket。其默认值singletonconstructor-arg<bean>元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的index属性指定构造参数的序号(从0开始),type属性指定构造参数的类型,参数值可以通过ref属性 或value属性直接指定,也可以通过ref或value子元素指定。property<bean>元素的子元素,用于调用Bean实例中的stter方法完成属性赋值从而完成依赖注入。该元素的name属性指定Bean实例中的相应属性名ref 属性value属性用于指定参数值refproperty、constructor-arg等元素的属性子元素,可以用于指定Bean工厂中某个Bean实例valueproperty、constructor-arg等元素的属性子元素,可以用于直接指定一个常量值list用于封装List数组类型的依赖注入。set用于封装Set类型属性的依赖注入。map用于封装Map类型属性的依赖注入。****entry<map>元素的子元素,用于设置一个键值对。其key属性指定字符串类型的键值,refvalue子元素指定其值,也可以通过value-ref或value属性指定其值。
  • 配置文件中,通常一个普通的Bean只需要定义id(或name)和class两个属性即可,例子如下<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 该Bean的id(唯一标识符)为: bean1 ,其对应的实现类为com.Test.Bean1 --><beanid="bean1"class="com.Test.Bean1"/><!-- 使用name属性定义bean2,其对应的实现类为com.Test.Bean2 --><beanid="bean1"class="com.Test.Bean2"/></beans>

​ 上述例子中,分别使用配置文件中的id属性和name属性定义了两个bean,并用class元素指定其对应的实现类。(如果Bean中没指定idnamespring会将class值当做id来使用)

2.Bean的实例化

  • 在面向对象的程序中,想要使用某个对象,就需要先实例化这个对象。同样,在Spring中,要想使用容器中的Bean,也需要实例化Bean
  • 实例化Bean三种方式,分别为①****构造器实例化 (最常用)、②****静态工厂方式实例化③****实例工厂方式实例化,其中最常用的是构造器实例化。ps : 下面只具体讲解常用的 构造器实例化

2.1 构造器实例化

  • 构造器实例化指Spring容器通过Bean对应类中默认的无参构造方法实例化Bean
  • 在com.instance.constructor包下创建Bean1.javabean1.xml****Bean1.javapublicclassBean1{}bean1.xml<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 在该配置文件中将 Bean1类 作为 Bean加入到 Spring容器中 --><!-- 该Bean的唯一标识/id为: bean1 --><beanid="bean1"class="com.instance.constructor.Bean1"/></beans>InstanceTest1.javapublicclassInstanceTest1{publicstaticvoidmain(String[] args){//创建管理Bean的ApplicationContext (其底层也是IOC容器在管理Bean)ApplicationContext applicationContext =newClassPathXmlApplicationContext("com/instance/constructor/bean1.xml");//获得容器职工存储的BeanBean1 bean =(Bean1) applicationContext.getBean("bean1");System.out.println(bean);}}

3.Bean的作用域

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

3.1 作用域的种类

  • Spring4.3中为 Bean的实例定义了7种作用域,如下表所示。作用域名称说明singleton (单例)使用singleton定义的Bean在Spring容器中将 只有一个实例,也就是说,无论有多少个Bean引用它,始终将指向同一个对象(spring容器创建一个Bean实例,共享使用,使用的都是同一个Bean)。这也是Spring容器默认的作用域prototype (原型)每次通过Spring容器获取的prototype定义的Bean时,容器都将 创建一个新的Bean实例request在一次HTTP请求中,容器会返回该Bean的同一个实例。对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Request内有效。session在一次HTTP Session中,容器会返回该Bean的同一个实例。对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Session内有效。globalSession在一个全局的HTTP Session中,容器会返回该Bean的同一个实例。 仅在使用portle上下文时有效。application为每个SenletContext对象创建一个实例。仅在Web相关的AplcatinConext中生效。websocket为每个websocket对象创建一个实例。仅在Web相关的AplcationContext中生效。

3.2 singleton作用域

  • singletonSpring容器默认作用域 (创建一个Bean实例,然后共享/共同使用这个bean),当Bean的作用域为singleton时,Spring 都只会存在一个共享Bean实例(一个Bean被共享使用),并且所有对Bean的请求,只要id 与 该Beanid属性相匹配就会返回同一个Bean实例。
  • singleton 作用域对于无会话状态的Bean (如Dao组件、Service组件)来说,是最理想的选择。
  • Spring配置文件中,Bean的作用域是通过<bean>元素的scope属性来指定的,该属性可以设置为singleton、prototype、request、session、globalSession、application 和 websocket 七个值,分别表示表Bean七种作用域例子如下 :****Scope.javapackagecom.scope;publicclassScope{}1 applicationContext.xml<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 把Scope类作为Bean添加到容器中 --><!-- 设置该Bean的作用域范围是 : singleton(不过默认的也是singleton) singleton : 该Bean在容器中只有一个实例,也就是无论需要多个Bean,使用/依赖注入的都是同一个Bean实例 (输出的地址信息都是一致的) --><beanid="scope"class="com.scope.Scope"scope="singleton"/></beans>1 ScopeTest.javapackagecom.scope;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassScopeTest{publicstaticvoidmain(String[] args){//1.配置文件路径String xmlPath ="com/scope/applicationContext.xml";//2.加载配置文件ApplicationContext applicationContext =newClassPathXmlApplicationContext(xmlPath);//输出实例System.out.println(applicationContext.getBean("scope"));//[email protected](applicationContext.getBean("scope"));//com.scope.Scope@737996a0/* 此处从spring容器中获得了两个bean,但id是一致的,且设置的作用域范围是: singleton, 所以这两个Bean都是同一个Bean的实例,两个Bean的地址信息都是一致的。 */}}ScopeTest测试类运行结果如下:在这里插入图片描述 从图可以看出 ,两次输出结果相同,这说明Spring容器只创建了一个Scope类的实例。需要注意的是,如果不设置 scope=“singleton”,其输出结果也是一个实例,因为Spring容器默认的作用域就是singleton

3.3 prototype 作用域

  • 对需要保持会话状态Bean (如Struts2的Action 类) 应该使用prototype作用域。在使用prototype作用域时,Spring 容器会为每个对该Bean的请求都创建一个新的实例 (**每次都是实例化一个新的Bean)**。
  • 要将Bean定义为prototype 作用域,只需在配置文件中将<bean>元素的scope属性值设置为prototype 即可,其示例代码如下。<!-- 该Bean的作用域范围是 : prototype prototype : Spring容器会为每个对该Bean的请求都创建一个新的实例--><beanid="scope"class="com.scope.Scope"scope="prototype"/>ApplicationContext中的Bean的作用域范围改为: prototype 后,测试类运行结果如下 :在这里插入图片描述

由运行结果可知,两次输出Bean实例并不相同,这说明在prototype作用域下,创建了两个不同的Scope实例

标签: spring java 后端

本文转载自: https://blog.csdn.net/m0_70720417/article/details/135638953
版权归原作者 一只大皮卡丘 所有, 如有侵权,请联系我们删除。

“Spring | Spring中的Bean--上”的评论:

还没有评论