1、尚学堂马士兵 Spring 文档课程内容1. 面向接口(抽象)编程的概念与好处2. IOC/DI 的概念与好处a) inversion of controlb) dependency injection3. AOP 的概念与好处4. Spring 简介5. Spring 应用 IOC/DI(重要)a) xmlb) annotation6. Spring 应用 AOP(重要)a) xmlb) annotation7. Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2 整合(重要)a) opensessionInviewfilter(记住,解决什么问题,怎么解决
2、)8. Spring JDBC面向接口编程(面向抽象编程)1. 场景:用户添加2. Spring_0100_AbstractOrientedProgramminga) 不是 AOP:Aspect Oriented Programming3. 好处:灵活什么是 IOC(DI) ,有什么好处1. 把自己 new 的东西改为由容器提供a) 初始化具体值b) 装配2. 好处:灵活装配Spring 简介1. 项目名称:Spring_0200_IOC_Introduction2. 环境搭建a) 只用 IOCi. spring.jar , jarkata-commons/commons-loggin.jar
3、3. IOC 容器a) 实例化具体 beanb) 动态装配4. AOP 支持a) 安全检查b) 管理 transactionSpring IOC 配置与应用1. FAQ:不给提示:a) window preferences myeclipse xml xml catalogb) User Specified Entries addi. Location:D:share0900_Springsoftspring-framework-2.5.6distresourcesspring-beans-2.5.xsdii. URI: file:/D:/share/0900_Spring/soft/spri
4、ng-framework-2.5.6/dist/resources/spring-beans-2.5.xsdiii. Key Type: Schema Locationiv. Key: http:/www.springframework.org/schema/beans/spring-beans-2.5.xsd2. 注入类型a) Spring_0300_IOC_Injection_Typeb) setter(重要)c) 构造方法(可以忘记)d) 接口注入(可以忘记)3. id vs. namea) Spring_0400_IOC_Id_Nameb) name 可以用特殊字符4. 简单属性的注入
5、a) Spring_0500_IOC_SimplePropertyb) 5. 10. Autowireda) 默认按类型 by typeb) 如果想用 byName,使用Qulifierc) 写在 private field(第三种注入形式) (不建议,破坏封装)d) 如果写在 set 上,qualifier 需要写在参数上11. Resource(重要)a) 加入:j2ee/common-annotations.jarb) 默认按名称,名称找不到,按类型c) 可以指定特定名称d) 推荐使用e) 不足:如果没有源码,就无法运用 annotation,只能使用 xml12. Component
6、Service Controller Repositorya) 初始化的名字默认为类名首字母小写b) 可以指定初始化 bean 的名字13. Scope14. PostConstruct = init-method; PreDestroy = destroy-method;什么是 AOP1. 面向切面编程 Aspect-Oriented-Programminga) 是对面向对象的思维方式的有力补充2. Spring_1400_AOP_Introduction3. 好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码a) Filterb) Struts2 的 interceptor4.
7、 概念:a) JoinPointb) PointCutc) Aspect(切面)d) Advicee) Targetf) WeaveSpring AOP 配置与应用1. 两种方式:a) 使用 Annotationb) 使用 xml2. Annotationa) 加上对应的 xsd 文件 spring-aop.xsdb) beans.xml c) 此时就可以解析对应的 Annotation 了d) 建立我们的拦截类e) 用Aspect 注解这个类f) 建立处理方法g) 用Before 来注解方法h) 写明白切入点(execution .)i) 让 spring 对我们的拦截器类进行管理Compo
8、nent3. 常见的 Annotation:a) Pointcutb) Beforec) AfterReturningd) AfterThrowinge) Afterf) Around4. 织入点语法a) void !voidb) 参考文档(* )5. xml 配置 AOPa) 把 interceptor 对象初始化b) i. property dataSourceii. annotatedClassesb) 引入 hibernate 系列 jar 包c) User 上加 Annotationd) UserDAO 或者 UserServie 注入 SessionFactorye) jar 包问
9、题一个一个解决3. 声明式的事务管理a) 事务加在 DAO 层还是 Service 层?b) annotationi. 加入 annotation.xsdii. 加入 txManager beaniii. tx:annotation-driveniv. 在需要事务的方法上加: Transactionalv. 需要注意,使用 SessionFactory.getCurrentSession 不要使用OpenSessionc) Transactional 详解i. 什么时候 rollback 1. 运行期异常,非运行期异常不会触发 rollback2. 必须 uncheck (没有 catch)3
10、. 不管什么异常,只要你 catch 了,spring 就会放弃管理4. 事务传播特性:propagation_required5. read_onlyd) xml(推荐,可以同时配置好多方法)i. bean txmanagerii. aop:config 1. aop:pointcut2. aop:advisor pointcut-ref advice-refiii. tx:advice: id transaction-manager = e) HibernateTemplate、HibernateCallback、HibernateDaoSupport(不重要)介绍i. 设计模式: Tem
11、plate Methodii. Callback:回调/钩子函数iii. 第一种:(建议)1. 在 spring 中初始化 HibernateTemplate,注入 sessionFactory2. DAO 里注入 HibernateTemplate3. save 写 getHibernateTemplate.save();iv. 第二种:1. 从 HibernateDaoSupport 继承2. 必须写在 xml 文件中,无法使用 Annotation,因为 set 方法在父类中,而且是 final 的f) spring 整合 hibernate 的时候使用 packagesToScan 属
12、性,可以让 spring 自动扫描对应包下面的实体类Struts2.1.6 + Spring2.5.6 + Hibernate3.3.21. 需要的 jar 包列表jar 包名称 所在位置 说明antlr-2.7.6.jar hibernate/lib/required 解析 HQLaspectjrt spring/lib/aspectj AOPaspectjweaver AOPcglib-nodep-2.1_3.jar spring/lib/cglib 代理,二进制增强common-annotations.jar spring/lib/j2ee Resourcecommons-collect
13、ions-3.1.jar hibernate/lib/required 集合框架commons-fileupload-1.2.1.jar struts/lib strutscommons-io-1.3.2 struts/lib strutscommons-logging-1.1.1 单独下载,删除1.0.4(struts/lib)strutsspringdom4j-1.6.1.jar hibernate/required 解析 xmlejb3-persistence hibernate-annotation/lib Entityfreemarker-2.3.13 struts/lib stru
14、tshibernate3.jar hibernatehibernate-annotations hibernate-annotation/hibernate-common-annotationshibernate-annotation/libjavassist-3.9.0.GA.jar hiberante/lib/required hibernatejta-1.1.jar hibernate transactionjunit4.5mysql-ognl-2.6.11.jar struts/libslf4j-api-1.5.8.jar hibernate/lib/required hibernat
15、e-logslf4j-nop-1.5.8.jar hibernate/lib/requiredspring.jar spring/diststruts2-core-2.1.6.jar struts/libxwork-2.1.2.jar struts/lib struts2commons-dbcp spring/lib/jarkata-commonscommons-pool.jar struts2-spring-plugin-2.1.6.jar struts/lib2. BestPractice:a) 将这些所有的 jar 包保存到一个位置,使用的时候直接 copy3. 步骤a) 加入 jar
16、包b) 首先整合 Spring + Hibernatei. 建立对应的 package1. dao / dao.impl / model / service / service.impl/ testii. 建立对应的接口与类框架1. S2SH_01iii. 建立 spring 的配置文件(建议自己保留一份经常使用的配置文件,以后用到的时候直接 copy 改)iv. 建立数据库v. 加入 Hibernate 注解1. 在实体类上加相应注解Entity Id 等2. 在 beans 配置文件配置对应的实体类,使之受管vi. 写 dao service 的实现vii. 加入 Spring 注解1.
17、在对应 Service 及 DAO 实现中加入Component,让 spring 对其初始化2. 在 Service 上加入Transactional 或者使用 xml 方式(此处建议后者,因为更简单)3. 在 DAO 中注入 sessionFactory4. 在 Service 中注入 DAO5. 写 DAO 与 Service 的实现viii. 写测试c) 整合 Struts2i. 结合点: Struts2 的 Action 由 Spring 产生ii. 步骤:1. 修改 web.xml 加入 struts 的 filter2. 再加入 spring 的 listener,这样的话,we
18、bapp 一旦启动,spring 容器就初始化了3. 规划 struts 的 action 和 jsp 展现4. 加入 struts.xmla) 修改配置,由 spring 替代 struts 产生 Action 对象5. 修改 action 配置a) 把类名改为 bean 对象的名称,这个时候就可以使用首字母小写了b) Scope(“prototype”)不要忘记iii. struts 的读常量:1. struts-default.xml 2. struts-plugin.xml3. struts.xml4. struts.properties5. web.xmliv. 中文问题:1. Struts2.1.8 已经修正,只需要改 i18n.encoding = gbk2. 使用 spring 的 characterencoding3. 需要严格注意 filter 的顺序4. 需要加到 Struts2 的 filter 前面v. LazyInitializationException1. OpenSessionInViewFilter2. 需要严格顺序问题3. 需要加到 struts2 的 filter 前面