在您的应用程序中,由Spring IoC容器治理的造成其外围的对象被称为"bean"。一个bean是由Spring IoC容器实例化、组装和治理的对象。这些bean是通过您提供给容器的配置元数据创立的,例如,在后面章节中曾经看到的XML <bean/>
定义。
Bean定义蕴含了所谓的配置元数据,容器须要理解以下内容:
- 如何创立一个bean
- Bean的生命周期详细信息
- Bean的依赖关系
上述所有的配置元数据都转化为每个bean定义的以下属性汇合。
序号 | 属性和形容 |
---|---|
1 | class |
这是必填属性,指定要用于创立bean的bean类。 | |
2 | name |
此属性惟一地指定bean标识符。在基于XML的配置元数据中,您能够应用id和/或name属性来指定bean标识符。 | |
3 | scope |
此属性指定从特定bean定义创立的对象的范畴,将在bean范畴章节中探讨。 | |
4 | constructor-arg |
这用于注入依赖项,将在后续章节中探讨。 | |
5 | properties |
这用于注入依赖项,将在后续章节中探讨。 | |
6 | autowiring mode |
这用于注入依赖项,将在后续章节中探讨。 | |
7 | lazy-initialization mode |
提早初始化的bean通知IoC容器在首次申请时创立bean实例,而不是在启动时创立。 | |
8 | initialization method |
在容器设置了bean的所有必须属性之后,要调用的回调函数。将在bean生命周期章节中探讨。 | |
9 | destruction method |
在蕴含bean的容器销毁时要应用的回调函数。将在bean生命周期章节中探讨。 |
Spring配置元数据
Spring IoC容器与理论编写配置元数据的格局齐全解耦。以下是向Spring容器提供配置元数据的三种重要办法:
- 基于XML的配置文件。
- 基于注解的配置。
- 基于Java的配置。
您曾经看到了如何将基于XML的配置元数据提供给容器,但让咱们看一下蕴含不同bean定义的XML配置文件的另一个示例,包含提早初始化、初始化办法和销毁办法。
<?xml version = "1.0" encoding = "UTF-8"?><beans xmlns = "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-3.0.xsd"> <!-- 一个简略的bean定义 --> <bean id = "..." class = "..."> <!-- 此处是该bean的协作者和配置 --> </bean> <!-- 启用提早初始化的bean定义 --> <bean id = "..." class = "..." lazy-init = "true"> <!-- 此处是该bean的协作者和配置 --> </bean> <!-- 具备初始化办法的bean定义 --> <bean id = "..." class = "..." init-method = "..."> <!-- 此处是该bean的协作者和配置 --> </bean> <!-- 具备销毁办法的bean定义 --> <bean id = "..." class = "..." destroy-method = "..."> <!-- 此处是该bean的协作者和配置 --> </bean> <!-- 更多的bean定义在此处 -->
Spring中的Bean作用域
在定义<bean>
时,您能够抉择为该bean申明一个作用域。例如,要强制Spring每次须要时生成新的bean实例,您应该将bean的作用域属性申明为prototype。相似地,如果您心愿Spring每次须要时返回雷同的bean实例,您应该将bean的作用域属性申明为singleton。
Spring Framework反对以下五种作用域,其中三种仅在应用与Web相干的ApplicationContext时才可用。
序号 | 作用域 & 形容 |
---|---|
1 | singleton |
将bean定义的作用域限度为Spring IoC容器中的单个实例(默认)。 | |
2 | prototype |
将单个bean定义的作用域限度为具备任意数量的对象实例。 | |
3 | request |
将bean定义的作用域限度为HTTP申请。仅在具备与Web相干的Spring ApplicationContext的状况下无效。 | |
4 | session |
将bean定义的作用域限度为HTTP会话。仅在具备与Web相干的Spring ApplicationContext的状况下无效。 | |
5 | global-session |
将bean定义的作用域限度为全局HTTP会话。仅在具备与Web相干的Spring ApplicationContext的状况下无效。 |
在本章中,咱们将探讨前两种作用域,当探讨与Web相干的Spring ApplicationContext时,将探讨其余三种作用域。
单例作用域(singleton)
如果将作用域设置为singleton,Spring IoC容器将创立一个对象的确切实例,该实例由bean定义定义。此单个实例存储在此类单例bean的缓存中,对于该命名bean的所有后续申请和援用都会返回缓存的对象。
默认作用域始终是singleton。然而,当您须要一个且仅一个bean实例时,您能够在bean配置文件中将作用域属性设置为singleton,如下所示:
<!-- 具备singleton作用域的bean定义 --><bean id="..." class="..." scope="singleton"> <!-- 此处搁置此bean的协作者和配置 -->
示例
假如您曾经筹备好Eclipse IDE,并采取以下步骤创立Spring应用程序:
步骤 形容 1 创立一个名为SpringExample的我的项目,在创立的我的项目中的src文件夹下创立一个名为com.tutorialspoint的包。 2 应用"Add External JARs"选项增加所需的Spring库,如Spring Hello World示例章节中所述。 3 在com.tutorialspoint包下创立Java类HelloWorld和MainApp。 4 在src文件夹下创立Beans配置文件Beans.xml。 5 最初一步是创立所有Java文件和Bean配置文件的内容,并按以下阐明运行应用程序。
以下是HelloWorld.java文件的内容:
package com.tutorialspoint;public class HelloWorld { private String message; public void setMessage(String message){ this.message = message; } public void getMessage(){ System.out.println("Your Message : " + message); }}
以下是MainApp.java文件的内容:
package com.tutorialspoint;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); HelloWorld objA = (HelloWorld) context.getBean("helloWorld"); objA.setMessage("I'm object A"); objA.getMessage(); HelloWorld objB = (HelloWorld) context.getBean("helloWorld"); objB.getMessage(); }}
以下是singleton作用域所需的Beans.xml配置文件的内容:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="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-3.0.xsd"> <bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="singleton"> </bean></beans>
当您实现创立源代码和bean配置文件后,让咱们运行应用程序。如果您的应用程序一切正常,它将打印以下音讯:
Your Message : I'm object AYour Message : I'm object A
原型作用域(prototype)
如果将作用域设置为prototype,Spring IoC容器将在每次申请特定bean时创立该对象的新bean实例。通常,对于所有有状态的bean,应用prototype作用域,对于无状态的bean,应用singleton作用域。
要定义原型作用域,您能够在bean配置文件中将作用域属性设置为prototype,如下所示:
<!-- 具备prototype作用域的bean定义 --><bean id="..." class="..." scope="prototype"> <!-- 此处搁置此bean的协作者和配置 --></bean>
示例
假如您曾经筹备好Eclipse IDE,并采取以下步骤创立Spring应用程序:
步骤 形容 1 创立一个名为SpringExample的我的项目,在创立的我的项目中的src文件夹下创立一个名为com.tutorialspoint的包。 2 应用"Add External JARs"选项增加所需的Spring库,如Spring Hello World示例章节中所述。 3 在com.tutorialspoint包下创立Java类HelloWorld和MainApp。 4 在src文件夹下创立Beans配置文件Beans.xml。 5 最初一步是创立所有Java文件和Bean配置文件的内容,并按以下阐明运行应用程序。
以下是HelloWorld.java文件的内容:
package com.tutorialspoint;public class HelloWorld { private String message; public void setMessage(String message){ this.message = message; } public void getMessage(){ System.out.println("Your Message : " + message); }}
以下是MainApp.java文件的内容
package com.tutorialspoint;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); HelloWorld objA = (HelloWorld) context.getBean("helloWorld"); objA.setMessage("I'm object A"); objA.getMessage(); HelloWorld objB = (HelloWorld) context.getBean("helloWorld"); objB.getMessage(); }}
以下是prototype作用域所需的Beans.xml配置文件的内容:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="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-3.0.xsd"> <bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="prototype"> </bean></beans>
当您实现创立源代码和bean配置文件后,让咱们运行应用程序。如果您的应用程序一切正常,它将打印以下音讯:
Your Message : I'm object AYour Message : null
最初
为了不便其余设施和平台的小伙伴观看往期文章,链接奉上:
公众号搜寻Let us Coding
,知乎,开源中国,CSDN,思否,掘金,InfoQ,简书,博客园,慕课,51CTO,helloworld,腾讯开发者社区,阿里开发者社区
看完如果感觉有帮忙,欢送点赞、珍藏和关注