Spring诞生的初衷是为了替代更加重量级的企业级Java技术(EJB)。

  相对于EJB来说,Spring提供了更加轻量级和简单的编程模型,它增强了POJO(简单老式Java对象)的功能,使简单的JavaBean具备了之前只有EJB和其他企业级Java规范才具有的功能。

   

  0、POJO、EJB、JavaBean、Bean的概念解析。

  JavaBean,JavaBean 是一种Java写成的可重用组件。

  为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。属性名称符合这种模式,其他Java 类可以通过反射机制发现和操作这些JavaBean 的属性。

  POJO(Plain Ordinary Java Object),简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。

  EJB (Enterprise JavaBean),是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。

  Bean。。。Spring中用bean或者JavaBean来表示应用组件,但并不意味着Spring组件必须要遵循JavaBean规范。一个Spring组件可以是任何形式的POJO。一个Spring组件可以是任何形式的POJO。

  还是没搞明白,算了,暂时就把bean看成Spring的一个组件or一个元素。

  

  1、Spring的使命是简化Java开发,它是从哪些方面做的?

  • 基于POJO的轻量级和最小侵入式编程;
  • 通过依赖注入(DI)和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 通过切面和惯例减少样板式代码。

  2、什么是侵入式编程?Spring又是如何做的?

  很多框架通过强迫应用继承他们的类或实现他们的接口从而导致应用与框架绑死。

  Spring的理念是尽量避免因自身的API而弄乱你的应用代码,也不会强迫你实现Spring规范的接口or继承Spring规范的类。

  在基于Spring构建的应用中,最坏的场景是,一个类会使用Spring注解,但它依旧是POJO。Spring通过DI,赋予了POJO新的魔力。

  3、耦合的两面性

  一方面,紧密耦合的代码难以测试、难以复用、难以理解,且bug不易修复;

  另一方面,耦合是必须的。

  所以我们的代码必须追求松耦合。

  4、DI替代了那种方式的代码?

  简单说,就是在类A中不需要通过new B()的方式来获得类B的对象,而是在工厂类中通过反射创建。

  通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定,这样能够让相互协作的软件组件保持松散耦合。

  如果一个对象只通过接口(而不是具体的实现or初始化过  程)来表明依赖关系,这种依赖便能够在对象本身不知情的情况下,对不同的具体实现进行替换。  

  5、DI常用的注入方式有哪些?

  (1)有参构造器注入:

  (2)setter方法注入

  

  5、什么是Mock测试?

  Mock测试就是在测试过程中中,对于某些难以构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

  6、Spring中,什么是“装配(wiring)”?

  创建应用组件之间的协作的行为,称为装配。

  7、Spring中有哪些装配bean的方式?

  • 在XML文件中进行显示装配;
  • 在Java代码中显示装配;(JavaConfig)
  • 隐式的bean发现机制和自动装配;

  8、Spring中,“应用上下文(Application Context)”是什么?  

  Spring通过应用上下文(Application Context)装载bean的定义,并把他们组装起来。

  Application Context全权负责对象的创建和组装

  Spring中自带了多种Application Context的实现,他们的主要区别在于如何加载配置!

  流程为:通过xml配置文件得到context对象,然后通过context对象的getBean(xxx.class)方法获取一个目标bean(类对象),然后就可以使用啦。

  9、面向切面编程(AOP)的概念。

  AOP允许你把遍布应用各处的功能分离出来形成可重用的组件。

  实际应用中,AOP使得核心业务和系统服务(如日志)分离开来,,使得业务组件具有更高的内聚性,专注自身,而避免系统服务的干扰。

  总之,AOP确保POJO的简单性,是一个非常强大的理念,可以将安全、事务和日志关注点与核心业务逻辑相分离。

  10、Spring使用模板消除样板式代码

  样板式代码,例如JDBC访问数据库等使用频繁又冗长的代码,Spring通过模板封装消除。

  11、工厂模式解耦

 12、IOC底层原理使用的技术(降低类之间的耦合度)

  • XML配置文件;
  • dom4j解析XML;
  • 工厂设计模式;
  • 反射

  步骤:

  1、编写xml配置文件,配置要创建的对象类(即创建bean)

  2、创建工厂类,使用dom4j解析配置文件+反射

    1)使用dom4j解析xml文件——根据所配置的bean的id值,得到class属性;

    2)使用反射,根据class属性值,获取这个类的Class对象

    3)根据得到的Class对象,获取类实例(newInstance方法)

  13、bean实例化的三种方法

  第一种:使用类的无参构造器创建(主要方法);

  第二种:使用静态工厂创建;

  第三种:使用实例工厂创建;

  14、IOC和DI的关系

  IOC:控制反转,把对象的创建交给Spring进行配置

  DI:依赖注入,向类中的属性注入值

  关系:依赖注入不能单独存在,需要在IOC基础上完成操作。

  15、在一个对象(类A)中注入另一个类B的对象属性(setter方法注入)

  (1)在类A中生成类B属性的setter方法;

  (2)创建类A的bean(id=a),创建类B的bean(id=b);

  (3)XML中配置setter方法注入(在类A的bean标签中进行)

  16、注入复杂类型属性

  数组、list集合:

  map集合、properties文件类型:

  17、Spring整合web项目原理

  1)加载Spring配置文件,根它创建对象

  我们可以在代码中通过new操作符来获得ApplicationContext对象,但是这样效率很低下。

