Spring知识点最全笔记

更新时间:2024-03-31 14:07:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

说 明

笔记中每个知识点均标有如下标识中的一个或多个,释义如下:

理解要求:

了解:了解本知识点,明确本知识点的作用 理解:理解本知识点所涉及内容的工作原理

操作要求:

操作:根据本知识点所涉及的内容,进行课堂案例的制作 应用:根据本知识点所涉及的内容,进行融会贯通,灵活应用

知识点相关:

重点:本知识点为本课程重点内容

难点:本知识点为本课程难点内容,理解难度较高(难点不一定是重点)

目 录

spring简介【了解】 ..........................................................................................................................................................3 资源包整理【了解】【应用】 ...........................................................................................................................................4 IoC【理解】【应用】【重点】 ...........................................................................................................................................5 DI【理解】【应用】【重点】 ............................................................................................................................................7 BeanFactory【了解】 ........................................................................................................................................................8 Bean配置(XML)【理解】【应用】【重点】 .................................................................................................................9 团队开发【了解】【操作】 .............................................................................................................................................13 Bean配置(注解)【了解】【操作】 ..............................................................................................................................14 Spring整合JUnit【了解】【操作】 ...............................................................................................................................16 AOP简介【理解】【重点】 ............................................................................................................................................17 AOP简介【理解】【重点】 ............................................................................................................................................17 AOP基本概念【理解】【重点】 ....................................................................................................................................18 AOP(XML)【理解】【应用】【重点】 ........................................................................................................................19 AOP(注解)【理解】【应用】【重点】 .........................................................................................................................24 CGLIB【理解】【难点】 .................................................................................................................................................25 DAO模板类【了解】 .....................................................................................................................................................26 DAO支持抽象类【理解】【操作】 ...............................................................................................................................29 事务管理基本概念【了解】 ...........................................................................................................................................31 声明式事务(XML)【理解】【重点】 ..........................................................................................................................34 声明式事务(注解)【理解】【应用】【重点】 .............................................................................................................36 SSH整合(XML)【理解】【应用】【重点】 ................................................................................................................37 Hibernate模板类【理解】【应用】【重点】 ..................................................................................................................42

spring简介【了解】

1.Spring是一个基于Java的轻量级的J2EE框架 基于Java: 底层Java实现

轻量级:性能较高,运行速度较快,内存消耗较少 重量级组件:EJB、CGI

J2EE应用框架:Spring可以在JEE开发的三层架构的每一层为开发者带来帮助 表现层:Servlet/JSP,Struts2,SpringMVC

业务层:Bean管理、AOP、事务管理

数据层:JDBC,Hibernate,Spring JDBCTemplate

域模型层:实体类+DAO 服务层:远端调用(webservice)[类似技术RMI+JNDI] Spring提供的每层的服务技术 表现层:String MVC 业务逻辑层:Bean管理、AOP、事务管理 数据层:DAO支持抽象类,DAO模板技术JDBCTemplate 2. Spring的发展历程 创始人:Rod Johnson Expert One-to-One J2EE Design and Development(2002) 阐述了J2EE使用EJB开发设计的优点及解决方案 Expert One-to-One J2EE Development without EJB(2004) 阐述了J2EE开发过程中不使用EJB的解决方式(Spring雏形) 3.Spring核心技术

IOC:控制反转 AOP:面向切面编程/面向方面编程 4.Spring是一个超级的“黏合平台”,将很多技术黏合在一起,形成一个整体,使每个组件发挥其最大功效

资源包整理【了解】【应用】 1.本课程基于Spring3.2.0进行讲解 2.下载地址:http://maven.springframework.org/release/org/springframework/spring/ 说明:通过Maven部署资源从仓库获取(后期课程) 3.资源文件

Spring资源包下 spring-framework-3.2.0.RELEASE-dist.zip

