课程内容
- 面向接口(抽象)编程的概念与好处
- IOC/DI的概念与好处
- inversion of control
- dependency injection
- AOP的概念与好处
- Spring简介
- Spring应用IOC/DI(重要)
- xml
- annotation
- Spring应用AOP(重要)
- xml
- annotation
- Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2整合(重要)
- opensessionInviewfilter(记住,解决什么问题,怎么解决)
- Spring JDBC
面向接口编程(面向抽象编程)
- 场景:用户添加
- Spring_0100_AbstractOrientedProgramming
- 不是AOP:Aspect Oriented Programming
- 好处:灵活
什么是IOC(DI),有什么好处
- 把自己new的东西改为由容器提供
- 初始化具体值
- 装配
- 好处:灵活装配
Spring简介
- 项目名称:Spring_0200_IOC_Introduction
- 环境搭建
- 只用IOC
- spring.jar , jarkata-commons/commons-loggin.jar
- 只用IOC
- IOC容器
- 实例化具体bean
- 动态装配
- AOP支持
- 安全检查
- 管理transaction
Spring IOC配置与应用
- FAQ:不给提示:
- window – preferences – myeclipse – xml – xml catalog
- User Specified Entries – add
- Location: D:\share\0900_Spring\soft\spring-framework-2.5.6\dist\resources\spring-beans-2.5.xsd
- URI: file:///D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd
- Key Type: Schema Location
- Key: http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- 注入类型
- Spring_0300_IOC_Injection_Type
- setter(重要)
- 构造方法(可以忘记)
- 接口注入(可以忘记)
- id vs. name
- Spring_0400_IOC_Id_Name
- name可以用特殊字符
- 简单属性的注入
- Spring_0500_IOC_SimpleProperty
- <property name=… value=….>
- <bean 中的scope属性
- Spring_0600_IOC_Bean_Scope
- singleton 单例
- proptotype 每次创建新的对象
- 集合注入
- Spring_0700_IOC_Collections
- 很少用,不重要!参考程序
- 自动装配
- Spring_0800_IOC_AutoWire
- byName
- byType
- 如果所有的bean都用同一种,可以使用beans的属性:default-autowire
- 生命周期
- Spring_0900_IOC_Life_Cycle
- lazy-init (不重要)
- init-method destroy-methd 不要和prototype一起用(了解)
- Annotation第一步:
- 修改xml文件,参考文档<context:annotation-config />
- @Autowired
- 默认按类型by type
- 如果想用byName,使用@Qulifier
- 写在private field(第三种注入形式)(不建议,破坏封装)
- 如果写在set上,@qualifier需要写在参数上
- @Resource(重要)
- 加入:j2ee/common-annotations.jar
- 默认按名称,名称找不到,按类型
- 可以指定特定名称
- 推荐使用
- 不足:如果没有源码,就无法运用annotation,只能使用xml
- @Component @Service @Controller @Repository
- 初始化的名字默认为类名首字母小写
- 可以指定初始化bean的名字
- @Scope
- @PostConstruct = init-method; @PreDestroy = destroy-method;
什么是AOP
- 面向切面编程Aspect-Oriented-Programming
- 是对面向对象的思维方式的有力补充
- Spring_1400_AOP_Introduction
- 好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码
- Filter
- Struts2的interceptor
- 概念:
- JoinPoint
- PointCut
- Aspect(切面)
- Advice
- Target
- Weave
Spring AOP配置与应用
- 两种方式:
- 使用Annotation
- 使用xml
- Annotation
- 加上对应的xsd文件spring-aop.xsd
- beans.xml <aop:aspectj-autoproxy />
- 此时就可以解析对应的Annotation了
- 建立我们的拦截类
- 用@Aspect注解这个类
- 建立处理方法
- 用@Before来注解方法
- 写明白切入点(execution …….)
- 让spring对我们的拦截器类进行管理@Component
- 常见的Annotation:
- @Pointcut
- @Before
- @AfterReturning
- @AfterThrowing
- @After
- @Around
- 织入点语法
- void !void
- 参考文档(* ..)
- xml配置AOP
- 把interceptor对象初始化
- <aop:config
- <aop:aspect …..
- <aop:pointcut
- <aop:before
- <aop:aspect …..
Spring整合Hibernate
Spring 指定datasource
- 参考文档,找dbcp.BasicDataSource
- c3p0
- dbcp
- proxool
- 在DAO或者Service中注入dataSource
- 在Spring中可以使用PropertyPlaceHolderConfigure来读取Properties文件的内容
Spring整合Hibernate
- <bean .. AnnotationSessionFactoryBean>
- <property dataSource
- <annotatedClasses
- 引入hibernate 系列jar包
- User上加Annotation
- UserDAO或者UserServie 注入SessionFactory
- jar包问题一个一个解决
声明式的事务管理
- 事务加在DAO层还是Service层?
- annotation
- 加入annotation.xsd
- 加入txManager bean
- <tx:annotation-driven
- 在需要事务的方法上加:@Transactional
- 需要注意,使用SessionFactory.getCurrentSession 不要使用OpenSession
- @Transactional详解
- 什么时候rollback
- 运行期异常,非运行期异常不会触发rollback
- 必须uncheck (没有catch)
- 不管什么异常,只要你catch了,spring就会放弃管理
- 事务传播特性:propagation_required
- read_only
- 什么时候rollback
- xml(推荐,可以同时配置好多方法)
- <bean txmanager
- <aop:config
- <aop:pointcut
- <aop:advisor pointcut-ref advice-ref
- <tx:advice: id transaction-manager =
- HibernateTemplate、HibernateCallback、HibernateDaoSupport(不重要)介绍
- 设计模式:Template Method
- Callback:回调/钩子函数
- 第一种:(建议)
- 在spring中初始化HibernateTemplate,注入sessionFactory
- DAO里注入HibernateTemplate
- save写getHibernateTemplate.save();
- 第二种:
- 从HibernateDaoSupport继承
- 必须写在xml文件中,无法使用Annotation,因为set方法在父类中,而且是final的
- spring整合hibernate的时候使用packagesToScan属性,可以让spring自动扫描对应包下面的实体类
Struts2.1.6+ Spring2.5.6 + Hibernate3.3.2
- 需要的jar包列表
jar包名称 | 所在位置 | 说明 |
antlr-2.7.6.jar | hibernate/lib/required | 解析HQL |
aspectjrt | spring/lib/aspectj | AOP |
aspectjweaver | .. | AOP |
cglib-nodep-2.1_3.jar | spring/lib/cglib | 代理,二进制增强 |
common-annotations.jar | spring/lib/j2ee | @Resource |
commons-collections-3.1.jar | hibernate/lib/required | 集合框架 |
commons-fileupload-1.2.1.jar | struts/lib | struts |
commons-io-1.3.2 | struts/lib | struts |
commons-logging-1.1.1 | 单独下载,删除1.0.4(struts/lib) | struts spring |
dom4j-1.6.1.jar | hibernate/required | 解析xml |
ejb3-persistence | hibernate-annotation/lib | @Entity |
freemarker-2.3.13 | struts/lib | struts |
hibernate3.jar | hibernate |
|
hibernate-annotations | hibernate-annotation/ |
|
hibernate-common-annotations | hibernate-annotation/lib |
|
javassist-3.9.0.GA.jar | hiberante/lib/required | hibernate |
jta-1.1.jar | .. | hibernate transaction |
junit4.5 |
|
|
mysql- |
|
|
ognl-2.6.11.jar | struts/lib |
|
slf4j-api-1.5.8.jar | hibernate/lib/required | hibernate-log |
slf4j-nop-1.5.8.jar | hibernate/lib/required |
|
spring.jar | spring/dist |
|
struts2-core-2.1.6.jar | struts/lib |
|
xwork-2.1.2.jar | struts/lib | struts2 |
commons-dbcp | spring/lib/jarkata-commons |
|
commons-pool.jar | .. |
|
struts2-spring-plugin-2.1.6.jar | struts/lib |
|
- BestPractice:
- 将这些所有的jar包保存到一个位置,使用的时候直接copy
- 步骤
- 加入jar包
- 首先整合Spring + Hibernate
- 建立对应的package
- dao / dao.impl / model / service / service.impl/ test
- 建立对应的接口与类框架
- S2SH_01
- 建立spring的配置文件(建议自己保留一份经常使用的配置文件,以后用到的时候直接copy改)
- 建立数据库
- 加入Hibernate注解
- 在实体类上加相应注解@Entity @Id等
- 在beans配置文件配置对应的实体类,使之受管
- 写dao service的实现
- 加入Spring注解
- 在对应Service及DAO实现中加入@Component,让spring对其初始化
- 在Service上加入@Transactional或者使用xml方式(此处建议后者,因为更简单)
- 在DAO中注入sessionFactory
- 在Service中注入DAO
- 写DAO与Service的实现
- 写测试
- 建立对应的package
- 整合Struts2
- 结合点:Struts2的Action由Spring产生
- 步骤:
- 修改web.xml加入 struts的filter
- 再加入spring的listener,这样的话,webapp一旦启动,spring容器就初始化了
- 规划struts的action和jsp展现
- 加入struts.xml
- 修改配置,由spring替代struts产生Action对象
- 修改action配置
- 把类名改为bean对象的名称,这个时候就可以使用首字母小写了
- @Scope(“prototype”)不要忘记
- struts的读常量:
- struts-default.xml
- struts-plugin.xml
- struts.xml
- struts.properties
- web.xml
- 中文问题:
- Struts2.1.8已经修正,只需要改i18n.encoding = gbk
- 使用spring的characterencoding
- 需要严格注意filter的顺序
- 需要加到Struts2的filter前面
- LazyInitializationException
- OpenSessionInViewFilter
- 需要严格顺序问题
- 需要加到struts2的filter前面
- Spring 的TestContext 测试框架