-Spring
[图片上传中。。。(1)]
导包:
4个必须的包,logging(这个包是阿帕奇下面的那个)
日志包C:\Users\Administrator\Desktop\day100\jar包\JAR包\spring3\spring-framework-3.0.2.RELEASE-dependencies\org.apache.log4j\com.springsource.org.apache.log4j\1.2.15
以上5个必须的包。
log4j主要是针对老的版本,建议也导入
src下面的总配置文件,取名建议这样applicationContext.xml
导入约束文件:
1,打开preference,搜索cata———>add---->file system找到解压包中的schema找里面的beans文件夹某一个。
2.key type选择Schema location,然后把location最后的文件名复制到key的最后。
3,将其导入到配置文件,在applicationContext中,写<beans><beans>,然后调整到design,右键beans-->Edit namespace-->add-->xsi-->确认,
再点add,选择Specify new Nnamespace,Browse,选择select xml catalog entry,找到刚才导入的schema,再把去掉文件的部分粘贴到上面一行
或者采用直接复制的方式:
1.必须的约束
spring-framework-3.2.0.RELEASE-dist/spring-framework-3.2.0.RELEASE/docs/spring-framework-reference/htmlsingle/index.html#spring-core 目录5. The IoC container 5.2.1的位置
set方法注入:
Spring容器在初始化的时候就已经创建对象了
<property name="name" value="张三"></property> 设置静态值的时候用value
<property name="name" ref="car"></property> 设置引用类型用ref
[图片上传中。。。(2)]
配置文件依赖注入格式:(记得set和get方法)
[图片上传中。。。(3)]
方式二:
采用自动注入
[图片上传中。。。(4)]
对象的注入方式:
[图片上传中。。。(5)]
实例化的方式:
1.配置文件注入,控制反转ioc
2.静态工厂
3.实例工厂
2
[图片上传中。。。(6)]
[图片上传中。。。(7)]
3
[图片上传中。。。(8)]
[图片上传中。。。(9)]
作用域:用于确定spring创建bean实例个数
singleton 单例,默认值。
prototype 多例,每执行一次getBean将获得一个实例。
可以通过scope属性对其进行单例或者多例的设置
junit的创建规则:
[图片上传中。。。(10)]
建立一个和src同级的资源文件夹,包名和你要测试类的包名一致,类名(建立junit类)名和要测试的类名一致后面加Test
采用注解的方式来进行:
1加入约束
2开启包扫描
注解的方式:
加上约束,开启包扫描:
[图片上传中。。。(11)]
注解实现bean的装配
添加约束文件,再开启包扫描
spring3/spring-framework-3.2.0.RELEASE-dist/spring-framework-3.2.0.RELEASE/docs/spring-framework-reference/html/xsd-config.html 2.8位置
开启包扫面 <context:component-scan base-package="com.qy"/>
@Autowired,Resource 自动装配依赖,默认是按照类型来装配
@Resource(name="userDao"),自动按照名字来装配
@Scope("prototype")
@Repository:dao层
@Service:service层
@Controller:web层
代理模式:
[图片上传中。。。(12)]
条件:目标对象和代理对象要实现同一个接口,在目标对象和增强类的方法完成后,在代理对象的构造方法中传入增强和目标对象这两个参数,在代理对象的重写方法中目标对象和增强各自调用自己的方法,然后直接new代理类调用重写接口的方法。
[图片上传中。。。(13)]
[图片上传中。。。(14)]
(已过时)
[图片上传中。。。(15)]
Spring的aop:
连接点(Joinpoint):目标对象中所有可以增强的方法
切点(Pointcut):目标对象已经增强的方法
增强/通知(Advice):增强的代码
目标对象(Target):被代理的对象
织入(Weaving):将增强应用到连接点的过程
代理(Proxy):将通知织入到目标对象之后,形成的代理对象
切面(aspect):切点+增强
2.采用jdk动态代理实现:(缺点:必须要有接口)
必须先创建一个接口,再创建一个实现类
[图片上传中。。。(16)]
创建一个类实现InvocationHandler,然后写构造方法,重写invoke方法(注意全是反射下面的包)
[图片上传中。。。(17)]
用Proxy调用相应的方法,获得返回对象
[图片上传中。。。(18)]
如果需要多层增强,那么下一次把代理类直接看成目标对象
3.采用CGlib来实现动态代理
CGlib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截技术拦截所有父类方法的调用,并织入横切逻辑
需要先导入包:\spring-framework-3.0.2.RELEASE-dependencies\net.sourceforge.cglib\com.springsource.net.sf.cglib\2.1.3
[图片上传中。。。(19)]
[图片上传中。。。(20)]
创建增强:
Spring使用增强类定义横切逻辑,同时由于Spring只支持方法连接点,增强还包括了在方法的哪一点加入横切代码的方位信息,所以增强既包含横切逻辑,还包含部分连接点的信息
AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强
前置增强:org.springframework.aop.BeforeAdvice代表前置增强,因为Spring只支持方法级的增强,所以MethodBeforeAdvice是目前可用的前置增强,表示在目标方法执行前实施增强,而BeforeAdvice是为了将来版本扩展需要而定
后置增强:org.springframework.aop.AfterReturningAdvice代表后增强,表示在目标方法执行后实施增强;
环绕增强:org.aopalliance.intercept.MethodInterceptor代表环绕增强,表示在目标方法执行前后实施增强;
异常抛出增强:org.springframework.aop.ThrowsAdvice代表抛出异常增强,表示在目标方法抛出异常后实施增强;
先导入aop联盟的包:spring-framework-3.0.2.RELEASE-dependencies\org.aopalliance
导入aop的包:spring-framework-3.2.0.RELEASE-dist\spring-framework-3.2.0.RELEASE\libs
创建的每个增强类实现上面的接口就行了,抛出异常增强得注意一下,那是一个空接口,方法的写法是固定的
[图片上传中。。。(21)]
使用方式:
[图片上传中。。。(22)]
创建切面(注解实现):
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
导入两个包spring-framework-3.0.2.RELEASE-dependencies\org.aspectj
waver.jar和tools.jar
[图片上传中。。。(23)]
注意在环绕增强的时候需要传入参数,而且注意写法,还有就是匹配的方式有很多种,学会利用*和.
[图片上传中。。。(24)]
采用配置文件的方式来进行创建:
需要先添加约束文件:2.7
[图片上传中。。。(25)]
[图片上传中。。。(26)]
Spring对dao层的封装
spring-jdbc 主要封装了spring以JDBC方式对数据库访问的各种操作类
spring-tx 主要就是封装了spring对于事物的控制
spring-framework-3.2.0.RELEASE-dist\spring-framework-3.2.0.RELEASE\libs\spring-tx-3.2.0.RELEASE.jar
dependencies\org.apache.commons\com.springsource.org.apache.commons.dbcp\1.2.2.osgi\com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
spring-framework-3.2.0.RELEASE-dist\spring-framework-3.2.0.RELEASE\libs\spring-jdbc-3.2.0.RELEASE.jar
spring-framework-3.0.2.RELEASE-dependencies\org.apache.commons\com.springsource.org.apache.commons.pool
[图片上传中。。。(27)]
[图片上传中。。。(28)]
[图片上传中。。。(29)]
接口回调:
[图片上传中。。。(30)]
[图片上传中。。。(31)]
[图片上传中。。。(32)]
dataSource包含了连接数据库的一些参数,那么jdbcTemplate含有dataSource的引用,是对dataSource进行了封装
[图片上传中。。。(33)]
在经过依赖注入后可直接用jdbcTemplate操作数据库
[图片上传中。。。(34)]
dao继承JdbcDaoSupport
[图片上传中。。。(35)]
jdbcDaoSupport对jdbcTemplate和dataSource都进行了封装,往里面注入
一个即可,一定要使用dataSource
查询:List<User> list = this.getJdbcTemplate().query("select * from user", ParameterizedBeanPropertyRowMapper.newInstance(User.class));
通过读取配置文件的方式来获得数据库的连接信息
[图片上传中。。。(36)]
Spring管理事务
事务的特性:
1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。
事务的隔离级别:
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:
[图片上传中。。。(37)]
http://www.cnblogs.com/melody210218/p/7120559.html
Spring的事务管理:
spring-tx-3.2.0.RELEASE.jar
spring-jdbc-3.2.0.RELEASE.jar
spring-orm-3.2.0.RELEASE.jar
配置:
1,为service注入事务管理模板对象
2,为事务模板对象注入事务管理器
3,为事务管理器注入数据源
[图片上传中。。。(38)]
service固定写法:
[图片上传中。。。(39)]
半自动化的方式
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
必须要有接口,加载的是代理类
需要导入相关的包,aop和aop联盟的包
[图片上传中。。。(40)]
在spring xml 配置aop 自动生成代理,进行事务的管理
1.配置管理器
2.配置事务策略
3.配置aop
[图片上传中。。。(41)]
AOP全自动的方式-注解
配置事务管理器,将并事务管理器交予spring
在目标类或目标方法添加注解即可 @Transactional
[图片上传中。。。(42)]
[图片上传中。。。(43)]
[图片上传中。。。(44)]
Spring整合hibernate
[图片上传中。。。(45)]
整合Struts2,导入相关的包,然后配置一个监听器
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
[图片上传中。。。(46)]
第二种配置方式:
取消了hibernate的配置文件,交由spring来管理,并且action也由spring来注入,但是在配置action的时候要注意,要配置成多例,struts配置文件里面直接写spring配置文件里面的id进行注入。
[图片上传中。。。(47)]
[图片上传中。。。(48)]