Spring学习笔记(一)——综述篇


Motivation

最近看到数年前的电视剧《汉武大帝》中的一个片段:汉武帝偶得一柄匈奴宝刀,当即让身边的将军拔出自己的佩剑来比试一番,看哪一个更锋利。谁知汉武帝只是用力一劈,将军的汉剑便断作两截。汉武帝很是惊愕,询问献刀之人方知,匈奴人从西域学得了比汉朝更先进的冶钢技术。因此…

历史上,无论是农业上还是军事装备上的技术革新,总能带来一个国家实力的提升,新的工具逐渐提高着人的生产力。

回到我们的正题中,随着各种编程语言的发展,出现了越来越多的新技术,譬如这篇博文的主角——Spring。其实这个名字我很早就听说过了,但是一直没有做出学习他的行动,受上述剧情的启发,我觉得是时候了。毕竟用铁剑去和匈奴人拼钢刀是要吃败仗的。


Spring是什么?

关于Spring是什么这个问题,大家可以直接问度娘,百度百科上的定义最后一句总结说:

Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

看着这种官方的定义,想必没有几个人能真正的了解它是什么。

对于一个工具——譬如榔头,你只需给我演示一下它能敲钉子,还能砸核桃,那么我就能大致的理解它是什么了。

因此,关于他能简化开发,让开发者少写代码这诸多好处之一,我们做一个比较:
一般情况下,我们写UserDAO(用户数据访问对象,用来封装对数据库中User表所做的任何操作的类)中的queryUser函数大致如下:

    public static User queryUserById(String id) {

        //获得数据库的连接对象
        Connection connection = DBManager.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        //生成SQL代码
        StringBuilder sqlStatement = new StringBuilder();
        sqlStatement.append("SELECT * FROM user");
        sqlStatement.append(" WHERE Id=?");

        //设置数据库的字段值
        try {
            preparedStatement = connection.prepareStatement(sqlStatement.toString());
            preparedStatement.setString(1, id);
            resultSet = preparedStatement.executeQuery();

            User user = null;
            if (resultSet.next()) {
                user.setId(id);
                user.setName(resultSet.getString("Name"));
                user.setPhoneNumber(resultSet.getString("PhoneNumber"));
                user.setEmailAddress(resultSet.getString("EmailAddress"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            DBManager.closeAll(connection, preparedStatement, resultSet);
        }
    }

而使用了Spring框架后,同样的功能就只需要以下的代码:

    public User queryUserById(int Id) {
        String sqlStatement = "SELECT * FROM user WHERE UserID=?";
        User user = null;
        jdbcTemplate.query(sqlStatement, new Object[]{Id}, (rs) -> {
            if (rs.isFirst()) {
                user = new User();
                user.setId(id);
                user.setName(resultSet.getString("Name"));
                user.setPhoneNumber(resultSet.getString("PhoneNumber"));
                user.setEmailAddress(resultSet.getString("EmailAddress"));
            }
        });
        return user;
    }

通过对比,我们可以发现两段代码有以下不同之处:
①第一段31行(去掉用于使代码分段清晰、美观的空行为27行),第二段14行,很明显得少了近一半的代码;
②Spring方式不用手动定义数据库连接、结果集等代码;
③Spring方式不用手动处理各种数据库相关的异常;
④Spring方式封装了JDO中给"?“赋值的语句,如果sql中带填入的参数(即”?"的数量)越多,这里的优化越明显。

基本上,除了必须由我们来编写的sql语句和构建查询结果对象的代码之外,其它的简单重复劳动Spring框架都已经代劳了。这便是Spring框架诸多优点中九牛之一毛。

关于Spring其他的优点,以下摘自《Spring 3.x企业应用开发实战》:
①方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

②AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。

③声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

④方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。

⑤方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts、Hibernate、Hessian、Quartz等)的直接支持。

⑥降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC、JavaMail、远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。

⑦Java源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无意识Java技术的最佳实践的范例。


系列博文

按照以往的习惯,索引就放在综述帖中。

核心

Spring学习笔记(一)——综述篇(2018.07.04)

Spring学习笔记(二)——基础篇(2018.07.05)

Spring学习笔记(三)——配置篇(2018.07.09)

Spring学习笔记(四)——IoC进阶篇(2018.07.11)

Spring学习笔记(五)——配置信息进阶篇(2018.07.16)

Spring学习笔记(六)——AOP篇(上)(2018.07.19)

Spring学习笔记(七)——AOP篇(下)(2018.07.20)

Spring学习笔记(八)——数据访问篇(2018.07.30)

Spring学习笔记(九)——Spring MVC篇(2018.08.03)

番外

Spring学习笔记(十)——Spring Retry篇(2018.11.09)


更新日志

因为觉得再这样闭门造车下去是断断不行的,因此便想到学习一下Spring。从开始学到现在尚不足一周,但困难已经遇到了一箩筐,当然,学到的东西也很多。所以急于将这期间的所思所想和学到的东西记录下来。
因为尚没有学完,因此这套博文我会一边学一边写。
——2018.07.05

花了三天时间,终于写完了第三篇——配置篇,写的比较详细,篇幅比较长,静下心来看会有收获的。
——2018.07.09

到目前为止,对AOP知识的学习是比较愉快的,因为确实解决了我在开发中遇到的,思考过之后仍没有解决的问题。花了两天时间,把AOP的只是分了上下两篇写完。已经挂上了链接,对庞杂的AOP知识有部分摘捡,在后面的学习中如果发现某些知识是必要的,我会再填上。
——2018.07.20

断断续续花了三天,写完了数据访问篇。知道了什么叫持久层,也见识到Hibernate这些框架的强大功能。一定要不断学习新的东西啊,不能总是作一个偏安于石器时代的原始人。
——2018.07.30

最近几天略有些忙,不过还是挤出了一部分时间学习,然后写完了Spring框架基础知识的最后一篇博文。如果之后学到新的进阶知识,我会续写新的博文来分享。
——2018.08.03

Bug一直是驱动我前进的动力,最近为了解决网络波动造成的连接超时问题,学习了Spring Retry这个重试框架,用几个注解就可以实现功能,十分便捷。添上了相关的博文作为记录。
——2018.11.09


后记

学习新东西的过程总是充满了挫折,但是最后回过头来,我们会发现,我们所付出的努力都是值得的。在学校里的学生最大的问题,就是知识过于陈旧,刚毕业就被真实的商业开发环境淘汰掉了。因此,想成为一个跟得上时代的合格的软件工程师,学习并掌握当前工业界最新的开发工具是理所因当的。

相较于理论,我在博文更注重于应用。因此,可能这些文章中有一些概念上说的不到位的地方,请多多包涵。

如果你发现了博文中的任何错误,请在对应博文的下方直接回复,我会尽快修改,避免误导了大家。

如果在实现中出现了自己难以解决的问题,我的邮箱是implementist@outlook.com

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMplementist

你的鼓励,是我继续写文章的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值