Spring学习

概述

分层的JavaSE/EE轻量级开发的一站式框架

一站式:有EE开发的每一层的解决方案

Web层:SpringMVC

Service层:声明式事务、Bean管理

DAOjdbc模板,ORM模块(整合其他框架)

 

好处(优点、特点)

1.方便解耦,简化开发

通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

2.AOP编程的支持

通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。

3.声明事物的支持

Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

4.方便程序的测试

可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:SpringJunit4支持,可以通过注解方便的测试Spring程序。

5.方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,HibernateHessianQuartz)等的直接支持。

6.降低Java EE API的使用难度

Spring对很多难用的Java EE API(如JDBCJavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。

7.Java 源码是经典学习范例

Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。

 

结构图

 

 

SpringIOC

简述:控制反转,将对象的创建权反转给Spring

应用场景:

Dao层需要使用多个版本,jdbc版本,hibernate

Service层需要改变源代码,切换底层实现类,需要修改程序。

IOC可以帮助我们扩展程序。

两种方式对比图,工厂+反射+配置实现解耦合,有修改则改配置文件

 

 

IOC和DI

1、DI:依赖注入,前提是IOC环境,Spring将会管理类的属性(设置注入进来)

2、面相对象的时候

依赖 B类的方法需要传入A类

继承 B类继承A类 is-a

聚合 has a

 

 

Spring工厂类

1、老版本 BeanFactory

调用getBean的时候,才会生成类的实例

2、新版本 ApplicationContext

加载配置文件时,会将Spring管理的类都实例化

两个实现类:

ClassXmlApplicationContext,加载类路径下的配置文件

FileSystemXmlApplicationContext,加载文件系统下(硬盘)的配置文件

 

 

Spring配置文件

1、XML配置

//  一个XML可以被一个dtd约束,可以被多个scheme约束

// 配置XML add XML catalog location

2、Bean标签

   id:使用了约束中的唯一约束,不能出现特殊字符

  name:没有使用约束中的唯一约束(理论可以重复出现),但 开发中不允许

  init-method=“自定义名字”,自定义名就是方法名,可以在 实现类初始化时自动调用

  destory-method 单例创建,工厂关闭的时候执行

  scope属性:bean的作用范围

    取值:singleton(默认):单例模式

    property:多例,用一次new一个

    request:应用在web项目中,创建类后放在request 范围

    session:应用在web项目中,创建类后放在session 范 围

    globalsession:应用在web项目中,porlet环境下使用, 例:在主网站上登录:在子网站上就能在进行登录

3、Spring分模块开发

  1、创建ClassPathXmlApplication时加载多个

  2、在一个配置里引用多个,import标签,resource属性

 

依赖(属性)注入

DI,三种方法,Spring属性注入支持前两种

 

1、构造方法方式 先创建构造方法,再去配置

bean的子标签constructor-arg 属性 name value ref

 

2set方法方式

bean的子标签 property 属性  name value

对象类型不能用valueref用来设置其他类idname

 

3、接口注入

  1、 P名称空间的属性注入(Spring2.5以后)

在约束上,复制xmls,并加后缀xmlsp并把路径最后改为p

普通属性 p:属性名=“值”在bean标签里加入的属性

对象属性 p:属性名-ref=“值”

  2、SpEL的属性注入(spring3.0

SpELSpring Expression language

value#{},里面可以进行计算等功能,可以直接写beanid值,也可以写bean的方法调用

  3、集合属性注入

 

IOC注解

1、配置(开启注解)

contextcopmonent-scan标签 base-package属性

2、使用

  1、在实现类上添加注解,@Componentvalue=userDao”), value可省略,把类交给Spring管理,相当于<bean id=”userDao” class=“这个实现类的包名”>

  2、设置属性的值

可以没有set方法,将注解添加到属性上@Value(“”)

有的话,要将注入的注解添加到set方法上

3、注解详解

 

  1、类注解

@Controller:web

@Serviceservice

@Repositydao

 

  2、属性注解

普通:@Value

对象:@Autowired,按照类型完成属性注入

但是我们习惯按照名称完成属性注入,所以加@qualifier一起 使用(value=“组件的设置名称”)

@resource:完成对象属性的注入,并按照名称完成注入 name=“”),开发使用这个的频率高

 

  3、生命周期注解

// @PostConstruct 相当于init-method

@PreDestory destory-method

 

  4、作用范围注解(在类上)

// @Scope(不写默认单例)

property:多例,用一次new一个

request:应用在web项目中,创建类后放在request 范围

session:应用在web项目中,创建类后放在session 范 围

globalsession:应用在web项目中,porlet环境下使用, 例:在主网站上登录:在子网站上就能在进行登录

4、XML和注解的比较

XML:适用任何场景,结构清晰,维护方便。

注解:这个类不是自己提供就不可以使用,修改需要查看源 代码

 

AOP开发

1、概述

面向切面编程,解决OOP开发遇到的问题,是OOP的一种延

优点:横向抽取(代理机制)代替纵向继承

不修改源代码的情况下,进行功能的增强:校验、日志等功能

Spring是应用aop思想最好的框架

Spring有自己的实现方式(但是繁琐,被摒弃),AspestJ AOP的一 个框架,Spring就把它引入

Spring底层的AOP实现原理

