IoC的配置是通过Spring的xml文件的bean标签进行的。
bean标签一般是在xml文件进行配置的,xml文件一般样式如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
beans>
可在其中进行bean标签的配置。
bean标签用于配置被spring容器管理的bean的信息
注意:bean标签配置的bean的创建默认是调用无参数的构造方法,若没有无参构造方法则不能创建成功。
lazy-init="true"
使得Ioc容器在第一次需要bean的时候进行实例化。示例xml代码如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="wanger" class="com.luis.dto.Person">bean>
<bean id="zhangsan" class="com.luis.dto.Person" init-method="init" destroy-method="over">bean>
<bean id="lisi" class="com.luis.dto.Person" scope="prototype">bean>
<bean id="lazy" class="com.luis.dto.Person" lazy-init="true"/>beans>
<bean name="address" class="com.luis.dto.Address">bean>
beans>
注意:id和name的区别
Bean标签提供了两种标识Bean的Attribute:id和name
示例代码如下:
<bean id="person" class="com.luis.dto.Student">bean>
<bean name="person" class="com.luis.dto.Teacher">bean>
若置bean的时候并没有声明ID属性,则采用全类限定名作为bean的id,此时称为匿名bean
<bean class="com.learnSpring.hellWorld"/>
<bean class="com.learnSpring.hellWorld"/>
<bean class="com.learnSpring.hellWorld"/>
如果存在多个class属性都是一样的匿名的Bean,则根据Spring读取配置文件的顺序生成id。
"com.learnSpring.hellWorld"
"com.learnSpring.hellWorld#0"
"com.learnSpring.hellWorld#1"
我们可在xml文件中通过bean标签的scope属性指定作用域,其取值区别如下表:
作用域 | 描述 |
---|---|
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"
bean有三种实例化方式:无参构造、静态工厂、实例工厂
默认情况下会根据无参构造方法进行对象的实例化。
若没有无参构造方法则会创建失败。
<bean id="wanger" class="com.luis.dto.Person">bean>
使用静态工厂创建实例,其中:
<bean id="person" class="com.luis.factory.StaticFactory" factory-method="createPerson"/>
将工厂的创建交给Spring进行,使用工厂bean调用方法创建实例化对象。其中:
<bean id="instancFactory" class="com.luis.factory.PersonFactory"/>
<bean id="person" factory-bean="instancFactory" factory-method="createPerson"/>
依赖注入(Dependency Injection)是 spring 框架核心 IoC 的具体实现。依赖指的是bean的属性,包括:简单类型(8种基本类型和String类型)的属性、POJO类型的属性、集合数组类型的属性。我们通过控制反转将实例化对象的交给IoC进行,但创建的对象没有依赖,因而需要Spring维护依赖关系,即依赖注入。
使用类中的构造函数,给成员变量赋值,,通过在xml文件中的bean进行配置的方式给对象赋值。
构造方法注入涉及的标签:
constructor-arg
index:指定参数在构造函数参数列表的索引位置
name:指定参数在构造函数中的名称
value:它能赋的值是基本数据类型和 String 类型
ref:它能赋的值是其他 bean 类型,且必须是在配置文件中配置过的 bean
Spring配置文件xml中的配置如下:
<bean id="zhangsan" class="com.luis.dto.Person">
constructor-arg>
constructor-arg>
bean>
<bean id="zhangsan" class="com.luis.dto.Person">
constructor-arg>
constructor-arg>
bean>
set方法注入又分为手动装配方式注入和自动装配方式注入。
通过bean标签的子标签property来完成,且需要在在类中指定setter方法。
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>
property>
bean>
可以简写为:
<bean id="address" class="com.luis.dto.Address" p:country="中国" p:city="西安">bean>
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"/>
<bean id="lisi" class="com.luis.dto.Person">
constructor-arg>
constructor-arg>
bean>
<bean id="wangwu" class="com.luis.dto.Person">
constructor-arg>
constructor-arg>
bean>
<bean name="address" class="com.luis.dto.Address">
property>
property>
bean>
<bean id="address" class="com.luis.dto.Address" p:country="中国" p:city="西安">bean>
<bean id="address" class="com.luis.dto.Address">
property>
property>
bean>
<bean id="zhaoliu" class="com.luis.dto.Person">
constructor-arg>
constructor-arg>
constructor-arg>
bean>
<bean id="tianqi" class="com.luis.dto.Person">
property>
property>
property>
bean>
<bean id="person" class="com.luis.dto.Person" p:pname="田七" p:age="22" p:address-ref="address"/>
不同的集合类型,注入方式也有所区别:
1、数组或List集合
<bean id="person" class="com.luis.dto.Person">
<property name="arrs">
<list>
<value>张三value>
<value>李四value>
list>
property>
bean>
2、Set集合
<property name="sets">
<set>
<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">rootprop>
<prop key="pass">123prop>
props>
property>