spring的IoC容器,容器中存放了很多的对象,这些对象都是由spring来创建的,spring会把对象缓存在HashMap集合当中,key就是Bean的Id名称,value就是对象,想要找到想要的对象的时候,可以使用Bean的Id名称去HashMap中根据key去查找到所对应的对象,就可以得到想要的对象。
SpringBean的管理方式
什么是bean的管理方式呢?
bean的管理方式有哪些呢?
1.spring帮我们创建对象(底层是使用反射技术实现的)
基于xml方式管理bean对象(新手使用)
基于注解的方式管理bean对象(spring boot)
2.spring对我们的对象注入属性
//定义一个属性userName
private String userName;
定义完成后需要注入属性的内容值,可以通过spring来实现。
首先需要创建一个bean对象的配置文件,需要在该配置文件中定义一个bean的标签
//在配置文件中定义一个bean标签
<bean id="userEntity" class="wut.jayson.entity.UserEntity"></bean>
Id:bean的名称,是不允许重复的,默认小驼峰格式
Class:当前该类完整路径地址(包名+类名)组合,使用class完整路径地址,因为spring底层是使用反射技术去初始化对象默认情况下是执行无参构造函数
//一定要有无参构造函数
public UserEntity() {
System.out.println("使用反射初始化");
}
import org.springframework.context.support.ClassPathXmlApplicationContext;
import wut.jayson.entity.UserEntity;
public class Test01 {
public static void main(String[] args) {
// new UserEntity().addUser();
// 1.读取xml配置文件
ClassPathXmlApplicationContext classPathXmlApplicationContext =
new ClassPathXmlApplicationContext("spring.xml");
// 2.根据bean的id获取bean对象
UserEntity userEntity =
classPathXmlApplicationContext.getBean("userEntity", UserEntity.class);
System.out.println(userEntity.toString());
userEntity.addUser();
}
}
没有无参构造函数会报错
实体类中的内容:
package wut.jayson.entity;
public class UserEntity {
private String userName;
//定义一个属性userName
public void addUser(){
System.out.println("添加用户");
}
//一定要有无参构造函数
public UserEntity() {
System.out.println("2.使用反射初始化");
}
运行的结果为:
DI依赖注入:给对象的属性注入值 。(由spring来完成的)
第一种实现方式:基于对象属性set方法实现
//在实体类中添加对应属性的set方法
public void setUserName(String userName) {
this.userName = userName;
}
在spring.xml文件中进行编码,在bean标签下,定义一个属性property标签
name对应的是类中的属性名称,value对应的是需要注入的属性值
<bean id="userEntity" class="wut.jayson.entity.UserEntity">
<property name="userName" value="jayson"></property>
</bean>
//在底层使用反射技术,调用setUserName进行赋值
也就是说把标签中的内容变成 setUserName(value="jayson")
public void setUserName(String userName) {
this.userName = userName;
}
第二种实现方式:基于有参构造函数去实现
首先创建一个有参构造函数(注意创建了有参的构造函数,不要忘记了无参构造函数)
public UserEntity(String userName) {
this.userName = userName;
}
在到spring.xml文件中对bean进行编辑
<!-- 基于有参构造函数初始化对象 同时注入属性值 -->
<bean id="userEntity" class="wut.jayson.entity.UserEntity">
<property name="userName" value="jayson"></property>
</bean>
还可以把name 换成 index 进行选择 注入属性
<bean id="userEntity" class="wut.jayson.entity.UserEntity">
<constructor-arg index="0" value="yc_jayson"></constructor-arg>
</bean>
第三种实现方式:基于P名称的空间的注入值(实际开发用的比较少)
同样是在spring.xml配置文件中进行操作
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置注入spring bean对象 bean的id是不允许重复的-->
<bean id="userEntity" class="wut.jayson.entity.UserEntity" p:userName="p_jayson">
</bean>
<!--class 完整路径的组合 底层使用反射技术初始化对象 默认执行无参构造函数-->
</beans>
在 beans 标签中 插入属性xmlns:p="http://www.springframework.org/schema/p"
在bean标签写入p标签属性就可以实现 注入属性
注入空值和特殊符号
在配置文件中编写注入空值
<bean id="userEntity" class="wut.jayson.entity.UserEntity">
<property name="userName" value="null"></property>
</bean>
如果在配置文件中,给value值注入一个null。实际上就是一个字符串null值
<property name="userName"> <null></null></property>
使用null标签进行注入的值,才是真正意义上的空值
在配置文件中编写注入特殊符号
转移注入方式
< 代表< > 代表>
<property name="userName" value="<<湖北武汉>>"></property>
CDATA特殊符号注入
<property name="userName"><value><![CDATA[<<武汉>>]]></value></property>
一样的效果
如何注入属性外部bean对象
如何注入属性内部bean对象
再数据库表中可能会涉及到一对多或一对一的关系
比如:有一个部门有N个员工。这属于一对多关系
站在员工的角度看,员工属于哪个部门
站在不们的角度看,部门下有N多个员工
员工实体类:
package wut.jayson.entity;
public class EmpEntity {
private String name;
private String address;
private DeptEntity deptEntity;//告诉我们这个员工属于哪个部门
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
public void setDeptEntity(DeptEntity deptEntity) {
this.deptEntity = deptEntity;
}
public DeptEntity getDeptEntity() {
return deptEntity;
}
@Override
public String toString() {
return "EmpEntity{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", deptEntity=" + deptEntity +
'}';
}
}
部门实体类:
package wut.jayson.entity;
public class DeptEntity {
private String departmentName;
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
@Override
public String toString() {
return "DeptEntity{" +
"departmentName='" + departmentName + '\'' +
'}';
}
}
spring3.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 注入内部的bean对象 -->
<bean id="empEntity" class="wut.jayson.entity.EmpEntity">
<property name="name" value="jayson"></property>
<property name="address" value="湖北武汉"></property>
<property name="deptEntity" >
<bean id="deptEntity" class="wut.jayson.entity.DeptEntity">
<property name="departmentName" value="java开发"></property>
</bean>
</property>
</bean>
</beans>
Test:
public static void main(String[] args) {
ClassPathXmlApplicationContext classApp = new ClassPathXmlApplicationContext("spring3.xml");
EmpEntity empEntity = (EmpEntity) classApp.getBean("empEntity");
System.out.println(empEntity.toString());
}
运行结果:EmpEntity{name='jayson', address='湖北武汉', deptEntity=DeptEntity{departmentName='java开发'}}
级联赋值:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 级联赋值的形式 -->
<bean id="empEntity" class="wut.jayson.entity.EmpEntity">
<!-- 两个属性 -->
<property name="name" value="jayson"></property>
<property name="address" value="湖北武汉"></property>
<property name="deptEntity" ref="deptEntity"></property>
<!-- 在EmpEntity中需要创建一个 deptEntity的get方法才可以进行赋值操作 -->
<property name="deptEntity.departmentName" value="jayson02"></property>
</bean>
<bean id="deptEntity" class="wut.jayson.entity.DeptEntity">
</bean>
</beans>
注入集合类型属性
1.注入数组类型
2.注入list集合类型
3.注入Map集合属性
4.注入set集合属性
定义一个StuEntity类
package wut.jayson.entity;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class StuEntity {
private String[] arrays;//注入数组类型
private List<String> list;//注入list集合类型
private Map<String,String> map;//注入map集合类型属性
private Set<String> set;//注入set集合类型属性
public void setArrays(String[] arrays) {
this.arrays = arrays;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setSet(Set<String> set) {
this.set = set;
}
@Override
public String toString() {
return "StuEntity{" +
"arrays=" + Arrays.toString(arrays) +
", list=" + list +
", map=" + map +
", set=" + set +
'}';
}
}
编写xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="stuEntity" class="wut.jayson.entity.StuEntity">
<property name="arrays">
<!--数组的方式-->
<array>
<value>1</value>
<value>2</value>
<value>3</value>
</array>
</property>
<property name="list">
<!--list集合的方式-->
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<property name="map">
<!--map集合的方式-->
<map>
<entry key="1" value="1"></entry>
<entry key="2" value="2"></entry>
<entry key="3" value="3"></entry>
</map>
</property>
<property name="set">
<!--set集合的方式-->
<set>
<value>1</value>
<value>2</value>
<value>3</value>
</set>
</property>
</bean>
</beans>
还有一种在list中嵌套一个bean
<property name="course">
<list>
<ref bean="courseEntity_java"></ref>
<ref bean="courseEntity_BigData"></ref>
</list>
</property>
</bean>
<bean id="courseEntity_java" class="wut.jayson.entity.CourseEntity">
<property name="courseName" value="java"></property>
</bean>
<bean id="courseEntity_BigData" class="wut.jayson.entity.CourseEntity">
<property name="courseName" value="java"></property>
</bean>