2、动态代理

JDK动态代理:对实现接口的类产生代理

Cglib动态代理(类似于Javassist第三方代理技术):对没有实现接口的类产生代理,生成子类对象。

实现步骤:

  1、创建核心类

  2、设置父类

  3、设置回调

  4、创建代理对象

  5、实现MethodInterceptor,重写intercept方法

3、AOP开发术语

连接点:可以被增强(拦截)的点(方法)

切入点:真正被拦截的点

通知/增强:方法层面的增强,其中一个方法进行增强,增强 的方法叫做通知

引介:类层面的增强

目标对象:被增强的对象

织入:将advice应用到target的过程

代理:被增强后产生的代理类

切面:多个通知和多个切入点的组合

 

AspectJXML方式开发

1、概述:AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。

2、配置

引入aop的开发包 3个包:aop联盟的,spring的,aspectJ springAspectJ整合的包

引入Spring整合单元测试的jar

使用:@RunWith @ContextConfiguration

3、测试,编写一个切面类并配置

// AOP配置

<aop:config>

<aop:pointcut expression=”excution(*实现类包名.save(..))”  id = “pointcut1”/> // * :任意返回值类型,..:任意参数

//配置切面

<aop:aspect ref=”切面类的id”>

<aop:before method=”切面类里的方法名”  pointcut-ref=”pointcut1”/>

</aop:aspect>

</aop:config>

 

AOP注解开发

1、引包,配置目标类和切面类

2、配置中开启注解

<aop:aspectj-autoproxy>

3、在切面类上添加注解,@Aspest

在方法上添加通知类型,@Before(value=“excution(*实现类 包名.save(..))”)

切入点注解,@Pointcut(value=“实现的方法”)

私有一个方法,在通知里写value=“切面类名.私有的方法名”

 

Spring通知类型

1、前置:目标方法执行之前

2、后置:

3、环绕:之前和之后

4、异常抛出通知:异常执行

5、最终:无论是否异常都会执行

6、引介通知:(不使用)

 

jdbc模板

1、引入jar包

 

基本的6个,数据库驱动,spring的jadbc模板(两个),单元测试的包,aop的包

 

2、优化,配置连接池对象以及属性注入

  1、配置jdbc模板对象注入dataSource

  2、配置DPCPC3P0连接池

DPCP:引入jardbcppool,配置的时候引的class需注意

C3P0:引入jar包一个,配置的时候引的class需注意

  3、优化配置文件

    1、引入外部文件 jdbc.properties

    2、在配置文件里引入属性文件的两种方法

      1、很少用,bean标签引入,属性写 name value

      2、context标签,<context:property-placeholder location=”classpath:jdbc.properties”></context>

      3、在连接池的属性里 value=”${jdbc.driveClass}” 

 

CRUD操作

1、查询

jdbcTemplate.queryForObject(“”, .class,)

2、查询对象

第二个位置是rowMapper的子类实现,在里面实现把结果集 封装到account对象里,例:new account对象 account.setId(rs.getIn(“id”))

3、查询多条记录

list集合接收

 

事务

1、事务概述

逻辑上的一组操作,组成操作的各个单元,要么全成功要么 全失败

 

2、Spring事务管理API

DataSourceTransactionManager:底层使用jdbc管理

HibernateTreansactionManager:底层使用hibernate

 

3、TransactionDefinition

事务信息定义:隔离级别、超时信息、传播行为

 

4、TransactionStatus

事务状态

Spring的事务管理,首先平台管理器根据事务定义的信息进 行管理,在管理过程中,产生各种状态,将这些状态记录到事务状态的对象中

 

5、事务应用场景

事务的传播行为解决业务层相互调用的问题

 

6、事务的传播行为(方式)

  1、保证多个操作在同一事务

PROPAGATION_REQUIRED:默认值,A中有事务,使用A中的 事务,A没有,创建一个新的事务,将操作包含进来

  2、多个操作不在同一事务

PROGARATION_REQUIRES_NEWA中有事务,将A事务挂起, 创建新事务,只包含自身操作

  3、嵌套式

PROGARATION_NESTEDA中有实事物,执行完设置一个保存点。B操作有异常可回最初状态,也可回保存点

 

7、Spring事务管理配置

编程式管理

1、配置平台事务管理器

<bean id = “transactionManager” class = “”> 属性 name=”dataSource”  ref=”dataSource”

2、配置事务管理模板

<bean id = “transactionTemplate” class = “”> 属性 name=”transactionManager”  ref=”transactionManager”

3、在业务层注入事务管理的模板

属性 name= “transactionTemplate” ref= “transactionTemplate”

业务层写方法,测试类调用

 

声明式事务配置(AOP思想)

1、XML方式

引入AOP相关包(4个)

配置事务管理器

事务增强

<tx:advice transaction-manager=”transactionManager”>

<tx:attributes>

<tx:method name=”方法名”   propagation=”REQUIRED”  isolation=””/>

AOP配置

2、注解方式

引入AOP相关包(4个)

配置事务管理器

开启注解事务

<tx:annotation-driven taransaction-manager=”transactionManager”>

在业务层上添加注解@Transactional可以有属性 isolation

转载于:https://www.cnblogs.com/kyuusan/p/11053108.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值