文章目录
前言
本文章将介绍Spring第一大核心思想-Ioc控制反转和DI依赖注入,以及它们简单的实现案例。
一、什么是SpringIoc/DI?
-
IOC:IOC( Inversion of Control,中文释义:控制反转 ),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。指将创建对象的控制权转移给Spring框架进行管理。由Spring框架根据配置文件或注解等方式,创建bean对象并管理各个bean对象之间的依赖关系。使对象之间形成松散耦合的关系,实现解耦;
- 控制 :指的是对象创建(实例化、管理)的权力
- 反转 :控制权交给外部环境(Spring框架、IoC容器)
-
DI:DI(Dependecy Inject,中文释义:依赖注入),当一个对象A依赖于另一个对象B时,对象A中包含对象B的属性以及其的set方法或包含对象B的有参构造方法,在容器创建对象B时,将属性的值通过依赖注入的方式赋予,实现依赖注入。
二、依赖注入(DI)
依赖注入主要有两种常见的变体:
- 基于 Setter 方法的依赖注入
- 基于构造函数的依赖注入
2.1.Setter 方法的依赖注入
set注入DI实现步骤:
1.思考
2.给属性提供set方法
3.在bean标签内部开启配置
配置位置:< bean> 此位置</ bean>
配置语法:<property 属性名=“属性值”></ property>
配置属性:
name---------属性名称
value---------属性值
ref------------属性值的引用
2.1.1注入对象
public interface IUserDao {
public void save();
}
public class UserDaoImp implements IUserDao{
@Override
public void save() {
System.out.println("===dao数据访问层===");
}
}
public interface IUserService {
public void save();
}
public class IUserServiceImp implements IUserService{
IUserDao iUserDao;
public void setiUserDao(IUserDao iUserDao) {
this.iUserDao = iUserDao;
}
@Override
public void save() {
System.out.println("===service业务逻辑层===");
iUserDao.save();
}
}
public interface IUserController {
public void save();
}
public class UserControllerImp implements IUserController {
IUserSerivce serivce;
//set方法
public void setSerivce(IUserSerivce serivce) {
this.serivce = serivce;
}
@Override
public void save() {
System.out.println("===controller控制访问层===");
serivce.save();
}
}
beans配置
<bean id="controllerImp" class="com.apesource.controller.IUserControllerImp">
<property name="iUserService" ref="serviceImp"></property>
</bean>
<bean id="serviceImp" class="com.apesource.service.IUserServiceImp">
<property name="iUserDao" ref="daoImp"></property>
</bean>
<bean id="daoImp" class="com.apesource.dao.IUserDaoImp"></bean>
创建三个接口以及三个实现类,在类中为了降低耦合度,并没有直接new对象,而是通过设置将对象成员变量,以及给它设置set方法,使spring框架通过IOC创建对象,并将对象注入进属性中。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Beans.xml");
IUserController iUserController = (IUserController) applicationContext.getBean("controllerImp");
iUserController.save();
测试结果如图:
2.1.2注入基本类型与String
public class Student {
private String stuName;
private String stuHub;
private int stuAge;
@Override
public String toString() {
return "Student{" +
"stuName='" + stuName + '\'' +
", stuHub='" + stuHub + '\'' +
", stuAge=" + stuAge +
'}';
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public void setStuHub(String stuHub) {
this.stuHub = stuHub;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
}
beans配置
<bean id="student" class="com.apesource.pojo.Student">
<property name="stuAge" value="18"></property>
<property name="stuHub" value="唱跳rap篮球"></property>
<property name="stuName" value="蔡徐昆"></property>
</bean>
Student student = (Student) applicationContext.getBean("student");
System.out.println(student);
测试结果如图
2.1.3注入复杂类型(list、map、properties…)
public class Teacher {
private List list;
private Set set;
private String[] array;
private Map map;
private Properties prop;
@Override
public String toString() {
return "Teacher{" +
"list=" + list +
", set=" + set +
", array=" + Arrays.toString(array) +
", map=" + map +
", prop=" + prop +
'}';
}
public void setList(List list) {
this.list = list;
}
public void setSet(Set set) {
this.set = set;
}
public void setArray(String[] array) {
this.array = array;
}
public void setMap(Map map) {
this.map = map;
}
public void setProp(Properties prop) {
this.prop = prop;
}
}
beans配置
<bean id="teacher" class="com.apesource.pojo.Teacher">
<property name="list">
<list>
<value>密室逃脱</value>
<value>桌游</value>
<value>推本</value>
</list>
</property>
<property name="array">
<array>
<value>篮球</value>
<value>足球</value>
<value>乒乓球</value>
</array>
</property>
<property name="set">
<set>
<value>字节跳动</value>
<value>三星</value>
<value>阿里巴巴</value>
</set>
</property>
<property name="map">
<map>
<entry key="及时雨" value="宋江"></entry>
<entry key="豹子头" value="林冲"></entry>
<entry key="两年半" value="蔡虚昆"></entry>
</map>
</property>
<property name="prop">
<props>
<prop key="多兰剑">450</prop>
<prop key="红水晶">400</prop>
<prop key="布甲">300</prop>
</props>
</property>
</bean>
Teacher teacher = (Teacher) applicationContext.getBean("teacher");
System.out.println(teacher);
测试结果如图
2.2.构造方法注入
构造注入
要求:
类中需要提供一个对应参数列表的构造函数;
涉及的标签:
constructor-arg
属性:
index:指定参数在构造函数参数列表的索引位置
type:指定参数在构造函数中的数据类型
name:指定参数在构造函数中的名称 用这个找给谁赋值
=上面三个都是找给谁赋值,下面两个指的是赋什么值的========
value:它能赋的值是基本数据类型和 String 类型
ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean
public class Principal {
private String priName;
private Map classRoom;
public Principal(String priName, Map classRoom) {
this.priName = priName;
this.classRoom = classRoom;
}
public Principal() {
}
@Override
public String toString() {
return "Principal{" +
"priName='" + priName + '\'' +
", classRoom=" + classRoom +
'}';
}
}
beans配置
<bean id="principal" class="com.apesource.pojo.Principal">
<constructor-arg index="0" type="java.lang.String" name="priName" value="高斯林"></constructor-arg>
<constructor-arg index="1" type="java.util.Map" name="classRoom">
<map>
<entry key="德育楼" value="10层"></entry>
<entry key="办公楼" value="5层"></entry>
<entry key="艺术楼" value="3层"></entry>
</map>
</constructor-arg>
</bean>
Principal principal = (Principal) applicationContext.getBean("principal");
System.out.println(principal);
测试结果如图
总结
以上就是所有内容了。