Spring依赖资源包 spring-framework-3.0.2.RELEASE-dependencies.zip 4.资源包目录层次结构 docs:API帮助文档与官方手册 libs:开发使用的jar包 schema:开发使用的XML约束文档源文件

5.开发jar包 核心jar(4个) spring-beans-3.2.0.RELEASE.jar spring-context-3.2.0.RELEASE.jar spring-core-3.2.0.RELEASE.jar spring-expression-3.2.0.RELEASE.jar 日志相关jar(2个) commons-logging-1.1.1.jar commons-logging日志整合,与slf4j类似,由apache提供 log4j-1.2.15.jar

IoC【理解】【应用】【重点】

1.IoC(Inversion of Control)控制反转 A:控制:控制的双方是什么?谁控制谁?

主控方:Spring

被控方:应用程序所使用的资源

(原始)应用程序控制自己执行操作需要使用的外部资源 (Spring)Spring控制整个程序中所需要使用的外部资源 B.反转:什么是反转?反转什么?

正向:应用程序直接调用资源

反向:应用程序依赖Spring为其提供资源

反转的是资源的控制权 应用程序由主动调用资源,变为被动的等待Spring提供资源 C.有什么好处?

正向缺点:应用程序控制的资源分布在程序的每一个地方 反向的优点:所有的资源都在Spring中,便于管理

总结:Spring反向控制应用程序所需要使用的外部资源。资源受Spring管理,利用率最大化。

2.Spring模型演化过程

A.基于分层设计 UserAction 使用UserService,new UserService() UserService 使用UserDAO,new UserDAO() UserDAO B.工厂模式,使用面向接口编程设计,解决层与层之间的紧耦合 制作接口,制作实现类,制作对象工厂 C.工厂模式+配置 制作XML文件,将实现类配置到XML文件中 读取XML文件中的配置信息,得到实现类的类名 使用反射思想,获取实现类对象 class.newInstance(); D.Spring设计雏形 自动的工厂+配置 工厂由Spring提供,实现类使用XML格式配置 3.IoC基础实例

A.导入jar包(6个)

B.制作log4j对应的配置文件

C.在src目录下创建核心配置文件applicationContext.xml 说明:格式可以从xsd-config.html获取

D.将应用程序需要使用的资源配置成Spring的Bean

