Spring笔记

来源:互联网 发布:万方免费数据库查询 编辑:程序博客网 时间:2024/06/16 11:09

一、spring简介

spring是一个开源轻量级框架, 用于替代EJB。
核心的主要部分

  • (1) IOC: 控制反转,让spring来创建和管理对象而不需要new
  • (2) AOP: 面向切面,扩展功能不用修改源代码实现

spring框架为j2ee全家桶提供一站式解决方案
- 在web层中有: springMVC
- 在service层中有: spring的IOC
- 在dao层中有: spring的jdbcTemplate

二、Spring核心之IoC

ioc作用: 把对象的创建交给spring管理
Ioc和DI的区别

  • (1). IOC:控制反转,把对象创建交给spring进行配置(创建对象)
  • (2). DI: 依赖注入向类里面的属性设置值 ( 操作对象的属性)
  • (3). 关系: 依赖注入不能单独存在,需要在Ioc基础之上完成操作

1. Ioc底层原理使用的技术

  • (1) dom4j解析xml
  • (2) 工厂设计模式
  • (3) 反射

2. 实现Ioc操作的两种方式

  • (1) IOC的配置文件方式
  • (2) Ioc的注解方式

3. Ioc入门案例

3.1 导包 (核心四个jar包、支持日志输出的jar包)
3.2 创建Spring配置文件,配置创建类

  • (1) spring核心配置文件的名称和位置可随意,建议放到src下面,官方建议名称:applicationContext.xml
  • (2) 引入schema 约束
  • (3) 配置对象的创建

3.3 写代码测试对象的创建

  • (1) 加载 spring 配置文件, 根据创建对象
    ApplicationContext context = new ClassPathXmlApplicationContext(“xdx.xml”);
  • (2) 得到配置创建的对象
    context.getBean(“xdx”);

3.4 sring整合web项目原理

  • (1). 在合适的地方加载spring核心配置文件
  • (2). 实现思想:在服务器启动时完成加载 文件和创建对象的过程
  • (3). 实现原理(spring已封装好):
    a. 在服务器启动的时候,为每个项目创建一个ServletContext对象
    b. 在ServletContext对象创建的时候 ,使用监听器可以具体 到ServletContext对象有什么时候创建
    c. 当监听器监听 到ServletContext对象创建的时候 : 加载spring配置文件并根据配置文件创建对象,再把创建出来的对象放进ServletContext域中
    d. 到ServletContext获取相关对象

三. spring对Bean的管理

bean实例化的三种方式
(1). 使用类的无参构造创建【重点】
(2). 使用静态工厂方法创建
(3). 使用实例工厂创建

1. bean的xml方式配置 ###

Bean标签常用属性
(1). id属性: 起名称, 根据id值得到配置对象, 不可包含特殊符号
(2). class属性: 创建对象所在类的全路径
(3). name属性: 根据 id 是一样的,现在少用。 可包含特殊符号
(4). scope属性: bean作用范围, 单例 singleton、多例 prototype、请求 request、会话 session、全局会话

bean属性注入方式 (spring支持前两种)
(1). 使用 set 方法注入【重点】: 标签
(2). 有参构造方法: 标签
(3). 使用接口注入
(4). 注入复杂类型
数组
list集合
map集合
properties 类型

2. bean注解配置 ###

什么是注解:代码里的特殊标记
怎么写注解: @注解名称(属性名称=属性值)
哪里可以用注解: 类、方法、属性

spring注解开发的步骤
(1). 导入相关 jar 包
(2). 创建类和方法
(3). 创建spring配置文件,引入约束
(4). 加入开启注解扫描标签

注解创建对象
(1). 在创建对象的类上面加个注解 @Component(value = “xdx”) value可省略
(2). 创建对象有四个注解
@Component
@Controller 建议在Web层使用
@Service 建议在业务层使用
@Repository 建议在Dao层使用
目前这四个注解的功能是一样,随便用。后续版本可能会对其增强。在开发时为了清晰,建议在相应的层选择对应的注解名称。
(2) 创建对象时控制是单例还是多例的注解 @Scope

注解注入属性举例
使用注解注入属性不需要set方法,非常方便。
(1). 创建service类,创建dao类. 并加上相应注解
(2). service类里加上@Autowired
(3). 也可以用@Resource(name = “xdx”)注解来代替@Autowired, 用@Resoure要指定name属性