ApplicationContext context=
new ClassPathXmlApplicationContext("bean1.xml");

  2)实现思想:把加载配置文件和创建对象过程,放到服务器启动时完成。(把压力交给服务器)

  3)Spring底层实现的技术:

  (1)ServletContext对象

  (2)监听器——监听上述对象的创建

  4)实现过程:

  • 在服务器启动时,为每个项目创建一个ServletContext对象;
  • 在ServletContext对象创建时,使用监听器可以监听它的创建;
  • 这时加载Spring配置文件,把配置文件所配置的对象(bean)创建出来;
  • 把创建出来的对象放到ServletContext域对象中(setAttribute方法);
  • 获取对象时,到ServletContext域得到(getAttribute方法)

  

  18、Spring的注解开发

  首先要在应用上下文中,开启注解扫描。

  (1)通过注解创建bean

  • @Component(value="Bean ID")
  • @Controller——控制器层
  • @Service——业务层
  • @Repository——持久层

  四个注解的功能是一样的,三个衍生注解是为了让标注类本身的用途更加清晰。

  

  (2)选择bean的作用域

  @Scope(value=" ")——prototype、singleton、session、request

  (3)通过注解注入属性——注解写在类的属性上

  • @Autowired——自动装配
  • @Resource(name="Bean ID")——指定注入哪个bean。

  19、AOP概念

  面向切面编程,扩展功能不修改源代码实现。

  AOP采取横向抽取机制,取代传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)

  Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。

  Aspectj是一个基于Java语言的AOP框架,它扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入。

  20、AOP原理

  (1)传统的纵向抽取机制解决方案:

  (2)AOP横向抽取机制——底层使用动态代理方式(理解下“代理对象”的含义)

  针对有接口的情况,使用jdk动态代理:

  没有接口的情况,使用cglib动态代理:

