Spring实战(一)Spring简介---呕心沥血只为让Java开发更简单。
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开发更简单。的更多相关文章
- (一)《Spring实战》——Spring核心
<Spring实战>(第4版) 第一章:Spring之旅 1. 简化Java开发 为了降低Java开发的复杂性,Spring采取了以下4种关键策略: 基于POJO的轻量级和最小侵入性编程: ...
- 【Spring实战】Spring容器初始化完成后执行初始化数据方法
一.背景知识及需求 在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听.Servlet加载初始化等切入点为数据库准备数据,这些初始化数据是系统开始运行前必须的数据,例如权限组.系统选项.默认 ...
- 【Spring实战】Spring注解配置工作原理源码解析
一.背景知识 在[Spring实战]Spring容器初始化完成后执行初始化数据方法一文中说要分析其实现原理,于是就从源码中寻找答案,看源码容易跑偏,因此应当有个主线,或者带着问题.目标去看,这样才能最 ...
- 【转】【Spring实战】Spring注解配置工作原理源码解析
一.背景知识 在[Spring实战]Spring容器初始化完成后执行初始化数据方法一文中说要分析其实现原理,于是就从源码中寻找答案,看源码容易跑偏,因此应当有个主线,或者带着问题.目标去看,这样才能最 ...
- (二)《Spring实战》——Spring核心
第二章:装配Bean 在Spring中,对象无需自己查找或创建与其所关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象.例如,一个订单管理组件需要信用卡认证组件,但它不需要自己创建信用 ...
- Spring实战——无需一行xml配置实现自动化注入
已经想不起来上一次买技术相关的书是什么时候了,一直以来都习惯性的下载一份电子档看看.显然,如果不是基于强烈的需求或强大的动力鞭策下,大部分的书籍也都只是蜻蜓点水,浮光掠影. 就像有位同事说的一样,有些 ...
- 【Spring实战】----开篇(包含系列目录链接)
[Spring实战]----开篇(包含系列目录链接) 置顶2016年11月10日 11:12:56 阅读数:3617 终于还是要对Spring进行解剖,接下来Spring实战篇系列会以应用了Sprin ...
- Spring in action(Spring实战) 第四版中文翻译
第一部分 Spring核心 Spring提供了非常多功能,可是全部这些功能的基础是是依赖注入(DI)和面向方面编程(AOP). 第一章 Springing into action 本章包含: Spri ...
- 《Spring实战》读书笔记——Spring简介
欢迎大家关注我的微信公众号,共同交流Java相关技术! 使用Spring的目的 Spring是为了解决企业级应用开发的复杂性而创建的,使用Spring可以让简单的JavaBean实现之前只有EJB才能 ...
随机推荐
- Redis集群模式之分布式集群模式
前言 Redis集群模式主要有2种: 主从集群 分布式集群. 前者主要是为了高可用或是读写分离,后者为了更好的存储数据,负载均衡. 本文主要讲解主从集群.本章主要讲解后一半部分,Redis集群. 与本 ...
- 重读APUE(12)-SIGCHLD与僵尸进程
SIGCHLD信号是当子进程终止时向父进程发送的信号:它的语义如下: 如果进程明确的将该信号设置为SIG_IGN,则调用进程不会产生僵尸进程:这种情况下,wait是等不到给子进程收尸的,所以wait阻 ...
- 网络共享服务—SAMBA服务
SAMBA服务简介 SMB:Server Message Block服务器消息块,IBM发布,最早是DOS网络文件共享协议 Cifs:common internet file system,微软基于S ...
- 淘宝rem适配方案
/*px 转化换 rem ,转化是 10 .比如:你的设计图为750,那么就 750 / 75 = 10 rem.设计图中你量尺寸都要除 75 就是 rem值.再比如量的设计图按钮宽度 66px,那么 ...
- maven在整合springmvc+hibernate运行时遇到的一些问题
在这里大概记录一下自己在搭建的时候遇到的一些小问题. 1,在获取hibernate的sessionFactory对象时报空指针异常,我的常规配置如下:
- docker安装mysql挂载外部配置和数据目录
从docker hub上可以找到mysql外挂配置和数据目录的一些文档说明 https://hub.docker.com/_/mysql 从该文档中可以了解到,mysql的默认配置为/etc/mysq ...
- (一)OpenCV-Python学习—基础知识
opencv是一个强大的图像处理和计算机视觉库,实现了很多实用算法,值得学习和深究下. 1.opencv包安装 · 这里直接安装opencv-python包(非官方): pip install ope ...
- dll程序开发总结
1.修改生成的dll名称 VS2012中选中某个项目,项目--属性--配置属性--连接器--常规--输出文件
- ListView在编辑状态下不能获取修改后的值,无法更新数据
ListView在编辑状态下不能获取修改后的值,获取到的总是以前的值解决方法:在page_load事件里写: if(!IsPostBack) { ListViewBind(); } 原因:这涉及到as ...
- Redis有序Set、无序Set的使用经历
为了实现一个类似关系数据库中的卖家信息的单表,首先我们知道单表必然可增删查改,其次为了区分先来后到又需要有ID主键且自增长.开始考虑使用hash数据类型,因为hash是key+列1.列2...这样一来 ...