JAVA中的分层解耦

1、定义

在软件开发中,分层解耦是一种设计原则,旨在将应用程序划分为不同的逻辑层次,使每个层次的功能和责任清晰,从而降低系统的耦合性,提高代码的可维护性、可扩展性和可重用性。分层解耦有助于将复杂的系统拆分为独立的模块,使各个模块之间的关系更加明确,便于团队协作和系统维护。

通常会将其分为三层,也称三层架构:

controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。

service: 业务逻辑层,处理具体的业务逻辑。

dao:数据访问层(Data Access object)(持久层),负责数据访问操作,包括数据的增、删、改、查。

注:按需求通过定义接口方法来灵活实现功能

2、如何实现解耦

在spring框架中,有三个核心概念用于实现解耦,分别是控制反转、Bean对象以及依赖注入。它们帮助实现松耦合、模块化、可维护和可扩展的应用程序。

  1. 控制反转(Inversion of Control,IoC)
    • 控制反转是Spring框架的基础概念之一,它指的是将对象的创建和管理权从应用程序代码转移到外部容器(Spring容器)中。
    • 在传统的应用程序中,对象的创建通常由应用程序代码直接完成,而在IoC中,这些对象的创建和生命周期管理由IoC容器负责。
    • IoC容器负责管理应用程序中的各个对象,根据配置和需要创建、组装和销毁这些对象,从而实现了对象的解耦和灵活性。
  2. Bean对象
    • 在Spring框架中,Bean是一个用于表示由Spring容器管理的对象的术语。
    • Bean可以是任何的Java对象,包括POJO(Plain Old Java Object)和Spring特定的组件。
    • 在配置文件或注解中,可以定义Bean的属性、依赖关系和其他配置信息。
  3. 依赖注入(Dependency Injection,DI)
    • 依赖注入是IoC的一个关键实现方式,它是通过将对象的依赖关系注入到对象中,而不是在对象内部直接创建依赖关系。
    • 通过DI,对象不需要自己创建或查找它所依赖的其他对象,而是由容器在创建对象时自动将依赖关系注入进去。
    • DI减少了对象间的直接耦合,使得代码更加可维护、可测试和可扩展。

注意:虽然此处控制反转和依赖注入分开讨论,但他们其实关系紧密,因为控制反转强调的是将对象的控制权(包括创建和管理)从应用程序代码转移到外部容器(如Spring容器)中。这是一种理论做法。而依赖注入则是实现IoC的一种具体方式,它通过将对象所依赖的其他对象注入到对象内部,实现了依赖关系的解耦。

3、如何具体操作
1)如何声明bean对象
使用注解
  • 在类上使用 @Component@Service@Repository@Controller 等注解来声明Bean对象。这些注解都是@Component注解的扩展,用于标识不同类型的组件。
  • 在Spring容器启动时,它会扫描带有这些注解的类,并将它们实例化为Bean对象。
  • 适用于声明具有特定用途的Bean,如服务类、控制器等。

    注解

    说明

    位置

    @Component

    声明bean的基础注解

    不属于以下三类,用此注解

    @Controller

    @Component的衍生注解

    标注在控制器类上

    @Service

    @Component的衍生注解

    标注在业务类上

    @Repository

    @Component的衍生注解

    标注在数据访问类上(由于与mybatis整合,用的少)

    注意事项

  • 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
  • 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。
使用Java配置类
  • 创建一个带有 @Configuration 注解的Java类,然后在该类中使用 @Bean 注解来声明需要被容器管理的Bean对象。
  • 在Java配置类中,通过方法返回一个对象,并将其标记为Bean,Spring容器会根据这些定义来创建和管理Bean对象。
  • 适用于声明自定义的Bean,并对其进行更精确的配置。
使用XML配置
  • 在XML配置文件中使用 <bean> 元素来声明Bean对象。
  • 通过指定类名、属性值和依赖关系,可以在XML中定义Bean的实例化和配置信息。
2)如何实现依赖注入
构造函数注入(Constructor Injection)
  • 在类的构造函数中声明依赖项,并通过构造函数来注入。
  • Spring容器会在实例化类时自动将所需的依赖项传递给构造函数。

例:

@Component
public class MyService {
    private final MyDependency dependency;

    @Autowired
    public MyService(MyDependency dependency) {
        this.dependency = dependency;
    }

}
属性注入(Property Injection)
  • 在类的属性上使用注解(如 @Autowired)声明依赖项。
  • Spring容器会自动将依赖项注入到这些属性中。
  • 通常使用属性注入时,需要确保依赖项不是null,可以通过添加 @Autowired(required = true) 来实现。

例:

 方法注入(Method Injection)
  • 在类的方法上使用注解(如 @Autowired)声明依赖项。
  • Spring容器会在对象创建后调用这些方法,并注入依赖项。
  • 适用于需要在对象创建后进行一些初始化操作的情况。

