java框架:超详细Spring知识点汇总

1spring框架概述

1.1什么是spring

lSpring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

l轻量级:与EJB(enterprise javabean ,企业级javabean)对比,依赖资源少,销毁的资源少。

l分层: 一站式,每一个层都提供的解决方案

web层:struts,spring-MVC

service层:spring

dao层:hibernate,mybatis , jdbcTemplate

1.2spring由来

lSpring 是java平台上的一个开源应用框架。它的第一个版本是由Rod Johnson写出来的。Rod在他的Expert One-On-One Java EE Design and Development(Java企业应用设计与开发的专家一对一)一书中首次发布了这个框架.

小编是一个有着5年工作经验的java程序员,对于java,自己有做资料的整合,一个完整学习java的路线,学习资料和工具,相信这里有很多学习java的小伙伴,我创立了一个2000人学习扣群,479121291。每晚都有java的直播课程。无论是初级还是进阶的小伙伴小编我都欢迎!

1.3spring核心

lSpring的核心是控制反转(IOC: inversion of control)和面向切面(AOP: aspect oriented program)

1.4spring优点

l方便解耦,简化开发(高内聚低耦合)

•Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理

•spring工厂是用于生成bean

lAOP编程的支持

•Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

l声明式事务的支持

•只需要通过配置就可以完成对事务的管理,而无需手动编程

l方便程序的测试

•Spring对Junit4支持,可以通过注解方便的测试Spring程序

l方便集成各种优秀框架

•Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持

l降低JavaEE API的使用难度

•Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

1.5spring体系结构

Spring框架整体被分为五个模块:核心容器(core container), 面向切面编程(aop), 数据访问(date access), web, test.

Spring4去掉了spring3中的struts,添加了messaging和websocket,其他模块保持不变

Spring的jar包大约20个,每个都有相应的功能,一个jar还可能依赖了若干其他jar,所以搞清楚它们之间的关系,配置maven依赖就可以简洁明了.

1.5.1 core

core部分包含4个模块

spring-core:依赖注入IoC与DI的最基本实现

spring-beans:Bean工厂与bean的装配

spring-context:spring的context上下文即IoC容器

spring-expression:spring表达式语言

它们的完整依赖关系

因为spring-core依赖了commons-logging,而其他模块都依赖了spring-core,所以整个spring框架都依赖了commons-logging,如果有自己的日志实现如log4j,可以排除对commons-logging的依赖,没有日志实现而排除了commons-logging依赖,编译报错

1.5.2 aop

aop部分包含4个模块

spring-aop:面向切面编程

spring-aspects:集成AspectJ

spring-instrument:提供一些类级的工具支持和ClassLoader级的实现,用于服务器

spring-instrument-tomcat:针对tomcat的instrument实现(包含了spring的tomcat设备代理)

它们的完整依赖关系

1.5.3 data access

data access部分包含5个模块

spring-jdbc:jdbc的支持

spring-tx:事务控制

spring-orm:对象关系映射,集成orm框架

spring-oxm:对象xml映射

spring-jms:java消息服务

它们的完整依赖关系

1.5.4 web

web包含4个模块

spring-web:基础web功能,如文件上传

spring-webmvc:mvc实现

spring-webmvc-portlet:基于portlet的mvc实现

spring-websocket:为web应用提供的高效通信工具

它们的依赖关系

1.5.5 test

test部分只有一个模块,我将spring-context-support也放在这里

spring-test:spring测试,提供junit与mock测试功能

spring-context-support:spring额外支持包,比如邮件服务、视图解析等

它们的依赖关系

1.5.6 spring4新增

Spring4去掉了spring3中的struts,添加了messaging和websocket,其他模块保持不变.

spring-websocket:为web应用提供的高效通信工具

spring-messaging:用于构建基于消息的应用程序

它们的依赖关系

2Demo1:xml方式配置IOC

2.1什么是IOC

Inversion of control(控制反转), 从字面上来理解: 当一个对象创建时, 它所依赖的对象由外部传递给他, 而非自己去创建所依赖的对象(比如通过new操作). 因此,也可以说在对象如何获取他所依赖的对象这件事情上, 控制权反转了.

2.2导入jar

l4 1(4个核心jar commons-logging依赖)

如果使用maven管理,只需要配置context

lSpring的jar结构(字节码.文档.源码)

https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework

2.3搭建项目的基本结构

2.4创建配置文件

l文件名: 任意, 官方推荐使用 applicationContext.xml

l文件位置: 任意, 官方推荐放在classpath(src)下(这个叫做约定大于配置)

l配置文件内容: 引入schema约束,配置bean

基本的IOC功能只需要引入beans约束.

约束文件的位置:

spring-framework-4.1.6.RELEASEdocsspring-framework-referencehtml\xsd-config.html

2.5测试

加载配置文件创建ApplicationContext上下文对象

从上下文中获取对象

2.6IOC的底层原理

lXml解析

l工厂设计模式

l单例模式

l反射

2.7Bean实例化的三种方式

2.7.1 使用类的无参构造函数创建对象(常用!重要!)