注解和配置文件混合使用
(1). 创建对象使用配置文件方式,而不是加@Component这些注解了
(2). 注入属性操作时用注解实现 ,用@Resoure(name = “”)

四、Spring核心之AOP

1. 概述 ###

AOP即面向切面(方面)编程,扩展功能不通过修改源代码来实现,它使用了横向的抽取机制,取代了传统通过纵向继承来扩展功能时产生的重复性代码

AOP本身对性能有一定影响。

2. 底层原理

动态代理方式
有接口的情况: 使用动态代理方式,创建接口实现代理对象 jdk动态代理
无接口的情况: 创建某个类的子类的代码对象 cglib动态代理

3. AOP的常用操作和相关术语

(1). Joinpoint(连接点) : 指我们要对哪些连接点进行拦截定义
比如: 类里的哪些方法可以被增强,这些方法就叫做连接点
(2). Pointcut(切入点): 在类里面可以有很多方法被增强,但实际中只增强了部分方法,这些被增强了的方法就叫切入点。
(3). Advice(通知/增强): 增强的那些逻辑就称为增强,比如扩展日志功能,这个日志功能就称为增强;
通知/增强类型有
a.前置通知: 在方法之前执行
c. 后置通知: 在方法之后执行
d. 环绕通知: 在方法之前和之后执行
e. 异常通知: 方法出现异常时执行
f. 最终通知: 在后置通知之后执行
(4). AspectJ(切面): 把增强应用到具体的方法上面, 这个过程就叫做切面
总结: 概念坑人, 切面是一个动词并不是名词; Advice指增强的逻辑,注意是逻辑; 切入点就是增强后的方法(连接点)。

4. AOP操作

在spring里面进行aop操作,使用AspectJ实现.
a. AspectJ 是一个面向切面的框架, 它扩展了java语言。 AspectJ 定义了AOP语法,所以它有一个编译器来生成字节码规范的class文件。
b. AspectJ 不是spring的一部分,和spring一起进行aop操作。
c. Spring从2.0以后增加了对AspectJ的支持
d. 使用 AspectJ 实例AOP有两种实现方式
基于 AspectJ 的xml配置文件方式
基于AspectJ 的注解方式

4.1 基于 AspectJ 的xml配置文件方式步骤

    1. aop 操作准备: 导基本jar包和aop相关jar包
    1. 创建 spring 核心配置文件, 导入aop约束
    1. 创建bean
    1. 配置aop , 先配置切入点,再配置切面

使用表达式配置切入点(实际增强的方法)
常用的表达式
execution (<访问修饰符>?<返回类型><方法名><参数><异常>)
举例: execution(* 全限定类名.方法名()) 方法名可以用通配符,全部或者通配部分方法都可以

4.2 使用注解实现 AOP 操作(简单)

    1. 创建bean
    1. 开启aop
    1. 在增强类上面使用注解来完成AOP操作:
      方法上加注解, 如
@Pointcut("execution(* xdx.study.spring..*(..))")

注意如果只用包名, 最后必须有两点。

五、spring的jdbcTemplate操作

spring配置连接池使用jdbcTemplate

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">    <property name="dataSource" ref="dataSource" /></bean><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">    <property name="driverClassName" value="com.mysql.jdbc.Driver" />    <property name="url" value="jdbc:mysql://localhost:3306/test" />    <property name="username" value="root" />    <property name="password" value="root" /></bean>

dao使用jdbcTemplate

@Resourceprivate JdbcTemplate jdbcTemplate;

六、Srping事务管理

6.1 什么是事务:

事务特性:原子性、一致性、隔离性、持久性
不考虑隔离性产生读问题: 脏读、不可重复读、幻读
解决读问题: 设置隔离级别

6.2 Spring事务管理API

spring事务管理两种方式

1. 编程式事务管理(不用)

2. 声明式事务管理

基于xml配置文件实现

(1) 首先配置事务管理器
(2) 配置事务增强
(3) 配置切面

基于注解方式实现
(1) 首先配置事务管理器, 不同的ORM框架用的事务不同

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    <property name="dataSource" ref="dataSource" /></bean>

(2) 配置事务注解

<tx:annotation-driven transaction-manager="transactionManager"/>

(3) 在要使用事务的方法所在的类上面添加注解,以下是示例,出现异常时回滚

@Transactional(rollbackForClassName = "Exception")

3. Spring事务的隔离级别

ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与JDBC的隔离级别相对应
ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

0 0