spring2.5 学习笔记
更新时间:2024-01-22 18:31:01 阅读量: 教育文库 文档下载
Spring –SSH整合 学习笔记 ---wjt276
[2010-05-14]
spring2.5 学习笔记 第2页 共46页
目录
第一课:面向抽象编程 ....................................................................................... 4 第二课:Jdom的基本使用 ..................................................................................... 5 第三课:模拟Spring功能 .................................................................................... 5 第四课:搭建sping的运行环境 ............................................................................... 8
一、 二、 三、 四、 五、 一、 二、 三、
建立一个新的项目 ............................................................................. 8 建立spring的配置文件 ......................................................................... 8 引入spring的jar包........................................................................... 8 测试代码: ................................................................................... 8 注意接口的使用: ............................................................................. 9 什么是IOC、DI ................................................................................ 9 编辑xml文件时,没有提示 ...................................................................... 9 注入类型(Injecting dependencies) .............................................................. 9
setter注入类型Setter Injection ......................................................... 10 构造方法Constructor Injection ........................................................... 10
第五课:IOC(DI)配置及应用 .................................................................................. 9
(一) (二) 四、 五、 六、 七、 八、
id、name .................................................................................... 11 简单属性的注入 .............................................................................. 12 Bean的作用范围scope ......................................................................... 12 集合注入 .................................................................................... 13 自动装配autowire ............................................................................ 13
byName .................................................................................. 14 byType .................................................................................. 15 注意 .................................................................................... 15 lazy-init/default-lazy-init ............................................................. 15 init-method destroy-method 不要和prototype一起用(了解) ............................... 15
(一) (二) (三) 九、
(一) (二) 一、 二、
生命周期 .................................................................................... 15
第六课:annotation方式Spring ............................................................................. 16
开始使用annotation配置Spring ............................................................... 16 @Autowired、@Qualifier ....................................................................... 17
@Autowired .............................................................................. 17 @Qualifier .............................................................................. 17 JSR-250 ................................................................................. 18 @Resource ............................................................................... 18
(一) (二) 三、
(一) (二) 四、 五、 六、 一、 二、 一、
@Resource(重要、推荐) ........................................................................ 18
@Componet ................................................................................... 18 @Scope、@PostConstruct、@PreDestroy .......................................................... 19 注解对应的jar包 ............................................................................ 20 AOP概念 ..................................................................................... 20 利用动态代理实现面向切面编程 ................................................................. 20 AOP配置annotation方式 ...................................................................... 22
搭建annotation开发环境 ................................................................. 22 aspectJ类库 ............................................................................ 22 AOP的annotation实例 ................................................................... 22
第七课:AOP(面向切面编程) ................................................................................. 20
第八课:Spring AOP配置选项 ................................................................................ 22
(一) (二) (三)
(四) (五) (六) (七) (八) 二、 三、 一、 二、 三、 一、
spring2.5 学习笔记 第3页 共46页
AspectJ的专业术语 ...................................................................... 23 织入点语法 .............................................................................. 24 Advice .................................................................................. 25 Pointcut ................................................................................ 26 annotatin方式的AOP实例 ................................................................ 26
AOP配置xml方式 ............................................................................. 27 AOP实现动态代理注意 ......................................................................... 28 Sping配置数据源: ........................................................................... 28 注入使用 .................................................................................... 29 dbcp.BasicDataSource ......................................................................... 30 Spring配置hibernate3的SessionFactory ....................................................... 30
xml形式的SessionFactory ................................................................ 30 annotation注解方式的SessionFactory ..................................................... 31 基本jar ................................................................................ 31 加入annotation功能的jar包 ............................................................. 31 搭建日志环境并配置显示DDL语句jar包 .................................................... 31 Annotation注解方式配置事务管理 .......................................................... 32 Spring事务选项 ......................................................................... 36 XML文件形式配置Spring事务管理 .......................................................... 37 HibernateTemplate ....................................................................... 38 HibernateDaoSupport ..................................................................... 39
第九课:DataSource ........................................................................................ 28
第十课 Spring整合Hiberante3 .............................................................................. 30
(一) (二) 二、
(一) (二) (三) 三、
(一) (二) (三) 四、
(一) (二) 一、 二、 三、 四、 一、 二、 一、 二、 三、 一、 二、 三、
引入hibernate所需要使用的jar ............................................................... 31
Spring整合hibernate3事务 ................................................................... 32
HibernateTemplate ........................................................................... 38
第十一课:Spring整合-SSH .................................................................................. 41
第一步:加入jar包(需要的jar包列表) ......................................................... 41 第二步: 首先整合Spring + Hibernate ......................................................... 42 第三步:再来整合Struts2 ..................................................................... 42 struts的读常量: ............................................................................ 43 DTO ......................................................................................... 43 VO .......................................................................................... 43 Jsp中访问Session时,Session已经关闭 ........................................................ 44 如果不配置事务,openSessionView出现异常 ..................................................... 44 中文乱码问题: .............................................................................. 45 Struts2 ..................................................................................... 46 Hibernate3.3.2 .............................................................................. 46 Spring ...................................................................................... 46
第十二课:DTO、VO ......................................................................................... 43
第十二课:SSH整合存在的问题 ............................................................................... 44
第十三课:SSH整合的jar包 ................................................................................. 46
spring2.5 学习笔记 第4页 共46页
第一课:面向抽象编程
原来什么类都是写死的,现在是先建立一个大的标准,然后再各个实体类来实现他们的功能,然后在调用的时候,使用这个标准调用,这样,你们那个来都可以被调用。
实例:
User实体类 public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) {this.username = username;} public String getPassword() {return password; } public void setPassword(String password) { }} UserDao接口 this.password = password; public interface UserDao { }
UserDao的实现UserDaoImpl public void save(User u); public class UserDaoImpl implements UserDao { User管理类 public class UserService { //这里需要什么的实现,在new时,就new什么的实现,在调用方法时,会调用具体的实现类的方法 private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } } public void add(User u){ userDao.save(u); }//这里可以调用任务实现了UserDao接口的save方法了。 @Override public void save(User u) { }} System.out.println(\); spring2.5 学习笔记 第5页 共46页
第二课:Jdom的基本使用
test.xml 因为Spring是使用xml配置文件来实现的,所以我们首先模拟一个xml的配置文件如下: beans.xml spring2.5 学习笔记 第6页 共46页 实现的功能:当类初始化时, 一、 程序会根据此配置文件初始化文件所有的bean元素所代表的类,放入一个容器中(使用Map),然后在需要时,会根据ID值,取出这个对象; 1、 代码: public class ClassPathXmlApplicationContext implements BeanFactory { private Map spring2.5 学习笔记 第7页 共46页 Element root=doc.getRootElement(); //获取根元素 List list=root.getChildren(\);//取名字为disk的所有元素 for(int i=0;i BeanFactory接口代码: spring2.5 学习笔记 第8页 共46页 public interface BeanFactory { } public Object getBean(String name); 第四课:搭建sping的运行环境 一、 建立一个新的项目 a) b) 建立新的项目; 建立需要的bean类 二、 建立spring的配置文件 你可以在spring文件中复制代码 可以建立一个User Library 搭建spring环境基本的包:spring.jar和commons-logging.jar 四、 测试代码: public void testAdd_3() throws Exception { } BeanFactory factory = new ClassPathXmlApplicationContext(\); UserService service = (UserService)factory.getBean(\); User u = new User(); service.add(u); 注意:这里使用的ClassPathXmlApplicationContext和BeanFactory是spring的,如下: import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; spring2.5 学习笔记 第9页 共46页 五、 注意接口的使用: ClassPathXmlApplicationContext类实现了ApplicationContext接口,而ApplicationContext接口又实现了BeanFactory接口,这样BeanFactory是根上的接口。一般建议使用ApplicationContext接口,因为: 1、BeanFactory:只是完成Bean工厂的基本功能,不能完成bean的生命周期 2、ApplicationContext:除了完成bean工厂的基本功能外,还完成的其它的附加功能(比如:bean的生命周期),也就是功能更强大 这样上面的代码就是 } ApplicationContext factory = new ClassPathXmlApplicationContext(\); UserService service = (UserService)factory.getBean(\); User u = new User(); service.add(u); public void testAdd_3() throws Exception { 第五课:IOC(DI)配置及应用 一、 什么是IOC、DI IOC: Inversion of Control控制反转:原来类的一些成员属性(例如UserService中的userDao成员属性)是由当前类(UserService)自己控制,现在不是由当前类(UserService)自己控制,而是由容器(运行环境上下文、Spring)帮我们来控制。 还是一种说法:原来我们自己控制是控制实现,而现在Spring是利用接口来控制的。所以我们由原来控制实现转为springg现在来控制接口(向上反转) 作用:实例化具体的bean 动态装配bean (本来是由我来控制的,现在我交给容器来控制。) DI:Dependency Injection依赖注入:一些成员属性(例如UserService中的userDao成员属性) 依赖Spring容器来注入 好处:偶合性相对来降低了;另外,注入是使用配置文件来实现,这样修改来非常的方便. DI与IOC相对来说 是一样的概念。 二、 编辑xml文件时,没有提示 1、 window – preferences – myeclipse – Files and Editing - xml – xml catalog 2、 add按钮 i. ii. iii. iv. Location: D:\\share\\0900_Spring\\soft\\spring-framework-2.5.6\\dist\\resources\\spring-beans-2.5.xsd URI: Key: file:///D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd Key Type: Schema Location http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 三、 注入类型(Injecting dependencies) 1、 setter(重要) 2、 构造方法(使用的非常少) 3、 接口注入(可以忘记) (一) setter注入类型Setter Injection } spring配置文件如下: spring2.5 学习笔记 第10页 共46页 就是在bean中使用setXXX方法进行注入来 在bean类中,成员属性需要setXXX方法如下: private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() { } public void setUserDao(UserDao userDao) { } public void add(User u){ userDao.save(u);} this.userDao = userDao; return userDao; public class UserService { 注xml配置文件中 五、 简单属性的注入 当bean中存在简单属性时的注入方式: bean代码如下: public class UserDaoImpl implements UserDao { private int daoId; private String daoStatus; public int getDaoId() { return daoId; } public void setDaoId(int daoId) { this.daoId = daoId; } public String getDaoStatus() { return daoStatus; } public void setDaoStatus(String daoStatus) { this.daoStatus = daoStatus; } @Override public void save(User u) { System.out.println(\); } } xml配置文件如下: 在Spring配置文件中的 注意:只有spring与web框架结合时才会使用request/session/globalsession,但也非常少用,因为其它框架已经有功能非常强大的scope了(例如:struts的scope) 七、 集合注入 很少用,不重要,参考程序 含义:在bean注入时不需要我们来指定注入哪个具体的bean,而spring容器会根据我的使用autowire属性来确定自动装配功能。 autowire值: 1、 autodetect; spring2.5 学习笔记 第14页 共46页 2、 byName:根据bean中成员属性的名称来自动装配 3、 byType:根据bean中成员属性的类型来自动装配。 4、 constaractor 5、 default:会根据 (一) byName 根据bean中成员属性的名称来自动装配。 bean代码: UserDaoImpl类 public class UserDaoImpl implements UserDao { UserService类 public class UserService { spring的配置文件 结果:daoId=1 说明:因为在配置文件中配置了两个UserDaoImpl(名称分别:userDao、userDao2)和一个UserService类。而在userService的bean中并没有进行注入配置。而是使用了autowire属性指定了byName值,这样结果是正确的,是因为spring看到autowire=byName后,会在配置文件中查找bean的id与userService成员属性名称一至,然后将其注入,这样就完成了根据名称自动装配功能。 (二) byType 根据类型自动装配:就是spring在初始化时,会在配置文件中查找 (三) 注意 1、 自动装配使用并不多; 2、 只有在使用anntation注解时会使用的。 3、 byType如果出现相同类型在两个以上,就会出现异常。 九、 生命周期 (一) lazy-init/default-lazy-init (不重要) bean的何时初始化 lazy-init值:default:表示使用 spring2.5 学习笔记 第16页 共46页 destroy-method=\> 一、 开始使用annotation配置Spring 首先需要在spring的xml配置文件中加入下列红色加粗部分的代码。 1、AutowiredAnnotationBeanPostProcessor, 2、CommonAnnotationBeanPostProcessor, 3、PersistenceAnnotationBeanPostProcessor, 4、RequiredAnnotationBeanPostProcessor spring2.5 学习笔记 第17页 共46页 二、 @Autowired、@Qualifier 还是需要在xml文件中配置bean (一) @Autowired 位置:可以放在成员属性前面,也可以放在getter或setter方法前面,但是建议放在setter方法前面 作用:表示该对应的成员属性可以完成自动配置功能(默认是根据byType的) 例如: xmp配置文件: 前缀部分见上面代码,以此略。。。 三、 @Resource(重要、推荐) 还是需要在xml文件中配置bean (一) JSR-250 JCP:Java Community Process是由多个厂家出人来构成的J2EE组织,主要是用于定Java的一些新的标准 而每一个标签都可以称之为一个JSR 而每一个新的JSR都会加一个数字是区别什么JSR,可以到官方网看看具体JSR定了哪些新的标准。 (二) @Resource 代码: import javax.annotation.Resource; public class UserService { } 说明:在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao) 注意这个@Resource是J2EE的(import javax.annotation.Resource) @Resource默认是根据byName来的,如果没有找到相同的名称再根据byType,当然也可以指定bean的name如下: @Resource(name=\) public void setUserDao(UserDao userDao) { } 注意:一般使用@Resource而不会使用@Autowired 不足:如果没有源码,就无法使用annotation,只能使用xml this.userDao = userDao; private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() { } return userDao; //在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao) //注意这个@Resource是J2EE的(import javax.annotation.Resource) @Resource public void setUserDao(UserDao userDao) { } public void add(User u){userDao.save(u);} this.userDao = userDao; 四、 @Componet 以上使用@Autowired、@Resource注解时,还是需要在xml文件配置bean,这样就达不到完全使用annotation进行注解。因此现在引用@Component在那个bean前进行注解,表示那个类是需要的bean 有了@Componet注解,这样就不需要在xml文件中配置bean了。 注意:@Componet是Spring的注解(org.springframework.stereotype.Component;) 例如: 前缀部分见上面代码,以此略。。。 代码: spring2.5 学习笔记 第19页 共46页 import javax.annotation.Resource; import org.springframework.stereotype.Component; // @Componet注解默认bean的名称是类名首字母小写 // 也可以利用value属性指定bean的名称 @Component(value=\) public class UserService { private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() {return userDao;} //在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao) //注意这个@Resource是J2EE的(import javax.annotation.Resource) @Resource public void setUserDao(UserDao userDao) {this.userDao = userDao;} public void add(User u){userDao.save(u);}} 注意:@Componet注解,默认bean的名称是类的首字母小写,当然也可以利用value属性指定bean名称(在annotation中属性为value可以不写,直接写值) 说明:当Spring在加载配置文件时,发现有 @Scope对应于xml配置文件的scope属性 @PostConstruct对应于xml配置文件中的init-method属性 @PreDestroy对于应于xml配置文件中的destroy-method属性 例如如下: import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resource; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component(value=\) @Scope(\) public class UserService { @PostConstruct public void init(){System.out.println(\现在开始初始化UserService\);} private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() {return userDao;} @Resource public void setUserDao(UserDao userDao) {this.userDao = userDao;} public void add(User u){ userDao.save(u);} @PreDestroy public void destroy(){System.out.println(\); } spring2.5 学习笔记 第20页 共46页 六、 注解对应的jar包 1、@Autowired 2、@Qualifier 3、@Componet 4、@Resource 5、@Scope 6、@PostConstruct 7、@PreDestroy org.springframework.beans.factory.annotation.Autowired; org.springframework.beans.factory.annotation.Qualifier; org.springframework.stereotype.Component; javax.annotation.Resource; org.springframework.context.annotation.Scope; javax.annotation.PreDestroy; javax.annotation.PreDestroy; 第七课:AOP(面向切面编程) 一、 AOP概念 AOP:Aspect Oriented Programming(面向切面编程) 是对面向对象的思维方式的有国补充 二、 利用动态代理实现面向切面编程 场景:需要在执行方法之前加入一些日志。。。 可以使用以下三种方法 1、 继承 2、 组合 3、 动态代理(我们的实例) UserDao接口 public interface UserDao { } UserDaoImpl(UserDao接口的现实) public class UserDaoImpl implements UserDao { } UserService(业务层) public class UserService { } User(实体对象) private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() {return userDao;} public void setUserDao(UserDao userDao) {this.userDao = userDao;} public void add(User u){ userDao.save(u);} public void delete(User u){ userDao.delete(u);} @Override public void save(User u) {System.out.println(\);} @Override public void delete(User u) {System.out.println(\);} public void save(User u); public void delete(User u); public class User { } Spring的配置文件 private String username; private String password; public String getUsername() {return username; } public void setUsername(String username) {this.username = username;} public String getPassword() {return password; } public void setPassword(String password) {this.password = password;} spring2.5 学习笔记 第31页 共46页 (二) annotation注解方式的SessionFactory 再是在配置数据源时可以使用占位符(${})获取一些值 bean(org.springframework.beans.factory.config.PropertyPlaceholderConfigurer) spring2.5 学习笔记 第33页 共46页 1、 首先:如果想使用Spring管理事务,则首需要在配置文件中加入下列(上面红色加粗部分): xmlns:tx=\ xsi:schemaLocation=”http://www.springframework.org/schema/tx org.springframework.jdbc.datasource.DataSourceTransactionManager,,并且需要注入一个SessionFactory的bean,利用这个bean可以获取数据源配置等其它的数据库信息。但要求已经在这之前配置了一个SessionFactory的bean了。 上面的刚则配置的txManager), …… } spring2.5 学习笔记 第34页 共46页 这样,Spring就会对这个方法进行事务管理了。 5、 实例: 场景:当保存一个用户后,需要向数据库添加一条日志记录,说明已经添加一个用户了。需要使用Spring管理其事务,如果两者有一者发生异常,执都需要进行回滚。 1) 2) Spring的配置文件同上; 代码 Log实体类 @Entity @Table(name=\) public class Log { } User实体类 @Entity public class User { } UserDao接口的实现 @Component(\) public class UserDaoImpl implements UserDao { LogDao接口的实现 @Component(\) private SessionFactory sessionFactory; public SessionFactory getSessionFactory() {return sessionFactory;} //这里的sessionFactory是使用AOP进行自动装配,切记这是AOP的功能 @Resource(name=\) public void setSessionFactory(SessionFactory sessionFactory) { } //在这里并没有事务的管理,常规这里应该有处理事务的代码,但是现在没有了,因为现在由Spring来管理了。 //我们关心只是业务逻辑了。 @Override public void save(User u) { }} Session session = null; this.sessionFactory = sessionFactory; private int id; private String name; ?? private int id; private String msg; ?? //记住一定需要使用getCurrentSession()来从上下文中获取Session这样Spring才可以管理事务。 session = sessionFactory.getCurrentSession();// session.save(u); System.out.println(\); spring2.5 学习笔记 第35页 共46页 public class LogDaoImpl implements LogDao { private SessionFactory sessionFactory; public SessionFactory getSessionFactory() {return sessionFactory;} //这里的sessionFactory是使用AOP进行自动装配,切记这是AOP的功能,注入的bean的Id是sessionFactory @Resource(name=\) public void setSessionFactory(SessionFactory sessionFactory) { } this.sessionFactory = sessionFactory; //在这里并没有事务的管理,常规这里应该有处理事务的代码,但是现在没有了,因为现在由Spring来管理了。 业务层代码 @Component(value=\) public class UserService { } 这样,只有这个方法中的所有代码没有异常,才会执行完,否则所有的事务将全部回滚 测试代码: public void testAdd_4() throws Exception { ApplicationContext factory = new ClassPathXmlApplicationContext(\); UserService service = (UserService)factory.getBean(\); //只需要在需要进行事务管理的方法上加上 @Transactional public void add(User u){ } userDao.save(u); Log log = new Log(); log.setMsg(u.getName() + \保存成功!\); logDao.save(log); @Transactional 就可以了,Spring就会对其进行事务管理 private LogDao logDao; public LogDao getLogDao() { return logDao;} @Resource(name=\) public void setLogDao(LogDao logDao) { this.logDao = logDao;} public UserDao getUserDao() { return userDao; } //注意这个@Resource是J2EE的(import javax.annotation.Resource) @Resource(name=\) public void setUserDao(UserDao userDao) { this.userDao = userDao; } private UserDao userDao = new UserDaoImpl(); //我们关心只是业务逻辑了。 @Override public void save(Log log) { }} Session session = null; //记住一定需要使用getCurrentSession()来从上下文中获取Session这样Spring才可以管理事务。 session = sessionFactory.getCurrentSession(); session.save(log); System.out.println(\); //利用Spring自动注入功能,将其注入 } } spring2.5 学习笔记 第36页 共46页 User u = new User(); u.setName(\ + System.currentTimeMillis()); service.add(u); Annotation说明: (二) Spring事务选项 默认的 @Transactional 设置如下: ? ? ? ? ? 事务传播设置是 PROPAGATION_REQUIRED 使用现有事物,没有则启动新事物 事务隔离级别是 ISOLATION_DEFAULT 事务是 读/写 false 事务超时默认是依赖于事务系统的,或者事务超时没有被支持。 任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚 首先需要在配置文件中,配置事务管理器→告诉Spring需要进行事务管理并指定某个事务管理器→在需要进行事务管理的方法上加上@Transactional就可以了。 @Transactional 注解的属性 属性 传播性propagation 隔离性isolation 只读性readOnly 超时timeout 类型 枚举型:Propagation 枚举型:Isolation 布尔型 int型(以秒为单位) 一组 Class 类的实例,必须是Throwable 的子类 一组 Class 类的名字,必须是Throwable的子类 可选的传播性设置 可选的隔离性级别(默认值:ISOLATION_DEFAULT) 读写型事务 vs. 只读型事务 事务超时 一组异常类,遇到时 必须 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException的子类)才进行事务回滚。 一组异常类名,遇到时 必须 进行回滚 描述 回滚异常类(rollbackFor) 回滚异常类名(rollbackForClassname) 一组 Class 类的实例,必不回滚异常类(noRollbackFor) 一组异常类,遇到时 必须不 回滚。 须是Throwable 的子类 不回滚异常类名一组 Class 类的名字,必一组异常类,遇到时 必须不 回滚 (noRollbackForClassname) 须是Throwable 的子类 1、 Propagation key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用: PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。 2、 Isolation Level(事务隔离等级): 1、Serializable:最严格的级别,事务串行执行,资源消耗最大; spring2.5 学习笔记 第37页 共46页 2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。 3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。 4、Read Uncommitted:保证了读取过程中不会读取到非法数据。 隔离级别在于处理多事务的并发问题。我们知道并行可以提高数据库的吞吐量和效率,但是并不是所有的并发事务都可以并发运行,这需要查看数据库教材的可串行化条件判断了。 我们首先说并发中可能发生的3中不讨人喜欢的事情 1: Dirty reads--读脏数据。也就是说,比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的。 2: non-repeatable reads--数据不可重复读。比如事务A中两处读取数据-total-的值。在第一读的时候,total是100,然后事务B就把total的数据改成200,事务A再读一次,结果就发现,total竟然就变成200了,造成事务A数据混乱。 3: phantom reads--幻象读数据,这个和non-repeatable reads相似,也是同一个事务中多次读不一致的问题。但是non-repeatable reads的不一致是因为他所要取的数据集被改变了(比如total的数据),但是phantom reads所要读的数据的不一致却不是他所要读的数据集改变,而是他的条件数据集改变。比如Select account.id where account.name=\第一次读去了6个符合条件的id,第二次读取的时候,由于事务b把一个帐号的名字由\改成\,结果取出来了7个数据。 Dirty reads non-repeatable reads phantom reads Serializable 不会 不会 不会 REPEATABLE READ 不会 不会 会 READ COMMITTED 不会 会 会 Read Uncommitted 会 会 会 3、 readOnly 事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务。这是一个最优化提示。在一些情况下,一些事务策略能够起到显著的最优化效果,例如在使用Object/Relational映射工具(如:Hibernate或TopLink)时避免dirty checking(试图“刷新”)。 4、 Timeout 在事务属性中还有定义“timeout”值的选项,指定事务超时为几秒。在JTA中,这将被简单地传递到J2EE服务器的事务协调程序,并据此得到相应的解释。 (三) XML文件形式配置Spring事务管理 注意:理论同annotation是一样,只是一个是使用annotation的注解方式,而另一个是使用xml配置文件形式,大多数使用xml配置文件方式的。方便 理解了annotation的事务管理,xml事务管理也就方便了,只是个配置问题, 步骤如下: spring2.5 学习笔记 第38页 共46页 com.wjt276.service..*.*(..))\/> 当然了,配置文件中需要引入命名空间了: xmlns:tx=\ xsi:schemaLocation=”http://www.springframework.org/schema/tx a、首先需要定义切入点pointcut:说明哪些地方需要进行事务管理 b、再使用advisor说明在什么的pointcut下,使用什么的事务管理。就可以了。 http://www.springframework.org/schema/tx/spring-tx-2.5.xsd\> 四、 HibernateTemplate 当我们在多处使用相同的代码时,我们是否考虑对这些代码进行封装呢?这是当前的了。 这就需要使用一种设计模式:Template Method(模板模式) 我们来见一个hibernate中最常的事务代码,如下: public void save(User u) { } 注意到没有,这个代码中,如果在有更新session.update()/删除session.delete(),上面的事务管理都需要重写一次代码。重复的代码是非常的多。这时我们就需要对代码进行封装,也可以说使用模板,把重复的地方放入模板上,在需要使用时,只需要传入不同的地方就可以了。在hibernate中就有这样的模板那就是HibernateTemplate (一) HibernateTemplate org.springframework.orm.hibernate3.HibernateTemplate; HibernateTemplate是Hiberante的模板,因为一定需要SessionFactory等与数据库相关的信息了。 因为当前的HibernateTemplate没有setSessionFactory方法,因此其父类具有setSessionFactory方法,并且HibernateTemplate封装了Session的save、update等方法。使用如下: Session session = null; try { } session = sessionFactory.openSession(); session.beginTransaction(); session.save(u); //session.update(u); session.getTransaction().commit(); session.getTransaction().rollback(); e.printStackTrace(); session.close(); } catch (HibernateException e) { } finally { spring2.5 学习笔记 第39页 共46页 import org.springframework.orm.hibernate3.HibernateTemplate; @Component(\) public class UserDaoImpl implements UserDao { 因为HibernateTemplate需要交给Spring来管理,因为也需要配置bean,及注入sessionFactory package com.wjt276.dao.impl; import javax.annotation.Resource; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.stereotype.Component; @Component public class SuperDao extends HibernateDaoSupport { } 其它的dao继承这个就可以了 LogDaoImpl @Component public class LogDaoImpl extends SuperDao implements LogDao { } UserDaoImpl @Component(\) public class UserDaoImpl extends SuperDao implements UserDao { @Override public void save(User u) { }} this.getHibernateTemplate().save(u); //这里可以直接save了,session已经被hibernateTemplate处理了。我们不需要关心它了。 //因为HibernateTemplate中已经注入了SessionFactory了,因为它自己会处理好session及其事务的。 System.out.println(\); @Override public void save(Log log) { } this.getHibernateTemplate().save(log); //this.save(log); @Resource(name=\) public void setSuperHibernateTemplate(HibernateTemplate hibernateTemplate ){ } //在这里为父类HibernateDaoSuppport注入hibernateTemplate或是sessionFactory super.setHibernateTemplate(hibernateTemplate); System.out.println(\); spring2.5 学习笔记 第41页 共46页 第十一课:Spring整合-SSH Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2 一、 第一步:加入jar包(需要的jar包列表) jar包名称 antlr-2.7.6.jar aspectjrt aspectjweaver cglib-nodep-2.1_3.jar common-annotations.jar commons-collections-3.1.jar commons-fileupload-1.2.1.jar commons-io-1.3.2 commons-logging-1.1.1 dom4j-1.6.1.jar ejb3-persistence freemarker-2.3.13 hibernate3.jar hibernate-annotations hibernate-common-annotations javassist-3.9.0.GA.jar jta-1.1.jar junit4.5 mysql- ognl-2.6.11.jar slf4j-api-1.5.8.jar slf4j-nop-1.5.8.jar spring.jar struts2-core-2.1.6.jar xwork-2.1.2.jar commons-dbcp commons-pool.jar struts2-spring-plugin-2.1.6.jar 建议: 将这些所有的jar包保存到一个位置,使用的时候直接copy 所在位置 hibernate/lib/required spring/lib/aspectj .. spring/lib/cglib spring/lib/j2ee hibernate/lib/required struts/lib struts/lib 单独下载,删除1.0.4(struts/lib) hibernate/required hibernate-annotation/lib struts/lib hibernate hibernate-annotation/ hibernate-annotation/lib hiberante/lib/required .. struts/lib hibernate/lib/required hibernate/lib/required spring/dist struts/lib struts/lib spring/lib/jarkata-commons .. struts/lib 说明 解析HQL AOP AOP 代理,二进制增强 @Resource 集合框架 struts struts struts spring 解析xml @Entity struts hibernate hibernate transaction hibernate-log struts2 spring2.5 学习笔记 第42页 共46页 二、 第二步: 首先整合Spring + Hibernate 具体的方法,请见第十课 三、 第三步:再来整合Struts2 因为SSH时,是Struts2为主导,Struts2向Spring索要Action,Action是由Spring产生的。 因为Spring作为Struts2的一个插件加入到Struts2里的。 具体步骤: 1. 2. 3. 加入Struts2的配置文件:struts2.xml 修改web.xml加入 struts的filter 因为webapp启动时Spring并不会自动启动,那当然就不能初始化bean了,因为需要在webapp启动就自动启动Spring容器,这样可以将bean交给Spring来管理。我们可以利用listener来完成 这就是需要使用Struts2 for spring的插件了,那当然就需要引入struts2 for spring plugin的jar包了 struts2-spring-plugin-2.1.8.1.jar 并加入Struts2-spring-plugin的配置文件,来告诉webapp启动来初始化spring容器 需要在web.xml加入监听器 am-value> 4. 5. 规划struts的action和jsp展现 建立好action和jsp spring2.5 学习笔记 第43页 共46页 修改配置,由spring替代struts产生Action对象 注意:现在SSH整合后,action将不再是Spring管理,而是Struts-spring-plugin来管理。或是说Struts2来管理了。 因此:Action上不需要注解任务的,Struts启动后,将Action其初始化后放心Struts2的一个容器里,而其它的还是Spring来管理。Struts2初始化时,会自动根据Action中的setXXX方法全部自动注入,注入的bean是从Spring容器中提取的。 在Action中不管你有没有注解,Struts2都会自动帮你注入,并且使用名称的方式注入,如果您想指定注入名称,则可以在成员属性前面进行注解。 而Action这个bean的ID就是在Struts2.xml的配置文件中配置Action的name属性值就是了。注意了。 Struts2:Action Spring管理:dao/servce 6. 修改action配置 注意了:Actionr配置的name不能与Action中的成员属性名称发生冲突,因为Struts2自动注入成员属性的bean,而且是根据name来注入的。 四、 struts的读常量: 1. 2. 3. 4. 5. struts-default.xml struts-plugin.xml struts.xml struts.properties web.xml 第十二课:DTO、VO 一、 DTO Data Transfer Object 负责运送数据的(传输数据) 二、 VO Value Object 值对象 可用于,from里与数据库不一致时。就可以使用了。然后再构建实体类 注意:实体对象是反映到数据库中,而值对象只是在使用数据时才用到。 spring2.5 学习笔记 第44页 共46页 第十二课:SSH整合存在的问题 一、 Jsp中访问Session时,Session已经关闭 由于hibernate的load的方法是返回一个代理,而这个代理只有在实际使用时,才会发出SQL语句(才会访问数据库),当对象在JSP中使用时,load方法的事务已经关闭,也就是说session已经关闭,这时jsp才开始使用这个代理对象,才开始正直访问数据库发出SQL语句,发现session已经关闭,所以访问不了。 解决法办:就是让session在JSP使用后,才关闭, 具体:添加一个过滤器,在访问前经过过滤器,这时开启事务opsession。然后等方法结束时(JSP已经处理完数据了),还是要经过滤过器,才时我们才关闭session,这样就OK了。 Spring已经帮我处理好了:我们只需要配置这个过滤器就可以了,需要在web.xml中配置这个过滤器: org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 如果在web.xml文件中配置了。openSessionInView选项,而在beans.xml没有配置事务。这样在对数据库进行写操作时,会提示错误,原因: 因为:如果spring没有配置事务,则openSessionInview会默认设置,事务为只读事务。不能进行写操作。 配置事务了。openSessionInView认为是读写。 spring2.5 学习笔记 第45页 共46页 三、 中文乱码问题: 1、 如果是Struts2.1.6或是之前的,则使用Strunts2的i18n设置是无效,因为我们需要通过过虑器来进行,我们可以自己定义一个过虑器,但Spring已经帮我定义好了这个过虑器了。我们直接取来使用就可以了。 需要为这个filter的encoding属性指定一个参数值(就是中文编码) 2、 如果是Struts2.1.8这个Bug已经修正,我们只需要在Struts.xml文件中配置一个属性就可以了:如下: LazyInitializationException OpenSessionInViewFilter 需要严格顺序问题 需要加到struts2的filter前面 知识点名称 IOC XML IOC Annotation IOC 注入方式(两种) 简单属性 集合注入 自动装配 生命周期 AOP概念 AOP配置 事务管理AOP(xml annotation) hibernateTemplate 架构 OpenSessionInView CharacterEncodingFilter TestContext SpringJDBCTemplate 介绍 工作重要程度 *** *** *** * * * * * *** *** *** *** *** * 面试重要程度 * * * *** ** *** ** 方法建议 练 练 练+背 查 查 查 练+背 练+理解+说 用到现学 spring2.5 学习笔记 第46页 共46页 第十三课:SSH整合的jar包 一、 Struts2 1、 建立Struts2的配置文件(struts.xml) 2、 lib目录中的除junit和spring-test之外的所有文件 1) 2) 3) 4) 5) 6) 7) xwork-2.1.2.jar freemarker-2.3.13.jar struts2-core-2.1.6.jar ognl-2.6.11.jar commons-io-1.3.2.jar commons-fileupload-1.2.1.jar commons-logging-1.1.jar 1. struts2-spring-plugin-2.1.8.1.jar 二、 Hibernate3.3.2 1、 hibernate3.jar 2、 /lib/required 1) 2) 3) 4) 5) 6) javassist-3.9.0.GA.jar commons-collections-3.1.jar antlr-2.7.6.jar dom4j-1.6.1.jar slf4j-api-1.5.8.jar jta-1.1.jar 3、 Slf-nop jar 4、 引入mysql的JDBC驱动名 5、 hibernate-annotations.jar 6、 ejb3-persistence.jar 7、 hibernate-commons-annotations.jar 8、 搭建日志:我们使用slf接口,然后使用log4j的实现。 1) 2) 3) 4) 首先引入log4j的jar包(log4j-1.2.14.jar), 然后再引入slf4j实现LOG4J和适配器jar包(slf4j-log4j12-1.5.8.jar) 最后创建log4j的配置文件(log4j.properties),并加以修改,只要保留 log4j.logger.org.hibernate.tool.hbm2ddl=debug 三、 Spring 1、 spring.jar 2、 commons-logging.jar 3、 aspectjweaver.jar 4、 aspectjrt.jar 5、 cglib-nodep-2.1.3.jar 6、 commons-dbcp.jar 7、 commons-pool.jar
正在阅读:
spring2.5 学习笔记01-22
斑马105SL打印机使用手册08-31
行政后勤管理制度汇编02-29
换届晚会策划书参考模板(2)05-05
WPS表格出生日期年龄段筛选方法04-08
推动社会主义文化大繁荣课程90分06-30
彩色的金秋作文800字07-14
2022年高三9月月考试卷语文04-22
XX学校教育信息化试点项目中期评估表05-15
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 笔记
- spring
- 学习
- 2.5