如果类中没有显示声明构造函数,系统会为该类提供一个默认的构造函数,开发者为一个类提供了构造函数,系统将不再为该类提供构造函数.

如果创建了有参的构造函数,没有显示声明无参空构造,会抛出异常

2.7.2 使用静态工厂创建对象

l需要创建一个工厂类,并提供一个静态方法返回目标类的对象

lXml文件配置bean的时候class属性需要指向工厂类的路径,同时需要指定factory-method属性,属性值为工厂的静态方法

2.7.3 使用实例工厂创建对象

创建实例工厂类,提供一个非静态的方法返回目标类的对象

配置实例工厂bean

配置目标类bean, 配置factory-bean属性,值指向工厂bean的id;配置factory-method属性,值为工厂类中的get方法

2.8Bean标签的常用属性

lid : 给实例对象取一个名字,通过这个名字来标识一个对象,该属性值不能包含特殊符号,一般使用首字母小写的类名

lname(不推荐使用): 功能和id一样,但是可以包含特殊符号,是为了整合struts框架遗留的,现在基本不用

lclass : 指定配置对象所在类的全限定名:包名 类名

lscope : 用于配置spring bean的作用域

singleton : 默认值,表示该对象的实例为单例(如果配置多个bean,则存在多个对象)

prototype : 多例

request: 创建对象并放到request作用域

session: 创建对象并放到session作用域

globalSession: 创建对象并放到globalSssion作用域

Init-method

Destroy-method

Lazy

3DI:依赖注入

3.1Dependency injection.

什么是依赖?

一个对象完成业务功能需要依赖另一个对象,比如service功能需要依赖于dao

什么是注入?

就是在获取一个对象时,该对象所依赖的实例已经

由spring替我们分配了

3.2属性注入的两种方式

set方法注入(重点掌握)

xml方式配置DI时,必须为属性添加set方法,注解不需要

xml方式配置DI(基本类型):

xml方式配置DI(注入对象):

xml方式配置DI(复杂类型)

Xml配置文件:

名称空间设置属性值

Spring2.X以后提供了名称空间p的属性输入方式

l第一步:引入p名称空间

xmlns:p=''http://www.springframework.org/schema/p''

l第二步:使用p名称空间

普通属性: p:属性名=””

对象类型属性: p:属性名-ref=””

SpEL的方式属性注入

Spring3.X以后提供了SpEL的方式注入属性

语法:

有参构造函数注入(了解)

创建无参构造函数

创建有参构造函数

在xml文件中采用注入

4Demo2: 注解方式配置IOC

4.1导入jar

l4 1(4个核心jar commons-logging)

lspring-aop : 使用注解会使用到该jar

4.2创建类

4.3创建配置文件

l在demo1的基础上添加context约束

l在applicationContext.xml中添加注解的配置(非常重要):

l属性注解

如果bean的装配使用xml,依赖的装配使用注解,可以使用以下配置

该配置只会扫描属性上的注解(通常是@Autowired)

4.4配置组件和DI

l在java类上添加@Component(“id”)注解(id可选),告诉spring这是一个组件,交由spring管理,这一步相当于xml当中的配置

l除了@Component以外还有其他几个注解配置组件:

n@Controller

n@Service

n@Repository

l配置组件之后,如果未指定id,默认给对象配置一个类名首字母小写的id,如果以显式的配置了id,则默认的就不存在了

l如果有依赖,在依赖上添加@Autowired注解,使用该注解,没有set方法也可以

l除了@Autowired,@Resource也可以用来装配bean

@Autowired默认按类型进行装配(该注解由spring提供),默认情况下必须要求依赖对象存在,如果要允许null值,可以设置required属性为false,如:@Autowired(required=false);如果想要使用名称装配,可以结合使用@Qualifier,如:@Autowired@Qualifier(“name”);

@Resource(该注解由j2EE提供),默认按照名称进行装配,名称可以通过name属性进行指定,如果未指定name属性,当注解写在字段上是,默认取字段名查找,当找不到名称匹配的bean时,才按照类型进行装配.但是如果name属性一旦指定,将只会按照名称进行装配

4.5测试

5AOP

5.1什么是AOP

lAOP全称 aspect oriented program,中文名为面向切面编程.

lAOP的OOP的延续,是spring框架中的一个热点和优势,利用AOP可以对业务的各个部分进行隔离,从而使得业务逻辑各个部分之间的耦合度降低.提高代码的复用性,同时提高开发效率

lAOP采取了横向抽取的机制,取代了传统纵向继承体系的重复性代码

l应用场景:日志, 事务管理, 缓存, 性能检测等

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

lAspectj 是一个基于java语言的AOP框架,从spring2.0开始,引入了对于Aspectj的支持

5.2AOP的专有名词

ltarget : 目标类

ljoinpoint : 连接点是指所有可能织入通知的方法,理论上大部分方法都是连接点

lpointcut : 切入点, 已经被增强(或者说织入通知)的方法

ladvice: 通知,增强的方法,比如日志,事务

laspect : 切面,是指advice和pointcut的结合

lweaving: 织入,将advice应用到目标对象来创建新的代理对象的过程

