【一步一步学习spring】spring入门

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的模块

625031-20180904112251212-560883074.png

2. spring IOC的引入

625031-20180904112305422-1348015128.png

  • 传统的开发方式下,我们直接使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 操作 HTML DOM (文档对象模型) 相关知识点

HTML DOM 树 通过可编程的对象模型&#xff0c;JavaScript 获得了足够的能力来创建动态的 HTML。 JavaScript 能够改变页面中的所有 HTML 元素JavaScript 能够改变页面中的所有 HTML 属性JavaScript 能够改变页面中的所有 CSS 样式JavaScript 能够对页面中的所有事件做出反应…

[css] 举例说明你对指针事件(pointer-events)的理解

[css] 举例说明你对指针事件&#xff08;pointer-events&#xff09;的理解 pointer-events CSS 属性指定在什么情况下 (如果有) 某个特定的图形元素可以成为鼠标事件的 target。 当point-events 为none时&#xff0c;比如a连接不再生效个人简介 我是歌谣&#xff0c;欢迎和大…

JS运行三部曲

语法分析 预编译 解释执行 下面两句话能解决问题&#xff0c;但解决不了深入的问题&#xff0c;其实原理是 预编译产生的两个现象&#xff08;规律&#xff09;。 函数声明整体提升变量 声明提升 预编译前奏 imply global 暗示全局变量&#xff1a;即任何变量&#xff…

[BZOJ3791]作业

Description 众所周知&#xff0c;白神是具有神奇的能力的。比如说&#xff0c;他对数学作业说一声“数”&#xff0c;数学作业就会出于畏惧而自己完成&#xff1b;对语文作业说一声“语”&#xff0c;语文作业就会出于畏惧而自己完成。今天&#xff0c;语文老师和数学老师布置…

[css] 如何用css实现把“我不爱996”变成“699爱不我”?

[css] 如何用css实现把“我不爱996”变成“699爱不我”&#xff1f; unicode-bidi 属性与 direction 属性一起使用&#xff0c;来设置或返回文本是否被重写&#xff0c;以便在同一文档中支持多种语言。 用direction属性设置rtl表示从右到左&#xff0c;默认是ltr从左到右的&am…

[css] scroll-snap-align属性的应用场景是什么?

[css] scroll-snap-align属性的应用场景是什么&#xff1f; 滚动一个列表时&#xff0c;控制列表中一个块始终完全在可视区内,如果滚动到一半可以回弹&#xff0c;保持整个块都在可视区。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c;…

STM32 软件模拟 IIC 代码,标准库、HAL库可用

1 #ifndef _IIC_H2 #define _IIC_H3 4 #include "stdio.h" 5 #include "stm32f1xx_hal.h"6 7 8 /* 定义控制 SDA SCL 的宏 标准库版9 #define I2C_SDA_UP GPIO_SetBits (GPIOC,GPIO_PIN_8) //SDA高电平 10 #define I2C_SDA_LOW GPIO_…

作用域及上下文理解

书本中的解释 [[scope]]:每个javascript函数都是一个对象&#xff0c;对象中有些属性我们可以访问&#xff0c;但有些不可以&#xff0c;这些属性仅供javascript引擎存取&#xff0c;[[scope]]就是其中一个。[[scope]]:指的就是我们所说的作用域&#xff0c;其中存储了运行期上…

[css] css中Scroll-behavior属性有什么应用场景?

[css] css中Scroll-behavior属性有什么应用场景&#xff1f; 当用户手动点击导航或者API调用导致触发滚动操作时&#xff0c;scroll-behavior属性可以为滚动框设定滚动行为。auto表示立即滚动到指定位置&#xff0c;smooth则表示平滑过渡&#xff0c;需要一定的过度时间滚动到…

windows下安装ElasticSearch的Head插件

es5以上版本安装head需要安装node和grunt(之前的直接用plugin命令即可安装) (一)从地址&#xff1a;https://nodejs.org/en/download/ 下载相应系统的msi&#xff0c;双击安装。 &#xff08;二&#xff09;安装完成用cmd进入安装目录执行 node -v可查看版本号 &#xff08;三&…

立即执行函数

定义&#xff1a; 此类函数没有声明&#xff0c;在一次执行过后即释放。适合做初始化工作。 //立即执行函数格式&#xff0c;此类函数执行完即销毁&#xff0c;除了这点&#xff0c;和其它函数一样 (function (){}()); W3C建议使用这种 (function (){})();//只有表达式才能被…

[css] 使用css实现对话气泡的效果

[css] 使用css实现对话气泡的效果 方法&#xff1a;使用圆角矩形作为对话的主体框&#xff0c;左侧或右侧增加附加三角形&#xff0c;三角形使用border样式设置来实现&#xff0c;相对定位和绝对定位结合使三角形附于圆角矩形左侧或右侧&#xff1b; html: <div class"…

iframe嵌套其它网站页面详解

iframe基本内涵 通常我们使用iframe直接直接在页面嵌套iframe标签指定src就可以了。 <iframe src"demo_iframe_sandbox.htm"></iframe> 但是&#xff0c;有追求的我们&#xff0c;并不是想要这么low的iframe. 我们来看看在iframe中还可以设置些什么属…

JavaScript 闭包

闭包概念&#xff1a; 当内部函数被保存到外部时&#xff0c;将会生成闭包。闭包会导致原有作用域链不释放&#xff0c;造成内存泄漏。 什么时候才会触发闭包呢&#xff1f; 当两个函数互相嵌套&#xff0c;把里面的函数被保存到了外部&#xff08;全局&#xff09;&#xff…

[css] 如何隐藏没有静音、自动播放的音视频?

[css] 如何隐藏没有静音、自动播放的音视频&#xff1f; 浏览器已禁止打开页面时自动播放&#xff0c;可以用iframe先播触发播放权限&#xff0c;然后再播放 做一个opacity:0 的假隐藏个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但…

PyAutoIt 安装(Windows 版)

转载于:https://www.cnblogs.com/Crixus3714/p/9592635.html

[css] 你有使用过css的writing-mode属性吗?说说它有哪些应用场景?

[css] 你有使用过css的writing-mode属性吗&#xff1f;说说它有哪些应用场景&#xff1f; 用于规定文字的书写方式 horizontal-tb 从左到右从上到下(水平书写) vertical-rl 从上到下从右到左 (垂直书写) vertiacl-lr 从上到下从左到右 sideways-rl&#xff1a;内容垂直方向从上…

文案资源

策划与营销类网站 全球顶尖创意分享平台 OPEN YOUR MIND 数英网-数字媒体及职业招聘网站 SocialBeta | 领先的社交媒体和数字营销内容与招聘平台 梅花网&#xff0d;营销者的信息中心 视觉素材类网站 花瓣网_发现、采集你喜欢的一切 昵图网_原创素材共享平台www.nipic.co…

scp命令:服务器间远程复制代码

scp是secure copy的简写&#xff0c;用于在Linux下进行远程拷贝文件的命令&#xff0c;和它类似的命令有cp&#xff0c;不过cp只是在本机进行拷贝不能跨服务器&#xff0c;而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时&#xff0c…

[css] 怎么使用css选择空链接?

[css] 怎么使用css选择空链接&#xff1f; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style type"text/css">a[href], a:not(href) {color: #ff3333;}<…