⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/qq_38050259/article/details/113414419/ 「Prannt」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

目的:对比传统方式和 Spring注入方式创建对象以达到解耦的目的,以Service层调用 Dao层为例

方式一:传统方式

1.Service层

/**
* @author :Prannt
* @description :Service层
* @program : Test
*/
public class UserService {
public void add(){
System.out.println("service add...");
UserDao dao = new UserDaoImpl();
dao.query();
}
}

2.UserDao接口

/**
* @description :接口中只有一个抽象方法
*/
public interface UserDao {
void query();
}

3.UserDao接口的实现类

/**
* @description :接口的实现类,重写 query方法
*/
public class UserDaoImpl implements UserDao{
@Override
public void query() {
System.out.println("dao query...");
}
}
//测试
public class test {
@Test
public void test1(){
UserService service = new UserService();
service.add();
}
}

测试结果:

结论一:由以上过程可以看出,在UserService类中直接调用实现类的query方法,一旦实现类出问题,UserService立即报错,具有高度的耦合性

方式二:Spring注入对象

1.xml文件配置bean

<?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="userService" class="Service.UserService">
<!--注入Dao对象-->
<property name="dao" ref="Dao"></property>
</bean>

<bean id="Dao" class="Dao.UserDaoImpl"></bean>
</beans>

2.Service层

import Dao.UserDao;
/**
* @author :Prannt
* @description
* @program : Demo01
*/
public class UserService {
public void add(){
System.out.println("service add......");
dao.update();
}

//创建dao类型的属性,生成对应的set方法
private UserDao dao;

public void setDao(UserDao dao) {
this.dao = dao;
}
}

3.UserDao接口

public interface UserDao {
void update();
}

4.接口的实现类

public class UserDaoImpl implements UserDao{
@Override
public void update() {
System.out.println("Dao update......");
}
}

测试

import Service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestBean {
@Test
public void testBean(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
UserService userService = context.getBean("userService",UserService.class);
userService.add();
}
}

测试结果

结论二:观察以上过程,在UserService类中,没有直接new实现类,而是通过将Dao注入外部配置文件中的方式,使用“第三方文件”来达到解耦的目的。

总结

第一种传统方式创建对象,就像图一中的齿轮组。如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。

图一:高度耦合的齿轮组

而用Spring注入对象犹如图二的齿轮,利用第三方xml文件使任意两个齿轮之间无必然联系,B齿轮坏了也影响不到A、C、D齿轮。齿轮组相互之间的依赖关系降到最低。

图二:解耦后的齿轮组

文章目录
  1. 1. 方式一:传统方式
  2. 2. 方式二:Spring注入对象
  3. 3. 总结