6Demo3: xml方式配置AOP

6.1导入jar

l4 1(4个核心jar commons-logging)

lSpring的aop jar

nspring-aop > aopalliance(aop联盟)

laspects的jar(集成aspectj)

nspring-aspects > aspectjweaver

6.2创建业务类和增强类

业务类:UserService

增强类:LogAspect

6.3创建配置文件

l添加约束:bean,aop

l配置bean

l配置aop:切点 切面

6.4测试

6.5通知的类型

lbefore:前置通知,在目标方法被调用之前调用通知功能

lafter:后置通知,在目标方法完成之后调用通知,不关心目标方法的输出

lafter-returning:返回通知,在目标方法成功执行之后调用通知

lafter-throwing:异常通知,在目标方法抛出异常之后执行通知

laround:环绕通知,在调用前后都会执行

n环绕通知接收一个参数: ProceedingJoinPoint

6.6切入点表达式

lexpression=''execution(* service.UserService.addUser(..))''

[访问修饰符] 方法返回类型 包名.类名.方法名(参数)

访问修饰符通常省略

l几种常用写法

7Demo4: 注解方式配置AOP

7.1导入jar

l4 1(4个核心jar commons-logging)

lSpring的aop jar

nspring-aop > aopalliance(aop联盟)

laspects的jar(集成aspectj)

nspring-aspects > aspectjweaver

7.2创建业务类和增强类

业务类:UserService

增强类:LogAspect

7.3配置组件和切面

l创建配置文件

l引入约束:beans, aop, context

l配置组件的包扫描:

n

l配置开启aop自动代理

n

l在组件上添加@Component注解

l在切面上添加@Aspect注解

l在通知类的方法上添加切入点表达式的注解

7.4测试

8JDBCTemplate

lSpring提供了用于操作JDBC的工具类,类似于DBUtils

lSpring对于不同持久化技术提供了不同的模板类

8.1回顾JDBC操作数据库

1.加载驱动类

2.传入参数信息获取连接

3.通过连接获取PrepareStatement对象

4.通过PrepareStatemen对象执行sql语句

5.从ResultSet获取结果集

8.2通过JDBCTemplate操作数据库

8.2.1 导入jar

l4 1

lSpring-jdbc

lSpring-tx 事务包

lmysql.connector数据库驱动包

8.2.2 创建DriverManagerDataSource对象,设置数据库信息:驱动,数据库地址,账号,密码

8.2.3 创建JdbcTemplate对象,设置数据源

8.2.4调用JdbcTemplate对象中的方法实现操作

l增(JdbcTemplate.update)

String sql = “insert into user values(null, ?, ?)”;

int row = jdbcTemplate.update(sql, “andy”, 50);

l删(JdbcTemplate.update)

String sql = “delete from user where name=?”;

int row = jdbcTemplate.update(sql, “andy”);

l改(JdbcTemplate.update)

String sql = ''update user set age=? where name=?'';

int row = jdbcTemplate.update(sql, 18, ''jiayu'');

l查1(查询返回某一个指定类型的值)

jdbcTemplate.queryForObject( String sql, Class requireType)

比如 select count(*) from user,返回值是int, 则第二个参数传Integer.class

l查2(查询一个对象)

jdbcTemplate.queryForObject(String sql, RowMapper rowMapper, Object ...args)

调用该方法,需要注意的是该方法需要传入一个RowMapper类型的对象,spring只提供了接口,需要自己手动去实现,写法相当于jdbc获取结果当中while(resultSet.next()){}循环体内的部分

l查3(查询一个对象集合)

jdbcTemplate.query(String sql, RowMapper )

8.3以配置方式注入dataSource和jdbcTemplate

9Spring的事务管理

9.1什么是事务

一组对于数据库的操作,是最小的数据库操作单元.要么都成功,有么都不执行.

Mysql是支持事务的

Mysql是事务是自动提交的.

在mysql的jdbc当中进行事务管理:

1.手动开启事务

2.手动提交事务

3.回滚

9.2事务的特性(ACID)

原子性: 一个事务单元里面的多个数据库操作,不可分割

隔离性: 一个事务操作不能影响其他事务

一致性:

持久性:

9.3并发事务下可能出现的问题

脏读: 是一个事务读到了另一个事务没有提交的数据

不可重复读: 针对的是记录的修改操作

幻读: 针对的是数据增删操作

9.4解决方法:设置数据的隔离级别

读未提交: 一个问题都没解决

读已提交: 解决了脏读的问题

可重复读: 解决了不可重复读和脏读的问题

串行化: 解决了所有问题..

数据库是有默认的隔离级别的:

Mysql : 可重复读

Oracle: 读已提交

9.5JDBC当中的事务处理

开启事务

Connection.setAutoCommit(false)

提交事务

Connection.commit()

事务回滚

Connection.rollback()

9.6Spring当中的事务处理

平台事务管理器:

PlatformTransactionManager

9.7三种事务处理方案

1.编程式事务

2.声明式事务

2.1 xml方式配置事务

2.2注解方式配置事务

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容