作用域 | 描述 |
---|---|
singleton | 单例模式,singleton是默认的作用域,当定义Bean时没有指定scope配置项,Bean的作用域被默认为singleton。singleton属于单例模式,在整个系统上下文环境中,仅有一个Bean实例。 |
prototype | 原型模式,当一个Bean的作用域被定义prototype时,程序每次从IOC容器获取的Bean都是一个新的实例。 |
request | http请求,bean作用于HTTP request生命周期,每个request有通过bean创建的实例。 |
session | 会话,bean作用于session生命周期。 |
global-session | 全局会话,bean作用于全局的session生命周期。 |
参考了:https://www.cnblogs.com/best/p/5727935.html
这里主要对单例对象与多例对象进行说明:
单例对象:
scope="singleton"
一个应用只用一个实例对象
生命周期与容器相关,当容器创建时对象产生,当对象销毁时对象销毁。
多例对象:
scope="prototype"
每次访问对象时,都会重新创建对象实例。
生命周期与使用有关,当需要使用时创建对象,当对象长时间不使用,则被垃圾回收机制进行回收。
2、bean的实例化
bean有三种实例化方式:无参构造、静态工厂、实例工厂
2.1、无参构造
默认情况下会根据无参构造方法进行对象的实例化。
若没有无参构造方法则会创建失败。
<bean id="wanger" class="com.luis.dto.Person"></bean>
2.2、静态工厂
使用静态工厂创建实例,其中:
id 属性:指定 bean 的 id,用于从容器中获取
class 属性:指定静态工厂的全限定类名
factory-method 属性:指定生产对象的静态方法
<bean id="person" class="com.luis.factory.StaticFactory" factory-method="createPerson"/>
2.3、实例工厂
将工厂的创建交给Spring进行,使用工厂bean调用方法创建实例化对象。其中:
factory-bean 属性:用于指定实例工厂 bean 的 id。
factory-method 属性:用于指定实例工厂中创建对象的方法。
<bean id="instancFactory" class="com.luis.factory.PersonFactory"/><bean id="person" factory-bean="instancFactory" factory-method="createPerson"/>
二、DI配置
依赖注入(Dependency Injection)是 spring 框架核心 IoC 的具体实现。依赖指的是bean的属性,包括:简单类型(8种基本类型和String类型)的属性、POJO类型的属性、集合数组类型的属性。我们通过控制反转将实例化对象的交给IoC进行,但创建的对象没有依赖,因而需要Spring维护依赖关系,即依赖注入。
1、依赖注入的方式
1.1、构造方法注入
使用类中的构造函数,给成员变量赋值,,通过在xml文件中的bean进行配置的方式给对象赋值。
构造方法注入涉及的标签:
constructor-arg
index:指定参数在构造函数参数列表的索引位置
name:指定参数在构造函数中的名称
value:它能赋的值是基本数据类型和 String 类型
ref:它能赋的值是其他 bean 类型,且必须是在配置文件中配置过的 bean
Spring配置文件xml中的配置如下:
使用参数名称指定参数
<bean id="zhangsan" class="com.luis.dto.Person"> <constructor-arg name = "name" value ="张三"></constructor-arg> <constructor-arg name = "age" value ="22"></constructor-arg></bean>
通过索引指定参数
<bean id="zhangsan" class="com.luis.dto.Person"> <constructor-arg index = "0" value ="张三"></constructor-arg> <constructor-arg index = "1" value ="22"></constructor-arg></bean>
1.2、set方法注入
set方法注入又分为手动装配方式注入和自动装配方式注入。
手动装配
通过bean标签的子标签property来完成,且需要在在类中指定setter方法。
自动装配(注解方式进行),会在Spring的注解使用进行说明
作用一:查找实例,从spring容器中根据Bean的类型(byType)获取实例。
作用二:赋值,将找到的实例,装配给另一个实例的属性值。
注意事项:一个Java类型在同一个spring容器中,只能有一个实例
@Autowired:
@Resource:
作用一:查找实例,从spring容器中根据Bean的名称(byName)获取实例。
作用二:赋值,将找到的实例,装配给另一个实例的属性值。
xml方式的示例代码如下:
public class Address { private String country; private String city; public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } @Override public String toString() { return "Address [country=" + country + ", city=" + city + "]"; } }
Spring配置文件xml-ioc-01.xml中的配置如下:
<bean name="address" class="com.luis.dto.Address"> <property name = "country" value ="中国"></property> <property name = "city" value ="西安"></property></bean>
可以简写为:
<bean id="address" class="com.luis.dto.Address" p:country="中国" p:city="西安"></bean>
1.3、p空间名称注入
p名称注入是set方法的一种简写方式,首先需引入p命名空间:
xmlns:p="http://www.springframework.org/schema/p"
p名称空间的语法:p:属性名 = ""
和 p:属性名-ref = ""
上面的set注入可以简写为:
<bean id="address" class="com.luis.dto.Address" p:country="中国" p:city="西安"></bean>
若对象中有引用对象,则:
<bean name="address" class="com.luis.dto.Address"></bean><bean id="person" class="com.luis.dto.Person" p:pname="田七" p:age="22" p:address-ref="address"/>
2、不同属性依赖注入
2.1、简单类型
<!-- 构造方法注入 --><bean id="lisi" class="com.luis.dto.Person"> <constructor-arg name = "name" value ="李四"></constructor-arg> <constructor-arg name = "age" value ="22"></constructor-arg></bean><!-- 构造方法注入 --><bean id="wangwu" class="com.luis.dto.Person"> <constructor-arg index = "0" value ="王五"></constructor-arg> <constructor-arg index = "1" value ="22"></constructor-arg></bean><!-- set方法注入 --><bean name="address" class="com.luis.dto.Address"> <property name = "country" value ="中国"></property> <property name = "city" value ="西安"></property></bean><!-- p空间名称注入 --><bean id="address" class="com.luis.dto.Address" p:country="中国" p:city="西安"></bean>
2.2、引用类型
<bean id="address" class="com.luis.dto.Address"> <property name = "country" value ="中国"></property> <property name = "city" value ="西安"></property></bean><!-- 构造方法注入 --><bean id="zhaoliu" class="com.luis.dto.Person"> <constructor-arg index = "0" value ="赵六"></constructor-arg> <constructor-arg index = "1" value ="22"></constructor-arg> <constructor-arg index = "2" ref ="address"></constructor-arg></bean><!-- set方法注入 --><bean id="tianqi" class="com.luis.dto.Person"> <property name = "name" value ="田七"></property> <property name = "age" value ="22"></property> <property name = "address" ref ="address"></property></bean><!-- p空间名称注入 --><bean id="person" class="com.luis.dto.Person" p:pname="田七" p:age="22" p:address-ref="address"/>
2.3、集合类型
不同的集合类型,注入方式也有所区别:
1、数组或List集合
<bean id="person" class="com.luis.dto.Person"> <property name="arrs"> <list> <!-- 如果集合内是简单类型,使用value子标签,如果是POJO类型,则使用bean标签 --> <value>张三</value> <value>李四</value> <!-- <bean></bean> --> </list> </property></bean>
2、Set集合
<property name="sets"> <set> <!-- 如果集合内是简单类型,使用value子标签,如果是POJO类型,则使用bean标签 --> <value>张三</value> <value>李四</value> </set></property>
3、Map集合
<property name="map"> <map> <entry key="张三" value="38"/> <entry key="李四" value="38"/> <entry key="王五" value="29"/> </map></property>
4、Properties集合
<property name="pro"> <props> <prop key="uname">root</prop> <prop key="pass">123</prop> </props></property>
作者:紫焱
出处:https://www.cnblogs.com/liuyi6/p/10217096.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章