1. spring概述

  • spring是一个开源框架
  • spring为简化企业级应用开发而生,解决的是业务逻辑层和其他各层的松耦合问题,他将面向接口的编程思想贯穿整个系统应用。
  • spring是javaSE/EE的一站式框架。web层有spring-mvc,业务层有spring ioc、事务等机制,持久层提供了spring-jdbc或者直接整合现有的框架(mybatis)

1.1 spring的优点

  • 方便解耦,简化开发

    • spring就是一个大工厂,可以将所有对象创建和依赖关系维护等工作交给spring管理。
  • AOP编程的支持
    • spring提供面向切面的编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
  • 声明式事务的支持
    • 只需要通过配置就可以完成对事务的管理,而无需手动编程。
  • 方便程序的测试
    • spring对junit4支持,可以通过注解方便的测试spring程序
  • 方便集成各种优秀的框架
    • spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如Structs、Hibernate、Mybatis等)的直接支持。
  • 降低可javaEE api的使用难度
    • spring对javaEE开发中非常难用的一些api(JDBC、远程调用等)都进行了封装,是这些api应用难度降低。

1.2 spring的模块

2. spring IOC的引入

  • 传统的开发方式下,我们直接使用new,获取相关的服务对象。
  • 但是这样不符合面向接口的编程思想(关于面向接口的好处,可以参考https://blog.csdn.net/qq376430645/article/details/9927225)。于是把接口和其对应的实现类分开,做到面向接口的编程模式。
  • 但是这样又不符合OCP原则(open-close原则),就是尽量不修改源码做到对程序的扩展。于是引入了工厂模式,负责生成接口的实现类。做到接口和实现的解耦。
  • 但是标准的工厂类依然会同接口和实现类耦合,故引入了一种新的设计模式:工厂模式+反射+配置文件,在工厂类中读入同源码无关的配置文件,使用反射的方式对实现类进行实例化,做到最终的解耦。bingo!

3. spring IOC helloworld

  • 引入spring的依赖,直接引入context即可,因为会将其依赖的所有包全部引入。

          <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.18.RELEASE</version></dependency>
  • 实现简单的bean类

    • UserService Interface

      package com.ioc.demo1;public interface UserService {public void sayHello();
      }
    • UserService 实现类

      package com.ioc.demo1;
      public class UserServiceImpl implements UserService {public void sayHello() {System.out.println("Hello Spring");}
      }
  • 编写spring核心配置文件

    • 在resources中创建xml配置文件application-context.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"><!-- UserService的创建权交给spring --><bean id="userService" class="com.ioc.demo1.UserServiceImpl"></bean></beans>
  • 在程序中读取spring的配置文件,通过spring框架获得bean,完成相应的操作

    package com.ioc.demo1;import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringDemo1 {@Test/*** 传统方式开发*/public void demo1() {UserService userService = new UserServiceImpl();userService.sayHello();}@Test/*** spring的方式实现*/public void demo2() {// spring工厂ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application-context.xml");// 通过工厂获取类对象UserService userService = (UserService) applicationContext.getBean("userService");userService.sayHello();}
    }

4. IOC和DI的基本概念

  • IOC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spring框架管理。
  • 简单说,就是创建UserService对象控制权被反转到了Spring框架。
  • DI Dependency Injection 依赖注入的概念,就是在Spring创建这个对象的过程中,将这个对象所依赖的属性注入进去。

关于DI我们这边再实例讲一下,我们的UserServiceImpl由于业务的需求,新增一个name的string字段。

package com.ioc.demo1;
public class UserServiceImpl implements UserService {private String name;public void sayHello() {System.out.println("Hello Spring " + name);}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

由于该处的修改,在调用处需要做出相应的修改,首先UserService接口中没有name字段,需要将接口类改成实现类,再加上属性赋值的语句。如下所示:

    @Test/*** 传统方式开发,增加了name字段*/public void demo11() {UserServiceImpl userService = new UserServiceImpl();userService.setName("xxx");userService.sayHello();}

而spring开发模式中,由于DI的存在,我们只需要修改配置文件即可,在调用处无需修改任何代码

    <bean id="userService" class="com.ioc.demo1.UserServiceImpl"><property name="name" value="xxx"></property></bean>

转载于:https://www.cnblogs.com/xxxuwentao/p/9583392.html

【一步一步学习spring】spring入门相关推荐

  1. 一步一步学Spring Boot(三)

    课程名称 <一步一步学Spring Boot(三)> 学习地址 CSDN学习地址: http://edu.csdn.net/lecturer/994 51CTO学习地址:http://ed ...

  2. 一步一步学Spring Boot(二)课程发布了~~~

    课程名称 <一步一步学Spring Boot(二)> 学习地址 CSDN学习地址: http://edu.csdn.net/lecturer/994 51CTO学习地址:http://ed ...

  3. 一步一步学Spring Boot(三)-黄文毅-专题视频课程

    一步一步学Spring Boot(三)-1059人已学习 课程介绍         Spring Boot是现在很热门的一个微服务框架,作为一名Java Web 开发工程师,是必须要掌握它的.本系列课 ...

  4. 一步一步手绘Spring MVC运行时序图(Spring MVC原理)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  5. 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  6. 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  7. 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  8. 一步一步手绘Spring IOC运行时序图三(基于Annotation的IOC容器初始化)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  9. 一步一步手绘Spring IOC运行时序图二(基于XML的IOC容器初始化)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  10. 一步一步学Spring Boot(一)

    开心一笑 老板说:"年轻人,如果你想在这里做事,有一件事情你必须要学会,那就是我们这个公司里要求非常干净,你进来时在鞋垫上擦脚了吗?" 年轻人:"哦,擦了,先生.&quo ...

最新文章

  1. 芯片内亿万的晶体管制程工艺
  2. Codeforces Round #370 (Div. 2)
  3. linux 关掉蓝牙自动,如何在Ubuntu 14.04中默认关闭蓝牙,蓝牙
  4. php curl上传文件返回false,php curl上传文件$_FILES为空的问题
  5. leetcode94. 二叉树的中序遍历(dfs)
  6. 垂直和水平居中方法小结
  7. WPF通用窗体模板【2】
  8. KafKa基本入门教程
  9. SQL Sverver 2000 管理安全性
  10. mysql数据库密码字段查看_mysql基本操作(数据库,表,字段,记录)
  11. 交换机配置snmp及查看snmp配置信息
  12. 项目日报模板_韶州中学项目建设正酣 ,计划明年9月投入使用
  13. 小米路由3c padavan固件
  14. linux添加变色龙引导,变色龙引导下载
  15. Word 2007文档结构图 大纲视图 目录默认折叠收缩
  16. 提升文学素养【文章解读】
  17. 成绩造假!你看到400+大佬,有可能是P图!
  18. 存储、读取、清除cookies数据
  19. USB-C PD接口DRP芯片功能介绍
  20. 【python文件读取】加密数据的读取

热门文章

  1. 解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录,
  2. Linux 系统应用编程——网络编程(常用命令解析)
  3. CSDN-markdown编辑器使用手册
  4. QT实现图像处理-傅立叶变换、傅立叶反变换、平滑、锐化与模板匹配
  5. 修改系统默认路径,如收藏夹、桌面、我的文档
  6. el-table列宽设置百分比无效;el-table使用min-width设置百分比;el-table百分比设置无效;
  7. 前端学习(3245):react的生命周期getDeriveStateFromProps
  8. 前端学习(3197):jsx语法规则1
  9. 前端学习(3097):vue+element今日头条管理-回顾
  10. [html] 页面上的登录表单记住了密码(显示星号),但我又忘了密码,如何找回这个密码呢?