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才能 ...
随机推荐
- Elasticsearch的java客户端JEST的操作
准备 把Elasticsearch安装好 安装百度上有很多资料. 导入必要的包 <parent> <groupId>org.springframework.boot</g ...
- java设计模式简述
1.代理模式:有一个接口或者顶层类(可以是抽象的)A,一个实现类B,一个代理类C,代理类C之所以能够是代理类,是因为1.C也实现了A.2.C持有A的依赖,用来注入真实的实现B.3.C的实现方法中实际调 ...
- 导出和导入eclipse中通过help安装的插件的地址
这种方式和在线安装一样,唯一方便的就是不用再去翻找软件下载地址 导出已安装的插件: 打开Window ——>Preferences ——>Install/Update——>Avail ...
- postgresql interval 字段拼接
无拼接时: SELECT scan_time + '5 day' FROM tbl_temp_record SELECT scan_time + '-5 day' FROM tbl_temp_reco ...
- 《你不知道的JavaScript(上)》笔记——作用域是什么
Javascript是一门编译语言,它不是提前编译的, 编译结果也不能在分布式系统中进行移植. 在传统编译语言的流程中, 程序中的一段源代码在执行之前会经历三个步骤, 统称为"编译" ...
- C#中正则表达式解析字符串信息
正则表达式提取0~9数字 private static string RegexPickupNumber(string str) { string pattern = @"[^0-9]+&q ...
- linux下如何批量替换多个文件中的某个字符串?
答: sed -i "s/<old_string>/<new_string>/g" `grep "<old_string>" ...
- 关于Intel处理器架构中AVX2里Gather特性的说明
在Intel Haswell架构里引入了Gather特性.它使得CPU可以使用向量索引存储器编址从存储器取非连续的数据元素.这些gather指令引入了一种新的存储器寻址形式,该形式由一个基地址寄存器( ...
- Redis查询_Tips
基础知识——介绍 Redis简介 REmote Dictionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个完全 ...
- mongodb and 和 or 查询
db.getCollection('gxyWarnEntity').find({ "schoolId" : "f11c8ea12f457dbc19c768a8bb6357 ...