参考:https://www.cnblogs.com/android-blogs/p/5530239.html
由Spring管理的对象,默认都是单例的!并且,都是饿汉式的单例模式。
在配置
节点时,可以添加scope
属性其是否单例,当取值为singleton
时表示单例,该值也是默认值,当取值为prototype
时表示非单例:
在单例模式的基础之上,还可以通过lazy-init
属性配置它是否为懒汉式的单例模式,默认值为false
,即非懒汉式,也就是饿汉式的单例模式,当取值为true
时,表示懒汉式的单例模式:
如果某个类被配置为单例模式,还可以配置它的生命周期方法:首先,在类中声明2个方法,这2个方法都应该是public
方法,返回值都是void
,方法名称可以自由定义,方法必须没有参数,例如:
public void init() {
System.out.println("User.init()");
}
public void destroy() {
System.out.println("User.destroy()");
}
然后,在Spring的配置文件中,在
节点中配置init-method
和destroy-method
属性,即可配置初始化方法和销毁方法,这2个属性的取值都是需要调用的方法的名称:
IoC表示Inversion of control,即“控制反转”。传统模式下,对象的创建与管理都是由开发人员编写代码直接完成的,而使用Spring后,将创建与管理交给了框架,则称之为控制反转。
其中,比较重要的环节是为对象的某些属性进行赋值,称之为DI,即Dependency Injection,表示“依赖注入”,通俗的来说,是为其属性赋值,也称之为“为其属性注入值”。
Spring通过DI实现了IoC,即DI是实现手段,而IoC是需要实现的目标。
假设User
类中有名为name
的属性,需要为该属性注入值,首先,需要为该属性添加SET/GET方法(其实只有SET方法是必须的):
public void setName(String name) {
this.name = name;
}
然后,在
节点子级添加
节点进行配置:
其实,框架在处理时,发现有
节点,就会尝试为属性赋值,它会基于该节点的name
属性值得到SET方法的名称,规则就是set
加上属性名且首字母改为大写,得到SET方法名称,如果属性名称是name
,则框架将调用的方法就是setName
,如果属性名称是password
,则框架将调用的方法已经setPassword
,然后,将value
属性对应的值,作为将调用的方法的参数,以上示例代码中的配置,使得框架将调用对象.setName("Kityy");
语句。
所以,在
节点中,name
属性配置的其实是SET方法的方法名右侧的部分,且首字母改为小写!
但是,在实际使用时,SET方法都是由开发工具自动生成,生成规则与Spring框架处理时的规则是完全相同的,所以,也可以简单的认为
节点中配置的name
就是属性的名称!
在某些情况下,需要注入的属性值并不是基本值(可以直接书写的值,例如数值、字符串等),而是另一个类的对象时,可以先使得Spring也管理另一个类的对象,然后,注入值时,通过ref
属性引用那个
即可:
如果某个属性是通过构造方法设置值的,例如:
public class Person {
// 25
private Integer age;
public Person(Integer age) {
super();
this.age = age;
}
@Override
public String toString() {
return "Person [age=" + age + "]";
}
}
则在配置时,应该使用
节点进行配置:
以上属性的配置中,index
表示第几个参数,从0开始顺序编号,然后,根据值的类型选择使用value
或ref
属性进行配置即可!
如果某个类中的属性是List
集合类型的,并需要注入值:
public class SampleBean {
// Alex, Lucy, Kitty, Henry
public List names;
public void setNames(List names) {
this.names = names;
}
}
然后,在Spring的配置文件中:
Alex
Lucy
Kitty
Henry
如果需要注入Set
类型的值,例如:
// Beijing, Shanghai, Guangzhou, Shenzhen
public Set cities;
在配置注入时,使用
节点即可:
Beijing
Shanghai
Guangzhou
Shenzhen
另外,关于Map
类型集合的配置例如:
关于数组类型集合的配置例如:
9
5
2
7
在配置数组时,也可以使用
节点,反之,在配置
List
集合时,也可以使用节点,但是,推荐使用匹配的节点进行配置。
关于Properties
类型的配置:
com.mysql.jdbc.Driver
root
root
在配置以上集合类型的值时,也可以事先使用例如
这类节点先将值配置好:
Tom
Alex
Lucy
Kitty
Henry
然后再注入到属性中:
比较特殊的是读取Properties
类型的数据,在Spring中,可以通过
节点的location
属性指定需要读取的文件:
然后,就可以注入到相应的属性中: