关于Spring依赖注入的深入理解
- 前言
-
- 开发环境
- 创建项目
- 安装spring相关依赖包
- 创建applicationContext.xml
- 在Dao层创建UserDao接口,并写一个showUser()方法
- 在daoImpl层中创建UserDaoImpl实现类,并实现接口中的showUser方法
- 在Biz层创建BizDao接口,并写一个showUserBiz()方法
- 在bizImpl层中创建UserBizImpl实现类,并实现接口中的showUserBiz方法
- 在applicationContext.xml中创建Bean实例进行依赖注入
- 创建一个测试类
- 运行结果
- 总结
前言
本文是作者@Mecle_对spring依赖注入的个人理解,希望在spring开发中能对大家有所帮助。
开发环境
MAC OS
IntelliJ IDEA
Maven
创建项目
创建如图项目结构(可忽略类,下文会详细讲解)
安装spring相关依赖包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
创建applicationContext.xml
右击resource,按光标位置依次点击
输入源文件名
创建成功后如图
在Dao层创建UserDao接口,并写一个showUser()方法
package dao;
public interface UserDao {
public void showUser();
}
在daoImpl层中创建UserDaoImpl实现类,并实现接口中的showUser方法
package dao.daoImpl;
import dao.UserDao;
public class UserDaoImpl implements UserDao {
public void showUser() {
System.out.println("大家好,我是Mecle创建的UserDaoImpl!");
}
}
在Biz层创建BizDao接口,并写一个showUserBiz()方法
package biz;
public interface UserBiz {
public void showUserBiz();
}
在bizImpl层中创建UserBizImpl实现类,并实现接口中的showUserBiz方法
package biz.bizImpl;
import biz.UserBiz;
import dao.UserDao;
public class UserBizImpl implements UserBiz {
//声明相关变量
private UserDao userDao;
private UserBiz userBiz;
//setter方法相当于依赖注入的门阀,只有设置了门阀才会被开启,Bean实例才会被创建,依赖注入才会顺利完成
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
public void showUserBiz() {
this.userDao.showUser();
System.out.println("大家好,我是Mecle创建的UserBizImpl!");
}
}
在applicationContext.xml中创建Bean实例进行依赖注入
有几个实现类就创建几个Bean实例,id为bean实例的唯一标识,class为对应实现类的包路径,property是bean的子元素,它用于调用bean实例中的showUser()方法完成属性赋值,从而实现依赖注入。
<?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="userDao" class="dao.daoImpl.UserDaoImpl"></bean>
<bean id="userBiz" class="biz.bizImpl.UserBizImpl">
将id为userDao的Bean实例注入到userDao实例中!
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
创建一个测试类
package test;
import biz.UserBiz;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
public static void main(String args[]) {
//读取applicationContext.xml文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取userBiz的Bean实例
UserBiz userBiz = (UserBiz) applicationContext.getBean("userBiz");
//调用UserBizImpl中的showUserBiz方法
userBiz.showUserBiz();
}
}
运行结果
总结
1、有多少个实现类就创建多少个Bean实例,因为创建bean实例的本质就是实例化一个对象(可以这么理解)。
2、如果要在一个实现类中调用另外一个实现类中的方法,这是就需要进行依赖注入,如本文中的UserBizImpl类调用了UserDaoImpl中的showUser()方法,就需要UserBizImpl中声明userDao变量并创建它的setter方法,用于依赖注入的实现。同时在applicationContext.xml中的调用方(即id为userBiz的Bean实例)中创建一个property子元素,name为被调用方(即UserDaoImpl中的成员变量userDao),ref为需要被注入的Bean实例的id。这样就实现了一个完整的依赖注入过程。