Spring实战(一)Spring简介---呕心沥血只为让Java开发更简单。的更多相关文章

  1. (一)《Spring实战》——Spring核心

    <Spring实战>(第4版) 第一章:Spring之旅 1. 简化Java开发 为了降低Java开发的复杂性,Spring采取了以下4种关键策略: 基于POJO的轻量级和最小侵入性编程: ...

  2. 【Spring实战】Spring容器初始化完成后执行初始化数据方法

    一.背景知识及需求 在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听.Servlet加载初始化等切入点为数据库准备数据,这些初始化数据是系统开始运行前必须的数据,例如权限组.系统选项.默认 ...

  3. 【Spring实战】Spring注解配置工作原理源码解析

    一.背景知识 在[Spring实战]Spring容器初始化完成后执行初始化数据方法一文中说要分析其实现原理,于是就从源码中寻找答案,看源码容易跑偏,因此应当有个主线,或者带着问题.目标去看,这样才能最 ...

  4. 【转】【Spring实战】Spring注解配置工作原理源码解析

    一.背景知识 在[Spring实战]Spring容器初始化完成后执行初始化数据方法一文中说要分析其实现原理,于是就从源码中寻找答案,看源码容易跑偏,因此应当有个主线,或者带着问题.目标去看,这样才能最 ...

  5. (二)《Spring实战》——Spring核心

    第二章:装配Bean 在Spring中,对象无需自己查找或创建与其所关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象.例如,一个订单管理组件需要信用卡认证组件,但它不需要自己创建信用 ...

  6. Spring实战——无需一行xml配置实现自动化注入

    已经想不起来上一次买技术相关的书是什么时候了,一直以来都习惯性的下载一份电子档看看.显然,如果不是基于强烈的需求或强大的动力鞭策下,大部分的书籍也都只是蜻蜓点水,浮光掠影. 就像有位同事说的一样,有些 ...

  7. 【Spring实战】----开篇(包含系列目录链接)

    [Spring实战]----开篇(包含系列目录链接) 置顶2016年11月10日 11:12:56 阅读数:3617 终于还是要对Spring进行解剖,接下来Spring实战篇系列会以应用了Sprin ...

  8. Spring in action(Spring实战) 第四版中文翻译

    第一部分 Spring核心 Spring提供了非常多功能,可是全部这些功能的基础是是依赖注入(DI)和面向方面编程(AOP). 第一章 Springing into action 本章包含: Spri ...

  9. 《Spring实战》读书笔记——Spring简介

    欢迎大家关注我的微信公众号,共同交流Java相关技术! 使用Spring的目的 Spring是为了解决企业级应用开发的复杂性而创建的,使用Spring可以让简单的JavaBean实现之前只有EJB才能 ...

随机推荐

  1. msf端口扫描

    使用MSF发现主机和端口扫描 使用search命令查找需要的模块 MSF模块太多,记不住怎么办!!! 我们不需要记住所有模块,我们只要能找到我们想用的模块就行,平时积累使用的模块也行哦! 比如,我们通 ...

  2. 5.4.1 sequenceFile读写文件、记录边界、同步点、压缩排序、格式

    5.4.1      sequenceFile读写文件.记录边界.同步点.压缩排序.格式 HDFS和MapReduce是针对大文件优化的存储文本记录,不适合二进制类型的数据.SequenceFile作 ...

  3. 【Golang】嗅探抓包,解决线上偶现问题来不及抓包的情况

    背景 测试群里经常看到客户端的同学反馈发现了偶现Bug,但是来不及抓包,最后不了了之,最近出现得比较频繁,所以写个小脚本解决这个问题. 实现思路 实现的思路比较简单: 抓包 存日志 做日志管理 具体实 ...

  4. 【java】简介(一)

    应用:web后端开发.android-app开发.大数据应用开发 学习:java会过时,但程序设计的思想不会过时 特点:1.面向对象,跨平台,语法比c++简单 2.以字节码的形式运行在虚拟机上 3.自 ...

  5. <JavaScript> 匿名函数和闭包的区别

    匿名函数:没有名字的函数:并没有牵扯到应用其他函数的变量问题.仅仅是没有名字. 定义方式: 1,var A = function(){ }; 2, (function (x,y){ })(2,3); ...

  6. 实时流Streaming大数据:Storm,Spark和Samza

    当前有许多分布式计算系统能够实时处理大数据,这篇文章是对Apache的三个框架进行比较,试图提供一个快速的高屋建瓴地异同性总结. Apache Storm 在Storm中,你设计的实时计算图称为top ...

  7. Linux下如何安装Nginx

    看这就够了 https://segmentfault.com/a/1190000012435644 注意如果是远程浏览器访问是否启动了nginx,出现无法访问 服务器能够启动.访问不了页面 很大可能是 ...

  8. RabbitMQ运转流程

    生产者发送消息的过程 生产者连接到RabbitMQ Broker(相当于是一个RabbitMQ服务器),建立一个连接(Connection),开启一个信道(Channel). 生产者声明一个交换器(E ...

  9. 【Python】机器学习之单变量线性回归 利用批量梯度下降找到合适的参数值

    [Python]机器学习之单变量线性回归 利用批量梯度下降找到合适的参数值 本题目来自吴恩达机器学习视频. 题目: 你是一个餐厅的老板,你想在其他城市开分店,所以你得到了一些数据(数据在本文最下方), ...

  10. 01.03 vim编辑器使用

    ==========linux基础命令的使用==========================绝对路径:由根目录(/)开始写起的文件名或目录名称相对路径:相对于目前路径的文件名写法(开头不是/就属于 ...