Spring学习笔记 第五章 Spring IoC特性
(1) 给bean注入集合
Student.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private long id;
private String name;
private int age;
private List<Address> addresses;
}
spring.xml
<bean id="student" class="com.hbb.entity.Student">
<property name="id" value="11"></property>
<property name="age" value="20"></property>
<property name="name" value="牛大壮"></property>
<property name="addresses">
<list>
<ref bean="address"></ref>
<ref bean="address2"></ref>
</list>
</property>
</bean>
<bean id="address" class="com.hbb.entity.Address">
<property name="id" value="1001"></property>
<property name="name" value="日之出"></property>
</bean>
<bean id="address2" class="com.hbb.entity.Address">
<property name="id" value="2001"></property>
<property name="name" value="三河"></property>
</bean>
运行结果:
Student(id=11, name=牛大壮, age=20, addresses=[Address(id=1001,name=日之出), Address(id=2001, name=三河)])
(2) scope作用域
Spring管理的bean是根据scope来生成的,表示bean的作用域,共4种。默认是单例模式
模式 | 作用域 |
---|---|
singleton | 单例,表示通过spring容器获取的bean是唯一的 |
prototype | 原型, 表示通过spring容器获取的bean是不同的 |
request | 请求,表示在一次HTTP请求内有效 |
session | 会话,表示在一个用户会话内有效 |
request和session只适用于web项目,大多数情况下,使用单例模式和原型较多。
prototype原型模式当业务代码获取IoC容器中的bean是,spring才去调用无参构造创建对应bean。
singleton单例模式无论业务代码是否获取IoC容器中的bean,spring在加载配置文件spring.xml的时候就会创建bean。
<bean id="student2" class="com.hbb.entity.Student" scope="prototype">
两种方式各有优点, singleton单例模式更加节省空间。prototype原型模式可以避免创建的bean没有被调用造成的浪费。
(3) Spring的继承
与java中的继承不同,java是类层面的继承,子类可以继承父类的内部结构信息;spring是对象层面的继承,子对象可以继承父对象的属性值。
<bean id="student2" class="com.hbb.entity.Student">
<property name="id" value="11"></property>
<property name="age" value="20"></property>
<property name="name" value="牛大壮"></property>
<property name="addresses">
<list>
<ref bean="address"></ref>
<ref bean="address2"></ref>
</list>
</property>
</bean>
<bean id="student3" class="com.hbb.entity.Student" parent="student2">
<property name="name" value="孙悟空"></property>
</bean>
运行结果:
Student(id=11, name=孙悟空, age=20, addresses=[Address(id=1001,name=日之出), Address(id=2001, name=三河)])
Spring的继承关注点在于具体的对象,而不在于类,不同的两个类的实例化对象可以完成继承,前提是子对象必须包含父对象的所有属性,同时可以在此基础上添加其他的属性。
(4) Spring的依赖
与继承相似,依赖也是描述bean和bean之间的一种关系,配置依赖之后,被依赖的bean一定先创建,再创建依赖的bean。A依赖于B,先创建B,再创建A。
spring.xml
<bean id="student" class="com.hbb.entity.Student" depends-on="user"></bean>
<bean id="user" class="com.hbb.entity.User"></bean>
Student.java
@Data
@AllArgsConstructor
public class Student {
private long id;
private String name;
private int age;
private List<Address> addresses;
public Student() {
System.out.println("Create Student");
}
}
User.java
@Data
public class User {
private long id;
private String name;
public User(){
System.out.println("Create User");
}
}
运行结果:
Create User
Create Student
Student(id=0, name=null, age=0, addresses=null)
(5) Spring的p命名空间
p命名空间是对IoC/DI的简化操作,使用p命名空间可以更加方便的完成bean的配置以及bean之间的依赖注入关系。
头文件中一定要有如下内容:
xmlns:p=http://www.springframework.org/schema/p
通过p命名空间配置属性:
spring.xml
<bean id="student" class="com.hbb.entity.Student" p:id="101" p:age="30" p:name="ppp" p:addresses-ref="address"></bean>
<bean id="address" class="com.hbb.entity.Address" p:id="9999" p:name="山"></bean>
运行结果:
Student(id=101, name=ppp, age=30, addresses=[Address(id=9999, name=山)])