E.创建ApplicationContext对象 ApplicationContext ctx = new ClassPathXmlApplicationContext(\配置文件名\ ApplicationContext ctx = new ClassPathXmlApplicationContext(\F.获取Bean对象 使用应用上下文对象获取 ctx.getBean(\的id属性值\ ctx.getBean(\

补充:使用文件系统获取配置信息,要求配置文件在工程路径下(少用)

ApplicationContext ctx = new FileSystemXmlApplicationContext(\

DI【理解】【应用】【重点】 1.DI(Dependency Injection)依赖注入指应用程序依赖Spring为其提供运行时所需的资源 2.DI实例 A.在应用程序中声明要使用的资源 private String msg; B.为其提供setter访问器 public void setMsg(String msg) { this.msg = msg; } C. 在Bean配置中配置该资源对象具有某个属性,属性可以配置多个 注意:当配置中出现的属性在Bean类中不存在时,抛出异常

3.IoC与DI区别 同一件事,站在不同角度上看待问题的不同描述 IoC:Spring立场 DI:应用程序立场

BeanFactory【了解】 1.BeanFactory是ApplicationContext的顶层父接口,使用BeanFactory接口也可以完成获取Bean的操作 2.操作步骤: A.初始化Resource对象 Resource res = new ClassPathResource(\ B.初始化BeanFactory对象 BeanFactory bf = new XmlBeanFactory(res); C.根据id名称获取Bean UserService service = (UserService) bf.getBean(\ 3.AppplicationContext与BeanFactory的区别 A.加载方式不同 AppplicationContext:立即加载,加载配置文件时即加载 BeanFactory:延迟加载,获取Bean实例时才加载 B.AppplicationContext具有更多的功能 国际化处理 事件传递 Bean自动装配 各种不同应用层的Context实现 注意:实际开发中,优先选择ApplicationContext对象,避免使用BeanFactory

4..Schema风格离线约束配置方式 A.拷贝访问路径 B.打开MyEclipse设置中的XML catalog选项 C.创建新的映射 D.选择对应的schema风格的约束文件 E.将key type修改为schema location F.将要配置的路径复制到key中

Bean配置(XML)【理解】【应用】【重点】

1.Bean对象初始化方式有三种 构造器初始化:

Bean对应的类必须提供一个默认无参可访问的构造方法

静态工厂初始化【了解】 提供一个工厂类,使用其中的静态方法获取对象 实例工厂初始化【了解】

提供一个实例工厂类,使用其中的实例方法获取对象。由于该工厂类本身需要创建对象,因此该对象必须受Spring控制,所以必须配置该工厂类为Bean

2.Bean的作用域 Spring初始化的Bean默认为单例模式,如果想修改成非单例模式需要修改Bean的作用范围 scope属性: singleton:单例 prototype:非单例 request:请求对象范围request.setAttribute(\ session:会话Session范围request.getSession().setAttribute(\ globalSession:全局会话 分布式服务器

3.Bean的生命周期 定义Bean初始化与销毁时的动作,属于回调方法配置 定义bean时指定两个回调方法,控制bean的初始化与销毁操作时执行的动作 注意:如果类型匹配不成功,可以为配置中指定index索引属性,对应构造器中参数的位置 说明:构造器传参受构造器参数位置和类型的限定,因此不常使用 Setter注入【重点】 前提:setter注入要求Bean必须提供无参可访问构造方法 注入简单类型:String,基本数据类型封装类

A.提供对应要注入的属性

B.为每个要注入的属性提供对应的标准封装setter方法

C.在配置中为Bean指定要注入的属性,使用property元素 name=“属性名” value=”值”

A.为某个Bean注入引用类型的值,首先在Bean对应的类中声明对应的属性 private TeacherDAO dao; B.为每个要注入的属性提供对应的标准封装setter方法 (访问器) public void setDao(TeacherDAO dao) { this.dao = dao; } C.必须保障引入的对象是Spring控制的Bean

D.在Bean的属性注入中,使用ref引用对应的资源 ref=”beanId/beanName”

5.P命名空间的使用【了解】 Spring2.5提供了一种简化配置格式,P命名空间支持

A. xml头信息中引入对p命名空间的支持

xmlns:p=\

格式一:配置在通知类别后面

格式二:配置在某个切面中,在当前切面范围内共享 范例:

4.通知类别 通知共有五种类别

before:在原始操作前运行 after: 在原始操作后运行,无论方法是否抛出异常 afterReturning:在原始操作后运行,只有方法正常结束才运行,抛出异常则不运行 afterThrowing:在原始操作中如果抛出异常,运行 around: 在原始操作前后运行,通过ProceedingJoinPoint对象调用procee()方法完成对原始操作的调用 //环绕通知

public void around(ProceedingJoinPoint pjp) throws Throwable{ System.out.println(\ //调用原始方法 pjp.proceed();

System.out.println(\

} 通知的配置格式

如果原始方法返回值为非void类型,则around方法内必须将原始方法调用的结果返回 原始方法返回值为void类型的,通知内获取的返回值统一为null

public Object around(ProceedingJoinPoint pjp) throws Throwable{ Object res = pjp.proceed(args); return res; } B.afterReturning通知获取返回值 在通知方法的参数中,声明一个Object类型的参数,用于保存方法的返回值 public void afterReturning(JoinPoint jp,Object abc){ System.out.println(\ abc); } 在配置文件中,为afterReturning声明保存返回值的变量名

异常对象的获取方式与返回值很相似,声明变量,在配置中声明保存异常对象的变量名

AOP(注解)【理解】【应用】【重点】 1.AOP注解配置流程

A.开启AOP配置支持注解@aspectj 核心配置文件中添加以下配置,功能等同于注解配置Bean的自动扫描路径 B.将所有参与AOP配置的类声明为Spring控制的Bean 可以使用XML配置格式或注解格式 C.在切面类的类定义上方添加切面的声明 @Aspect

public class MyAdvice {…}

D.将切面类中的方法配置为指定类型的通知,配置时指定其切入点 @Before(\

public void before(JoinPoint jp) { System.out.println(\ }

2.配置公共的切入点 A.在切面类中声明一个方法(私有的),将该方法配置为切入点 @Pointcut(\ private void pt(){} B.使用配置的切入点 @Before(\引用切入点\ 格式:切面类名.方法名() 范例:@Before(\ pt ()\

3.注解开发通知的通知类别

前置通知 @Before(value=\后置通知 @After(value=\抛出异常通知 @AfterThrowing(value=\返回后通知 @AfterReturning(value=\环绕通知 @Around(value=\4.注解格式AOP顺序 总体顺序由上到下为下列描述顺序

around before before

around after after

afterReturning

实际开发以最终运行顺序为准

5.返回值与异常对象的获取方式

@AfterReturning(value=\aa\ public void afterReturning(JoinPoint jp,Object aa){ System.out.println(\ }

CGLIB【理解】【难点】

1.AOP内部工作原理是通过代理对象实现织入功能 对于有接口实现的对象使用JDK动态代理 对于无接口实现的对象使用Cglib动态代理 2.CGLIB(code generator library)代码生成库——第三方技术 作用:动态的生成字节码

CGLIB中的核心对象是Enhance对象,它的作用是创建一段动态的类字节码。 CGLIB可以对任意的类进行代理,JDK的代理只能对实现接口的类进行代理 public class MyCglibProxyObject implements MethodInterceptor {

//提供一个方法用于创建Animal类的代理对象 public Animal createCglibProxyObject(){ //1.在内存中创建一个动态的类的字节码 Enhancer enhancer = new Enhancer(); //此时并没有做继承 //2.为其指定父类 //除了完成继承关系外,还将父类所有的方法名反射过来,并在自己的类中创建了这些方法 enhancer.setSuperclass(Animal.class); //3.指定其回调操作 enhancer.setCallback(this); //4.使用该类创建对象 return (Animal) enhancer.create(); } public Object intercept(Object proxy, Method method, Object[] args,MethodProxy methodProxy) throws Throwable { if(method.getName().equals(\ System.out.println(\吃前来个开胃菜\ } return methodProxy.invokeSupper(proxy, args); } }

DAO模板类【了解】 1.Spring提供有DAO支持模板类,功能类似于Apache DBUtils JdbcTemplate HibernateTemplate SqlMapClientTemplate(过时) JpaTemplate (过时) 2.基础实例 A.导入jar包 核心包(4个) 日志(2个) jdbc模板支持(1个) spring-jdbc-3.2.0.RELEASE.jar 模板相关事务处理包(1个) spring-tx-3.2.0.RELEASE.jar 数据库连接驱动包 mysql-jdbc.jar B.JDBC模板类使用(编程式) //创建Spring对应的数据源对象 //数据源描述的是一系列的相关描述信息的封装对象 DriverManagerDataSource dataSource = new DriverManagerDataSource(); //为数据源对象提供数据库连接的相关数据(4个) dataSource.setDriverClassName(\ dataSource.setUrl(\ dataSource.setUsername(\ dataSource.setPassword(\ //创建JDBC模板类,需要使用数据源对象 JdbcTemplate template = new JdbcTemplate(dataSource); //执行添加语句 template.execute(\ template.execute(\ 3.使用Spring形式开发JDBCTemplate A.在DAO中声明JDBCTemplate变量 B.提供setter注入 C.将DAO声明为Bean,为其注入JDBCTemplate

D.声明JDBCTemplate的Bean,为其注入DataSource

E.声明DataSource的Bean,为其注入DataSource需要使用的数据库连接参数

4.数据源配置格式(3种) Spring内置的DataSource 使用DBCP,需要导入对应的jar包 com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar com.springsource.org.apache.commons.pool-1.5.3.jar 使用c3p0,需要导入对应的jar包 com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

5.用外部properties格式文件,输入参数 A.制作独立的属性文件jdbc.properties放置到src目录下,用于保存数据库连接的相关参数 driverClass=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/springdb jdbc_username=root password=root

B.加载属性文件到Spring配置中 方式一:不推荐使用

方式二:推荐使用

注意:方式二可以使用通配符格式classpath:*.properties格式,一次加载所有的配置文件,但是,该方式要加载所有的系统配置,因此属性文件中的属性名不要与系统属性冲突。userName特别注意

C.将固定的参数改为引用属性文件中的参数 格式:${属性名} ${userName} ${url} ${password} ${jdbc_user}

DAO支持抽象类【理解】【操作】 1.使用统一的DAO支持抽象类,可以简化开发过程,数据层实现类继承JdbcDaoSupport

public class UserDAO extends JdbcDaoSupport{…}

2.为该类注入DataSource

3.在DAO实现类中使用this.getJdbcTemplate()获取模板对象 4.JdbcTemplate API 增删改 update(sql,Object... args) 查询数据为单一结果数据 queryFor* 获取简单类型数据 Long queryForLong(sql,Object... args) Interget queryForInt(sql,Object... args) Double queryForDouble(sql,Object... args) queryForObject 获取引用类型数据(不是全部) Object queryForLong(sql,查询数据的类型class,Object... args) 查询数据为全部字段的单一数据 queryForObject Object queryForObject(sql,查询数据结果行映射接口对象,Object... args) 查询数据为全部字段的多条数据 query List query (sql,查询数据结果行映射接口对象,Object... args) 行映射接口制作 private class 自定义内部类类名 implements RowMapper<实体泛型>{ public User mapRow(ResultSet rs, int rownum) throws SQLException { User u = new User(); //实体 通过原始的jdbc查询结果集对象ResultSet获取查询的数据 u.setUuid(rs.getLong(\ u.setUserName(rs.getString(\ u.setAge(rs.getInt(\ return u; } }

标准DAO制作范例: public void add(UserModel um){ String sql = \ this.getJdbcTemplate().update(sql, um.getUserName(),um.getAge()); } public void delete(UserModel um){

String sql = \ this.getJdbcTemplate().update(sql, um.getUuid()); }

public void update(UserModel um){ String sql = \ this.getJdbcTemplate().update(sql, um.getUserName(),um.getAge(),um.getUuid()); }

//查询一共多少条数据 public Integer getCount(){ String sql = \ return this.getJdbcTemplate().queryForInt(sql); }

//按照uuid查名字

public String getNameByUuid(Long uuid){ String sql = \ return this.getJdbcTemplate().queryForObject(sql,String.class,uuid); }

//查询某个数据

public UserModel getByUuid(Long uuid){ String sql = \ RowMapper rm = new RowMapper() { public UserModel mapRow(ResultSet rs, int rowNum)throws SQLException { UserModel um = new UserModel(); um.setUuid(rs.getLong(\ um.setUserName(rs.getString(\ return um; } }; return this.getJdbcTemplate().queryForObject(sql, rm, uuid); }

//查询全部数据

public List getAll(){ String sql = \ RowMapper rm = new RowMapper() { public UserModel mapRow(ResultSet rs, int rowNum)throws SQLException { UserModel um = new UserModel(); um.setUuid(rs.getLong(\ um.setUserName(rs.getString(\ return um; } }; return this.getJdbcTemplate().query(sql, rm); }

本文来源:https://www.bwwdw.com/article/uf1r.html

Top