(入门向)利用Spring的IOC+DI对Java Web三层架构模式(Web+Service+Dao)进行改造解耦

最近学了一点Spring的IOC(控制反转) 、DI(依赖注入)的知识,其降低代码耦合性的特性很强大,所以迫不及待的对Java Web的三层架构模式的代码进行了改造,这篇文章对每层的代码都做到了最简化,让我们能够更快速更直观的感受并使用这一技术.让我们开始吧!

运行环境:Windows 10 专业版 1803
JAVA版本:1.8
IDE:IntelliJ IDEA 2018.3.4

1.首先创建一个Web项目并且模拟一个三层架构(Web层,Service层,Dao层),其中test包充当web层

在这里插入图片描述

2.这里我们模拟一个在未使用Spring框架下保存数据到数据库的需求,编写代码并测试运行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一切正常运行,但是不难发现如果用 实现类 变量名=new 实现类 的方式,不易于扩展,我们如果需要改用该实现类接口下的其他实现类的功能,则需要改动原代码,所以这里我们使用了接口 变量名=new 实现类 的方式(运用了多态),这样易于了扩展,只要改动后面的实现类名就行,但是仍然需要改动源代码,也就是存在着耦合性,那么现在Spring出现了,它的IOC和DI解决了紧耦合的问题,实现了松耦合(底层实现方式是工厂模式+反射+配置文件),让我们继续吧!(以下将改造如上的代码,需要一定的Spring入门知识)

3.Spring的环境搭建:

本章我们只使用了IOC功能,所以需要beans,core,context,expression这四个包来支持

Spring在加载的过程中会加载commons-logging.jar日志包,所以我们需要导入这个jar包,否则运行会报错,建议同时导入apache–log4j.jar日志包,因为在企业中用的最多的记录日志jar包就是log4j.jar,当两个jar包都导入时,会自动启用log4j.jar包来记录日志,只有logging.jar包时就只用自身来记录日志.其中logging.jar是必须存在的.
在这里插入图片描述
在src下面有创建一个Spring配置文件:applicationContext.xml
同时在该目录下创建一个日志配置文件:log4j.properties
在这里插入图片描述
log4j.properties文件内容:

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###
# error warn info debug trace
log4j.rootLogger= info, stdout

applicationContext.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">

   

</beans>

接下来配置本地约束文件(即可在不联网的状态下IDE会提供提示) 为了不让篇幅过长,可参考本博主的另外一篇文章

4.我们先试着改写Service层用Spring的方式获得一个Dao层实现类的对象(可直接跳至第五步,这一步只是试着改写)

首先开始编写配置信息
bean标签: 指定要实例化的对象
id属性: 唯一标识 可以为任意值 但是整个xml唯一
class属性: 类的全限定名 就是通过它反射该类的实例对象
在这里插入图片描述
利用以下代码在Service层调用Spring api来获得UserDaoImpl类的对象并运行其save方法
在这里插入图片描述
测试成功!(如有
log4j:WARN No appenders could be found for logger(org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
的异常请移步本博主另一篇文章)
在这里插入图片描述

5.尝到使用Spring的美妙滋味后,但是我们真正需要的是改写整个架构的代码,所以我们需要重新编写,进行全面改造,开始!

Service层我们改成利用属性来调用,在未使用Spring时我们是无法在Web层改变Service层的属性值的,因为之前我们是利用多态的特性来创建该层对象,接口是没有属性的.但是现在有了Spring,我们可以利用它的DI(依赖注入)来实现此功能,我们首先提供属性和相应的set方法(必须).
在这里插入图片描述
再次编写Spring配置文件
因为使用的是set属性注入,条件是类的属性需要有set方法,我们以如下格式编写

<property name="name" value="哈皮"></property>

以上如果是基本类型和Stringvalue
对象类型ref
在这里插入图片描述
以之前的套路,这次在Web层调用Spring API来获得UserServiceImpl类的对象并运行其save方法
在这里插入图片描述
大功告成!改造就这样完美的结束了.

Spring框架真的很强大,虽然以我现在的水平只能靠想象来脑补它的强大,但是我会不断深入学习它,了解它,希望与有缘读到我这篇文章的你共勉!

猜你喜欢

转载自blog.csdn.net/qq_36798272/article/details/88048173