例:

@Component
public class MyService {
    private MyDependency dependency;

    @Autowired
    public void setDependency(MyDependency dependency) {
        this.dependency = dependency;
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java及⼤数据学习路线 1.Java学习路线 1.1JavaSE Java基础 Java8新特性 数据库MySQL与SQL语⾔ JDBC 1.2JavaWeb HTML基础与CSS JavaScript DOM 与 jQuery XML与Tomcat HTTP协议 服务器端组件Servlet JSP EL表达式 JSTL 会话控制Cookie和Session 服务器端组件Filter 服务器端组件Listener 国际化 异步数据传输框架Ajax ⽂件的上传下载 1.3JavaEE框架 系统整体分层解耦框架spring 轻量级Web框架springmvc 轻量级持久层框架mybatis 服务器操作系统Linux 内存数据库Redis 项⽬架构、jar包管理⼯具Maven 1.4JavaEE⾼级 SVN/IDEA开发⼯具 分布式版本管理⼯具Git与Github Mysql⾼级 Mycat实现MySQL的分布式、分库分表、读写分离 Nginx反向代理、负载均衡、动静分离 JVM内存模型、参数调优 JUC线程⾼级 分布式架构注册⼼Zookeeper 虚拟化应⽤容器Docker 全⽂检索引擎ElasticSearch 消息队列RabbitMQ 前端VUE/ES6 2⼤数据学习路线 2.1JavaSE Java基础 Java8新特性 数据库MySQL与SQL语⾔ JDBC 2.2JavaEE核⼼ HTML、CSS、JS、XML Tomcat服务器、HTTP协议、JSP、Servlet组件 EL表达式、会话控制、⽂件的上传下载 Filter组件、Listener组件、异步传输框架AJax 系统整体分层解耦框架spring 轻量级Web框架springmvc 轻量级持久层框架mybatis 项⽬架构、jar包管理⼯具Maven 服务器操作系统Linux 内存数据库Redis Mysql⾼级 命令解析器Shell 2.3Hadoop⽣态体系 ⼤数据存储框架Hadoop 分布式服务管理框架zookeeper hadoop⾼可⽤HA 数据仓库hive 数据查询框架impala+kudu+clouderManager ⽇志采集传输框架flume/idea 分布式发布-订阅消息系统Kafka+监控器kafkaManager+kafkaMonitor 分布式⾮关系型数据库Hbase+Hbase⼆级索引创建⼯具Phoenix 任务调度框架Azkaban 数据查询框架Kylin+druid ⼤数据图形化⼯具Hue 分布式版本管理⼯具Git与Github 2.4 Spark/Flink⽣态体系 全⽂检索+⽇志搜集+数据可视化ELK 多范式编程语⾔Scala SparkCore/Spark SQL/Spark Streaming/Spark mlib Spark内核和优化 JVM/JUC python 数据结构 ⼤数据框架Flink 3 Java基础图谱 4 软件开发介绍 软件开发 软件,即⼀系列按照特定顺序组织的计算机数据和指令的集合。有系统软 件和应⽤软件之分。 4.1 ⼈机交互⽅式 图形化界⾯(Graphical User Interface GUI)这种⽅式简单直观,使⽤ 者易于接受,容易上⼿操作。 命令⾏⽅式(Command Line Interface CLI):需要有⼀个控制台,输 ⼊特定的指令,让计算机完成⼀些操作。较为⿇烦,需要记录住⼀些 命令。 Pascal之⽗Nicklaus Wirth: "Algorithms+Data Structures=Programs" 4 .2常⽤的DOS命令 dir : 列出当前⽬录下的⽂件以及⽂件夹 md : 创建⽬录 rd : 删除⽬录 cd : 进⼊指定⽬录 cd… : 退回到上⼀级⽬录 cd: 退回到根⽬录 del : 删除⽂件 exit : 退出 dos 命令⾏ 补充:echo javase>1.doc
资源介绍 本次介绍的资源是一份基于Spring Boot开发的网上图书商城的毕业设计项目,包含完整的论文、源代码及详细的说明文档。这一项目不仅充分展示了Spring Boot框架在Web应用开发的优势,而且提供了一个实践性强、可定制性高的电商平台开发范例。 该项目实现了网上图书商城的基本功能,包括用户注册登录、图书浏览、购物车管理、订单生成与处理等。通过Spring Boot的自动化配置和简化的开发流程,项目能够快速搭建并稳定运行。同时,结合Spring Security实现了用户权限管理和安全认证,确保了商城系统的安全性。 在代码实现上,项目采用了分层架构,使得各功能模块解耦清晰,便于后期的维护与扩展。数据库设计合理,数据交互高效,保证了系统的稳定性和性能。此外,项目还集成了多种前端技术,如Bootstrap、jQuery等,提升了用户体验和交互效果。 除了源代码,本次资源还提供了详细的说明文档,对项目的整体架构、模块功能、代码实现等进行了深入的解析和说明。这对于初学者来说是一份宝贵的学习资料,能够快速了解并掌握Spring Boot开发网上商城的关键技术和实现方法。 值得一提的是,该项目具有良好的可定制性。开发者可以根据实际需求,对商城的功能进行二次开发或定制,以满足不同场景下的业务需求。无论是作为毕业设计项目,还是作为电商平台的开发参考,这份资源都具有很高的实用价值。 总之,这份基于Spring Boot开发的网上图书商城毕业设计项目资源,不仅是一份完整的电商平台开发案例,更是一份宝贵的学习和实践资料,值得广大开发者深入研究和探索。
一、为什么:要分层 使软件具有结构性,便于开发、维护和管理。 将不同功能模块独立,在需要替换某一模块时不需要改动其他模块,方便代码的复用、替换 二、层与层耦合的概念,利用工厂类解耦分层结构,我们希望将各个功能 约束在各自的模块(层)当的,而当属于某一层的对象、方法“入侵”到了其他层,如将web层的ServletContext对象传入service层,或service层调用XMLDao独有的方法,就会导致层与层之间的关系过于“紧密”,当需要修改某一层时不可避免的要修改其他关联的层,这和我们软件分层最初的设想-----层与层分离,一个层尽量不依赖其他层存在,当修改一层时无需修改另一层的设想是违背的。这种“入侵”造成的“紧密”关系就早做层与层之间发生的“耦合”,而去掉这种耦合性的过程就叫做层与层之间“解耦” 利用工厂类可以实现解耦的功能 三、如何判断一项功能到底属于哪一层 某一项功能属于哪一层,往往是不能明确确定出来的,这时可以参考如下标准进行判断: 此项功能在业务逻辑上更贴近与哪一层,放在哪一层更能较少耦合 此项功能是否必须使用某一层特有的对象 如果放在哪一层都可以,那么放在哪一层更方便技术上的实现,及方便代码的编写和维护 四、异常的处理 如果一个异常抛给上一层会增加程序的耦合性,请当场解决:如将xml解析错误抛给service层,那么当换成mysqldao时,还需要修改service去掉xml解析异常的处理 如果上一层明确需要此异常进行代码的流转,请抛出:如当查找一个用户信息而用户找不到时,可以抛出一个用户找不到异常,明确要求上一层处理 如果这一层和上一层都能解决尽量在这一层解决掉 如果这一层不能解决,而上一层能解决抛给上一层 如果所有层都不能解决,则应抛出给虚拟机使线程停止,但是如果直接抛出这个异常,则还需要调用者一级一级继续往上抛出最后才能抛给虚拟机,所以还不如在出现异常的位置直接trycatch住后转换为RuntimeException抛出。:如读取配置文件出错,任何层都不能解决,转为RuntimeException抛出,停止线程。
资源介绍 本次为大家带来的是一款基于Spring Boot开发的青年公寓服务平台毕业设计项目,该项目不仅是一个功能完备的应用实例,更是一个可供学习与实践的优秀教学资源。此项目源代码完整,结构清晰,注释详尽,非常适合Java专业的同学作为毕业设计或课程设计的参考。 项目围绕青年公寓服务展开,涵盖了公寓信息管理、用户注册登录、房源展示、在线预订、支付结算等多个功能模块,形成了一个完整的服务闭环。通过Spring Boot框架的使用,项目在开发效率与代码质量上都得到了显著提升,同时也体现了Spring Boot在快速构建Web应用方面的优势。 在业务逻辑处理上,项目采用了分层架构,将表示层、业务逻辑层、数据访问层分离,使得代码结构更加清晰,维护起来也更加方便。同时,项目还采用了前后端分离的开发模式,前端使用Vue.js等主流框架进行开发,后端则提供RESTful API供前端调用,实现了前后端的解耦,提高了系统的可扩展性。 此外,项目还考虑到了安全性、性能优化等方面的问题,通过引入Spring Security进行权限控制,使用Redis进行缓存管理,以及采用数据库连接池等技术手段,确保了系统的稳定运行和高效性能。 值得一提的是,该项目不仅是一个毕业设计作品,更是一个可二次开发的平台。同学们可以根据实际需求,对项目进行定制开发,添加更多的功能模块或优化现有功能,从而打造出更符合市场需求的青年公寓服务平台。 总的来说,这款基于Spring Boot开发的青年公寓服务平台毕业设计项目,不仅能够帮助同学们顺利完成毕业设计任务,还能够提供一个优秀的实践平台,帮助同学们深入理解和掌握Java Web开发的相关知识和技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值