Spring学习笔记 第五章 Spring IoC特性

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=)])
发布了12 篇原创文章 · 获赞 0 · 访问量 142

猜你喜欢

转载自blog.csdn.net/qq_41684416/article/details/105472601