spring五天的学习,只需要五天学会spring
2013-11-29 22:49
399 查看
======================
================
Spring提供了一个整合应用平台。
该框架具有IOC和AOP机制的实现,
基于这些特性开发系统,
可以提高系统结构的灵活性,
降低组件之间的耦合度。
在整合应用,
我们会将应用程序的Action,DAO,Service组件交给Spring框架负责管理,
使用Spring框架的IOC和AOP机制以低耦合方式建立关联。
Spring容器首先具有工厂特性,除此之外还具备了IOC和AOP机制的实现。
BeanFactory<-继承-ApplicationContext
两个实现类:
ClassPathApplicationContext
FileSystemApplicationContext
当将一个Bean组件交给Spring容器后,Spring容器可以负责创建、销毁该对象。
Spring容器支持singleton和prototype两种模式创建对象。
默认为singleton,如果想改变可以使用scope属性定义。
(如果在Web整合应用,还支持request,session等值)
singleton 模式对象在容器实例化时创建,
通过lazy=true属性可以将创建推迟到getBean方法。
prototype 模式对象在getBean方法时创建
通过init-method属性可以指定一个方法当做初始化方法,
在对象创建后自动执行。
通过destroy-method属性可以指定一个销毁方法,
在对象被垃圾回收前自动执行。
(仅对singleton对象有效)
Inverse of Controller 被称为反向控制、控制反转。
更确切的讲应该是控制的转移。
意思是当两个组件之间具有使用关系时,
原有将对象创建和关系指定逻辑交给了使用一方负责。
最终导致了两个组件耦合度过高,
为维护和组件替换带来的不便。
采用了IOC机制后,
会将对象创建和关系指定这些逻辑交给第三方框架或容器负责,
将这些控制逻辑转移给了第三方负责,
这样发生变更后,只需要修改第三方配置就可以了。
DI被称为依赖注入。Spring框架中IOC机制是通过DI技术实现的。
DI注入技术有以下几种实现:
依靠setter方法接收注入的对象实例
--添加setter方法
--采用<property>描述
依靠构造方法接收注入的对象实例
--添加带参数构造方法
--采用<constructor-arg>描述
可以通过注入技术注入各种不同类型的数据
1)注入一个Bean对象
采用ref="Bean的ID名称"
<property name="costDao"
ref="hibernateCostDao">
</property>
2)注入一个基本类型数据
采用value="值"
<property name="password"
value="123456">
</property>
3)注入集合类型数据
List,Set,Map,Properties
======================
================
Apsect Oriented Programming面向方面编程。
面向方面编程是以OOP面向对象编程为基础。
AOP关注的是共通处理问题,可以将共通处理封装成一个组件(方面组件),
然后采用AOP机制可以以低耦合方式作用到指定的目标组件上。
a.引入Spring的IOC和AOP开发包
b.添加Spring容器配置文件
c.将共通处理封装成一个独立Bean组件
d.采用AOP配置将Bean组件作用到其它目标组件及其方法上
*a.方面(Aspect)
方面指的封装共通处理的组件。可以灵活的切入到目标对象及方法上。
*b.切入点(Pointcut)
切入点用于指定目标对象及方法,利用特定表式指定目标对象及方法
c.连接点(JoinPoint)
连接点指的是方面和某一个目标方法的关联点。切入点是连接点的集合
*d.通知(Advice)
通知用于指定方面功能在目标对象方法上执行的时机。
例如方法前、方法后、异常发生后等。
e.目标组件(Target)
使用方面功能的Bean组件,或者切入点指定的Bean组件
f.动态代理(AutoProxy)
动态代理机制是AOP机制的实现原理.
Spring框架在使用AOP配置后,返回的Bean对象,
是采用动态代理机制生成的一个新类型。
该类型的方法负责去执行方面组件和目标组件的处理。
Spring框架采用了两种方式生成动态代理类。
--采用CGLIB工具生成(目标对象没有接口)
public class 代理类 extends 原目标组件{
// 重写原目标组件的方法
}
--采用JDK Proxy API生成(目标对象有接口)
public class 代理类 implements 原目标组件接口{
// 重写原目标组件的方法
}
*a.方法限定表达式
execution(修饰符?
返回类型 方法名(参数列表) throws异常?)
示例1:匹配容器中所有组件以add开始的方法
execution(* add*(..))
示例2:匹配CostService组件的所有方法
execution(*
org.tarena.service.CostService.*(..))
示例3:匹配service包下所有类的所有方法
execution(* org.tarena.service.*.*(..))
示例4:匹配service包下及其子包中所有类的所有方法
execution(* org.tarena.service..*.*(..))
*b.类型限定表达式
within(类型)
示例1:匹配CostService类中所有方法
within(org.tarena.service.CostService)
示例2:匹配service包下所有类的所有方法
within(org.tarena.service.*)
示例3:匹配service包及其子包所有类所有方法
within(org.tarena.service..*)
c.Bean名称限定表达式
bean(Bean的id或name属性值)
示例1:匹配id=costAction的Bean组件方法
bean(costAction)
示例2:匹配名称以DAO结尾的Bean组件方法
bean(*DAO)
d.参数限定表达式
args(参数列表)
示例1:匹配只有一个参数,并且符合Serializable类型
args(java.io.Serializable)
(注意:上述表达式可以采用&&,||连接在一起)
a.前置通知<aop:before>
方面组件在目标方法之前调用
b.后置通知<aop:after-returnning>
方面组件在目标方法之后调用,如果目标方法抛出异常,将不再执行方面组件
c.最终通知<aop:after>
方面组件在目标方法之后调用,目标方法有无异常都会执行
d.异常通知<aop:after-throwing>
方面组件在目标方法抛出异常后执行。
e.环绕通知<aop:around>
方面组件在目标方法之前和之后都要执行
try{
// 前置通知--执行方面组件
// 执行目标方法
// 后置通知--执行方面组件
}catch(Exception ex){
// 异常通知--执行方面组件
}finally{
// 最终通知--执行方面组件
}
b.将方面组件定义到Spring容器
c.添加AOP配置,定义切入点,方面和通知元素
Log4j是一款日志工具。
优点:该日志器可以灵活的控制输出信息的级别和输出的方式。
Log4j主要由以下3部分构成:
a.日志器组件
(Logger)
提供了消息输出的方法,可以按消息级别输出
b.输出器组件(Appender)
用于指定消息采用哪种方式输出。例如以文件形式输出,以控制台形式输出
c.布局器组件(Layout)
用于指定消息输出的格式。
一个日志器可以指定多个不同的输出器,每个输出器只能对应一个布局器。
==============
===========
注解技术源于JDK 5.0,从Spring2.5版本开始支持注解配置形式,可以替代原有的XML配置。
注解可以在类定义、方法定义、成员定义前使用。
可以采用组件扫描技术替代原有的<bean>定义和注入配置。
使用方法如下:
a.在applicationContext.xml中开启组件扫描功能,指定要扫描的package路径
b.如果需要将组件扫描到Spring容器,需要在组件类定义前使用以下注解标记。
--@Controller
--@Service
--@Repository
--@Component
默认扫描到容器采用类名首字母小写当id值,
如果需要指定可采用@Service("id值")格式指定。
如果需要修改scope创建对象的模式,
可使用@Scope("prototype")格式指定
c.如果两个组件之间有注入关系,可以在变量定义前或setter方法前使用下面注解标记
--@Resource
--@Autowired
如果不指定注入的id名,会采用类型匹配注入。
@Resource(name="costDao")将指定的costDao对象注入。
a.在applicationContext.xml中开启AOP注解配置。
b.在方面组件中使用以下注解标记。
--@Aspect // 将Bean组件定义成方面,类定义前使用
--@Pointcut// 定义切入点表达式,方法定义前使用。因此需要编写个空方法,才能使用该标记。
--通知定义,@Around,@Before,
@After,@AfterReturning,
@AfterThrowing,在方法前使用
a.提供了一致的异常处理层次.提供了一套异常类型,例如DataAccessException
b.提供了编写DAO的一套工具类,主要有DaoSupport和Template两种封装类型。
JDBC技术:JdbcDaoSupport,JdbcTemplate
Hibernate技术:HibernateDaoSupport,
HibernateTemplate
c.提供了事务管理的支持。只需要添加AOP配置即可。
(spring开发包,ojdbc.jar,dbcp开发包)
--在src下添加applicationContext.xml
--针对COST表编写实体类
--编写CostDAO接口,定义要实现的方法
--编写JdbcCostDAO实现类
(继承JdbcDaoSupport,在方法体中使用JdbcTemplate类完成增删改查操作)
update:用于增、删、改操作
queryForObject:用于查询一条记录
query:用于查询多条记录
queryForInt:用于查询一个数值的
--将JdbcCostDAO在Spring容器中定义
--追加一个连接池,在Spring容器中定义一个dataSource组件对象Bean,
并将该Bean组件对象给JdbcCostDAO注入。
(JdbcDaoSupport里有一个setDataSource方法,
接收容器注入的DataSource对象,
利用DataSource对象实例化JdbcTemplate)
(spring开发包,ojdbc.jar,dbcp连接池,hibernate框架开发包)
--在src下添加applicationContext.xml
--针对数据表添加实体类和映射描述文件
(Cost类,Cost.hbm.xml)
--编写CostDAO接口
--编写实现类HibernateCostDAO
(继承HibernateDaoSupport,采用HibernateTemplate的方法完成增删改查)
save():添加
update():更新
delete():删除
load(),get():按主键查询
find():执行HQL语句
--在Spring容器配置HibernateCostDAO
需要事先定义DataSource,SessionFactory
组件对象,按DataSource-注入->
SessionFactory-注入->
HibernateCostDAO顺序建立关联
提示:如果需要在DAO中使用Session,
可以采用DaoSupport的getSession()获取,
也可以通过HibernateTemplate.execute方法以回调方式使用。
(参考spring_03_2中HibernateCostDAO.java的useSession()方法)
=====================
================
a.创建工程,引入开发包
Struts开发包,Spring开发包
b.添加Struts控制器配置和struts.xml配置文件
*c.引入struts2-spring-plugin.jar整合包
然后将<action>配置的class指定为Spring容器中Action组件定义的id值。
(plugin.jar整合包提供一个StrutsSpringObjectFactory,采用该组件获取Action对象。
该组件可以访问Spring容器,获取容器中定义的Bean对象)
*d.在web.xml中添ContextLoaderListener组件,用于在启动服务器时实例化Spring容器
该plugin.jar提供了一个StrutsSpringObjectFactory类,
当引入该jar后,Struts2会采用该组件获取Action对象
ObjectFactory在获取Action对象时,有以下两种途径:
a.利用<action>元素的class属性值去Spring容器中寻找Bean对象,寻找规则是id=class值
参考(ssh2-2.jpg结构图)
b.如果利用<action>的class属性值去Spring容器获取不到Bean对象,
ObjectFactory会利用反射机制创建一个Action对象,
然后访问Spring容器,
将容器中id名与Action属性一致的Bean对象注入给Action。
参考(ssh2-1.jpg结构图)
try{
// 第一种利用class值去Spring获取Bean对象
}catch(){
// 第二种自己创建一个Action,之后将Spring中的Bean对象给Action属性注入。
//注入规则是属性名=id值
}
Struts2+Spring整合,建议采用ssh2-1.jpg结构整合。
掌握:ssh2-1.jpg采用注解方法整合应用。
(参考spring_04_4的demo2案例)
======================
===================
1)重构资费列表显示功能
a.梳理处理流程
/cost/list.action-->ListCostAction
-->CostDAO.findAll/getTotalPages
-->cost_list.jsp
b.重构CostDAO的findAll/getTotalPages
(参考原来总结过的Spring+Hibernate步骤)
c.测试Spring容器中的DAO
d.改造ListCostAction
--引入struts-spring-plugin.jar
--将Spring容器中的DAO给Action注入
e.在web.xml中添加ContextLoaderListener配置,启动服务器时实例化Spring容器对象。
2)重构资费修改操作
a.梳理处理流程
/cost/detail.action-->DetailCostAction
-->CostDAO.findById-->cost_detail.jsp
b.重构CostDAO.findById方法
由于前面重构已经将CostDAO交给Spring容器管理,因此只要将findById实现就可以了
c.重构DetailCostAction
--将Spring容器中的DAO给Action注入
d.测试功能
*3)Spring对Hibernate延迟加载操作的支持
为了支持Hibernate延迟加载操作,
Spring提供了一个Filter组件,
该组件为OpenSessionInViewFilter。
可以在web.xml中定义该Filter。
这样可以将Template方法关闭Session时机推迟到JSP解析之后。
注意:定义在StrutsFilter之前才有效
*a.声明式事务管理
以AOP配置的形式实现事务管理
JDBC事务管理的方面组件:
(DataSourceTransactionManager)
Hibernate事务管理的方面组件:
(HibernateTransactionManager)
事务管理通知:<tx:advice>
切入点:根据实际情况编写表达式
-----如果采用注解方式配置事务------
首先在applicationContext中开启事务注解
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"
ref="sessionFactory">
</property>
</bean>
<tx:annotation-driven
transaction-manager="txManager"/>
然后在目标组件中,使用@Transactional.
该标记可用在类定义和方法定前。类定义前指定全局,方法定以前指定当前方法。
b.编程式事务管理(简单了解)
在业务组件中添加事务管理代码.
代码中使用TransactionTemplate控制事务
Spring提供的MVC框架主要有以下实现组件:
控制器DispatcherServlet,Controller
映射处理器HandlerMapping
视图解析器ViewResolver
模型和视图ModelAndView
2)了解Spring MVC的处理流程
a.客户端发送请求,请求交给DispatcherServlet控制器
b.DispatcherServlet控制器调用HandlerMapping映射器组件,
根据请求找到对应的Controller组件
(HandlerMapping组件负责维护请求和Controller组件的对应关系)
c.控制器调用请求对应的Controller处理请求,也可以调用DAO实现对数据库的操作
d.Controller处理完毕后,会返回一个ModelAndView对象。
(ModelAndView负责封装响应数据和视图名)
e.控制器会调用ViewResolver组件,
根据ModelAndView信息,
定位到指定的JSP,生成响应的HTML结果
f.将响应结果输出,为客户浏览器显示
3)入门示例
--基于XML配置的示例
a.引入spring ioc和springmvc开发包
b.在src下添加applicationContext.xml
c.在web.xml中添加DispatcherServlet配置,
指定classpath:applicationContext.xml
d.编写Controller组件,实现Controller接口,
实现handleRequest方法。
e.在Spring配置文件中定义Controller组件,
定义handlerMapping和viewResolver组件
--基于注解配置的示例(推荐)
a.引入spring ioc和springmvc开发包
b.在src下添加applicationContext.xml
c.在web.xml中添加DispatcherServlet配置,
指定classpath:applicationContext.xml
d.在applicationContext.xml中定义
AnnotationMethodHandlerAdapter(支持注解的handlerMapping组件)和viewResolver组件。
开启组件扫描配置。
e.编写Action组件。
Action类定义前使用@Controller将Action扫描到容器。
业务方法前使用@RequestMapping,指定该方法处理哪个请求
第一天
================
1.Spring框架作用和优点
Spring提供了一个整合应用平台。该框架具有IOC和AOP机制的实现,
基于这些特性开发系统,
可以提高系统结构的灵活性,
降低组件之间的耦合度。
在整合应用,
我们会将应用程序的Action,DAO,Service组件交给Spring框架负责管理,
使用Spring框架的IOC和AOP机制以低耦合方式建立关联。
*2.Spring框架容器
Spring框架提供了一个容器,主要在该容器中管理应用程序的各个组件,建立组件关联
1)容器特性,如何实例化
Spring容器首先具有工厂特性,除此之外还具备了IOC和AOP机制的实现。BeanFactory<-继承-ApplicationContext
两个实现类:
ClassPathApplicationContext
FileSystemApplicationContext
2)容器如何对Bean组件管理
当将一个Bean组件交给Spring容器后,Spring容器可以负责创建、销毁该对象。
*a.Bean对象创建模式
Spring容器支持singleton和prototype两种模式创建对象。默认为singleton,如果想改变可以使用scope属性定义。
(如果在Web整合应用,还支持request,session等值)
b.Bean对象的创建时机
singleton 模式对象在容器实例化时创建,通过lazy=true属性可以将创建推迟到getBean方法。
prototype 模式对象在getBean方法时创建
c.Bean对象初始化设置
通过init-method属性可以指定一个方法当做初始化方法,在对象创建后自动执行。
通过destroy-method属性可以指定一个销毁方法,
在对象被垃圾回收前自动执行。
(仅对singleton对象有效)
*3.Spring框架的IOC机制
1)IOC概念
Inverse of Controller 被称为反向控制、控制反转。更确切的讲应该是控制的转移。
意思是当两个组件之间具有使用关系时,
原有将对象创建和关系指定逻辑交给了使用一方负责。
最终导致了两个组件耦合度过高,
为维护和组件替换带来的不便。
采用了IOC机制后,
会将对象创建和关系指定这些逻辑交给第三方框架或容器负责,
将这些控制逻辑转移给了第三方负责,
这样发生变更后,只需要修改第三方配置就可以了。
2)DI概念(Dependency Injection)
DI被称为依赖注入。Spring框架中IOC机制是通过DI技术实现的。DI注入技术有以下几种实现:
*a.setter方式注入(推荐)
依靠setter方法接收注入的对象实例--添加setter方法
--采用<property>描述
b.constructor方式注入
依靠构造方法接收注入的对象实例--添加带参数构造方法
--采用<constructor-arg>描述
4.DI注入的使用
可以通过注入技术注入各种不同类型的数据1)注入一个Bean对象
采用ref="Bean的ID名称"
<property name="costDao"
ref="hibernateCostDao">
</property>
2)注入一个基本类型数据
采用value="值"
<property name="password"
value="123456">
</property>
3)注入集合类型数据
List,Set,Map,Properties
======================
第二天
================
1.Spring框架的AOP机制
1)什么是AOP和优点
Apsect Oriented Programming面向方面编程。面向方面编程是以OOP面向对象编程为基础。
AOP关注的是共通处理问题,可以将共通处理封装成一个组件(方面组件),
然后采用AOP机制可以以低耦合方式作用到指定的目标组件上。
2)AOP使用步骤
a.引入Spring的IOC和AOP开发包b.添加Spring容器配置文件
c.将共通处理封装成一个独立Bean组件
d.采用AOP配置将Bean组件作用到其它目标组件及其方法上
3)AOP相关概念
*a.方面(Aspect)方面指的封装共通处理的组件。可以灵活的切入到目标对象及方法上。
*b.切入点(Pointcut)
切入点用于指定目标对象及方法,利用特定表式指定目标对象及方法
c.连接点(JoinPoint)
连接点指的是方面和某一个目标方法的关联点。切入点是连接点的集合
*d.通知(Advice)
通知用于指定方面功能在目标对象方法上执行的时机。
例如方法前、方法后、异常发生后等。
e.目标组件(Target)
使用方面功能的Bean组件,或者切入点指定的Bean组件
f.动态代理(AutoProxy)
动态代理机制是AOP机制的实现原理.
Spring框架在使用AOP配置后,返回的Bean对象,
是采用动态代理机制生成的一个新类型。
该类型的方法负责去执行方面组件和目标组件的处理。
Spring框架采用了两种方式生成动态代理类。
--采用CGLIB工具生成(目标对象没有接口)
public class 代理类 extends 原目标组件{
// 重写原目标组件的方法
}
--采用JDK Proxy API生成(目标对象有接口)
public class 代理类 implements 原目标组件接口{
// 重写原目标组件的方法
}
*4)切入点表达式
利用表达式指定目标组件及方法。*a.方法限定表达式
execution(修饰符?
返回类型 方法名(参数列表) throws异常?)
示例1:匹配容器中所有组件以add开始的方法
execution(* add*(..))
示例2:匹配CostService组件的所有方法
execution(*
org.tarena.service.CostService.*(..))
示例3:匹配service包下所有类的所有方法
execution(* org.tarena.service.*.*(..))
示例4:匹配service包下及其子包中所有类的所有方法
execution(* org.tarena.service..*.*(..))
*b.类型限定表达式
within(类型)
示例1:匹配CostService类中所有方法
within(org.tarena.service.CostService)
示例2:匹配service包下所有类的所有方法
within(org.tarena.service.*)
示例3:匹配service包及其子包所有类所有方法
within(org.tarena.service..*)
c.Bean名称限定表达式
bean(Bean的id或name属性值)
示例1:匹配id=costAction的Bean组件方法
bean(costAction)
示例2:匹配名称以DAO结尾的Bean组件方法
bean(*DAO)
d.参数限定表达式
args(参数列表)
示例1:匹配只有一个参数,并且符合Serializable类型
args(java.io.Serializable)
(注意:上述表达式可以采用&&,||连接在一起)
5)通知类型
通知主要用于指定方面组件在目标组件方法上作用的时机。a.前置通知<aop:before>
方面组件在目标方法之前调用
b.后置通知<aop:after-returnning>
方面组件在目标方法之后调用,如果目标方法抛出异常,将不再执行方面组件
c.最终通知<aop:after>
方面组件在目标方法之后调用,目标方法有无异常都会执行
d.异常通知<aop:after-throwing>
方面组件在目标方法抛出异常后执行。
e.环绕通知<aop:around>
方面组件在目标方法之前和之后都要执行
try{
// 前置通知--执行方面组件
// 执行目标方法
// 后置通知--执行方面组件
}catch(Exception ex){
// 异常通知--执行方面组件
}finally{
// 最终通知--执行方面组件
}
6)采用AOP记录异常日志信息
a.编写记录异常信息的方面组件ExceptionBeanb.将方面组件定义到Spring容器
c.添加AOP配置,定义切入点,方面和通知元素
7)Log4j工具简介
Log4j是一款日志工具。优点:该日志器可以灵活的控制输出信息的级别和输出的方式。
Log4j主要由以下3部分构成:
a.日志器组件
(Logger)
提供了消息输出的方法,可以按消息级别输出
b.输出器组件(Appender)
用于指定消息采用哪种方式输出。例如以文件形式输出,以控制台形式输出
c.布局器组件(Layout)
用于指定消息输出的格式。
一个日志器可以指定多个不同的输出器,每个输出器只能对应一个布局器。
==============
第三天
===========
1.Spring注解配置的使用
注解技术源于JDK 5.0,从Spring2.5版本开始支持注解配置形式,可以替代原有的XML配置。注解可以在类定义、方法定义、成员定义前使用。
1)<bean>元素和注入的配置
可以采用组件扫描技术替代原有的<bean>定义和注入配置。使用方法如下:
a.在applicationContext.xml中开启组件扫描功能,指定要扫描的package路径
b.如果需要将组件扫描到Spring容器,需要在组件类定义前使用以下注解标记。
--@Controller
--@Service
--@Repository
--@Component
默认扫描到容器采用类名首字母小写当id值,
如果需要指定可采用@Service("id值")格式指定。
如果需要修改scope创建对象的模式,
可使用@Scope("prototype")格式指定
c.如果两个组件之间有注入关系,可以在变量定义前或setter方法前使用下面注解标记
--@Resource
--@Autowired
如果不指定注入的id名,会采用类型匹配注入。
@Resource(name="costDao")将指定的costDao对象注入。
2)<aop>元素配置
AOP注解配置的使用方法如下:a.在applicationContext.xml中开启AOP注解配置。
b.在方面组件中使用以下注解标记。
--@Aspect // 将Bean组件定义成方面,类定义前使用
--@Pointcut// 定义切入点表达式,方法定义前使用。因此需要编写个空方法,才能使用该标记。
--通知定义,@Around,@Before,
@After,@AfterReturning,
@AfterThrowing,在方法前使用
2.利用Spring整合JDBC和Hibernate
1)Spring框架对数据库访问技术提供了以下支持
a.提供了一致的异常处理层次.提供了一套异常类型,例如DataAccessException b.提供了编写DAO的一套工具类,主要有DaoSupport和Template两种封装类型。
JDBC技术:JdbcDaoSupport,JdbcTemplate
Hibernate技术:HibernateDaoSupport,
HibernateTemplate
c.提供了事务管理的支持。只需要添加AOP配置即可。
2)Spring和Jdbc技术的整合
--新建工程,引入jar包(spring开发包,ojdbc.jar,dbcp开发包)
--在src下添加applicationContext.xml
--针对COST表编写实体类
--编写CostDAO接口,定义要实现的方法
--编写JdbcCostDAO实现类
(继承JdbcDaoSupport,在方法体中使用JdbcTemplate类完成增删改查操作)
update:用于增、删、改操作
queryForObject:用于查询一条记录
query:用于查询多条记录
queryForInt:用于查询一个数值的
--将JdbcCostDAO在Spring容器中定义
--追加一个连接池,在Spring容器中定义一个dataSource组件对象Bean,
并将该Bean组件对象给JdbcCostDAO注入。
(JdbcDaoSupport里有一个setDataSource方法,
接收容器注入的DataSource对象,
利用DataSource对象实例化JdbcTemplate)
3)Spring和Hibernate技术的整合
--创建工程,引入开发包(spring开发包,ojdbc.jar,dbcp连接池,hibernate框架开发包)
--在src下添加applicationContext.xml
--针对数据表添加实体类和映射描述文件
(Cost类,Cost.hbm.xml)
--编写CostDAO接口
--编写实现类HibernateCostDAO
(继承HibernateDaoSupport,采用HibernateTemplate的方法完成增删改查)
save():添加
update():更新
delete():删除
load(),get():按主键查询
find():执行HQL语句
--在Spring容器配置HibernateCostDAO
需要事先定义DataSource,SessionFactory
组件对象,按DataSource-注入->
SessionFactory-注入->
HibernateCostDAO顺序建立关联
提示:如果需要在DAO中使用Session,
可以采用DaoSupport的getSession()获取,
也可以通过HibernateTemplate.execute方法以回调方式使用。
(参考spring_03_2中HibernateCostDAO.java的useSession()方法)
=====================
第四天
================
1.Spring框架整合Struts2步骤
a.创建工程,引入开发包Struts开发包,Spring开发包
b.添加Struts控制器配置和struts.xml配置文件
*c.引入struts2-spring-plugin.jar整合包
然后将<action>配置的class指定为Spring容器中Action组件定义的id值。
(plugin.jar整合包提供一个StrutsSpringObjectFactory,采用该组件获取Action对象。
该组件可以访问Spring容器,获取容器中定义的Bean对象)
*d.在web.xml中添ContextLoaderListener组件,用于在启动服务器时实例化Spring容器
2.struts-spring-plugin.jar作用
该plugin.jar提供了一个StrutsSpringObjectFactory类,当引入该jar后,Struts2会采用该组件获取Action对象
ObjectFactory在获取Action对象时,有以下两种途径:
a.利用<action>元素的class属性值去Spring容器中寻找Bean对象,寻找规则是id=class值
参考(ssh2-2.jpg结构图)
b.如果利用<action>的class属性值去Spring容器获取不到Bean对象,
ObjectFactory会利用反射机制创建一个Action对象,
然后访问Spring容器,
将容器中id名与Action属性一致的Bean对象注入给Action。
参考(ssh2-1.jpg结构图)
try{
// 第一种利用class值去Spring获取Bean对象
}catch(){
// 第二种自己创建一个Action,之后将Spring中的Bean对象给Action属性注入。
//注入规则是属性名=id值
}
3.SSH学习建议
XML和注解配置,XML配置方式了解,学会使用注解配置形式。Struts2+Spring整合,建议采用ssh2-1.jpg结构整合。
掌握:ssh2-1.jpg采用注解方法整合应用。
(参考spring_04_4的demo2案例)
======================
第五天
===================
*1.重构netctoss系统的资费管理模块处理
1)重构资费列表显示功能a.梳理处理流程
/cost/list.action-->ListCostAction
-->CostDAO.findAll/getTotalPages
-->cost_list.jsp
b.重构CostDAO的findAll/getTotalPages
(参考原来总结过的Spring+Hibernate步骤)
c.测试Spring容器中的DAO
d.改造ListCostAction
--引入struts-spring-plugin.jar
--将Spring容器中的DAO给Action注入
e.在web.xml中添加ContextLoaderListener配置,启动服务器时实例化Spring容器对象。
2)重构资费修改操作
a.梳理处理流程
/cost/detail.action-->DetailCostAction
-->CostDAO.findById-->cost_detail.jsp
b.重构CostDAO.findById方法
由于前面重构已经将CostDAO交给Spring容器管理,因此只要将findById实现就可以了
c.重构DetailCostAction
--将Spring容器中的DAO给Action注入
d.测试功能
*3)Spring对Hibernate延迟加载操作的支持
为了支持Hibernate延迟加载操作,
Spring提供了一个Filter组件,
该组件为OpenSessionInViewFilter。
可以在web.xml中定义该Filter。
这样可以将Template方法关闭Session时机推迟到JSP解析之后。
注意:定义在StrutsFilter之前才有效
*2.Spring的事务管理
Spring提供了以下两种事务管理方法*a.声明式事务管理
以AOP配置的形式实现事务管理
JDBC事务管理的方面组件:
(DataSourceTransactionManager)
Hibernate事务管理的方面组件:
(HibernateTransactionManager)
事务管理通知:<tx:advice>
切入点:根据实际情况编写表达式
-----如果采用注解方式配置事务------
首先在applicationContext中开启事务注解
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory"
ref="sessionFactory">
</property>
</bean>
<tx:annotation-driven
transaction-manager="txManager"/>
然后在目标组件中,使用@Transactional.
该标记可用在类定义和方法定前。类定义前指定全局,方法定以前指定当前方法。
b.编程式事务管理(简单了解)
在业务组件中添加事务管理代码.
代码中使用TransactionTemplate控制事务
3.Spring MVC框架
1)了解Spring MVC主要实现Spring提供的MVC框架主要有以下实现组件:
控制器DispatcherServlet,Controller
映射处理器HandlerMapping
视图解析器ViewResolver
模型和视图ModelAndView
2)了解Spring MVC的处理流程
a.客户端发送请求,请求交给DispatcherServlet控制器
b.DispatcherServlet控制器调用HandlerMapping映射器组件,
根据请求找到对应的Controller组件
(HandlerMapping组件负责维护请求和Controller组件的对应关系)
c.控制器调用请求对应的Controller处理请求,也可以调用DAO实现对数据库的操作
d.Controller处理完毕后,会返回一个ModelAndView对象。
(ModelAndView负责封装响应数据和视图名)
e.控制器会调用ViewResolver组件,
根据ModelAndView信息,
定位到指定的JSP,生成响应的HTML结果
f.将响应结果输出,为客户浏览器显示
3)入门示例
--基于XML配置的示例
a.引入spring ioc和springmvc开发包
b.在src下添加applicationContext.xml
c.在web.xml中添加DispatcherServlet配置,
指定classpath:applicationContext.xml
d.编写Controller组件,实现Controller接口,
实现handleRequest方法。
e.在Spring配置文件中定义Controller组件,
定义handlerMapping和viewResolver组件
--基于注解配置的示例(推荐)
a.引入spring ioc和springmvc开发包
b.在src下添加applicationContext.xml
c.在web.xml中添加DispatcherServlet配置,
指定classpath:applicationContext.xml
d.在applicationContext.xml中定义
AnnotationMethodHandlerAdapter(支持注解的handlerMapping组件)和viewResolver组件。
开启组件扫描配置。
e.编写Action组件。
Action类定义前使用@Controller将Action扫描到容器。
业务方法前使用@RequestMapping,指定该方法处理哪个请求
相关文章推荐
- Spring AOP 学习的好例子 仔细理解一定能学会的!
- 【SpringBoot】2小时学会SpringBoot学习笔记( 第6章 事务管理 )
- Spring学习8- SSH需要的jar包
- 不再需要词典了,现在,AI通过无监督学习学会了双语翻译
- Spring学习8- SSH需要的jar…
- 菜鸟学习Spring——60s学会Spring与Hibernate的集成
- 【Spring学习笔记-0】Spring开发所需要的核心jar包
- 学习ASO优化,你需要学会的那些工具
- 你绝对需要的Spring学习笔记(整合部分SSH)
- Spring学习8- SSH需要的jar包
- 【spring源码学习】spring的aop目标对象中进行自我调用,且需要实施相应的事务定义的解决方案
- 2小时学会Spring Boot 学习笔记
- 2小时学会Spring Boot 学习笔记
- mook学习spring(2小时学会spring boot)收获
- 菜鸟学习Spring——60s学会Spring与Hibernate的集成
- 菜鸟学习Spring——60s学会Spring与Hibernate的集成
- Spring实例学习第一步,创建数据库(附Spring3.0.5完整压缩包下载地址以及Spring3.0开发所需要的jar包)
- 菜鸟学习Spring——60s学会Spring与Hibernate的集成
- Spring 注解学习(二) 控制层梳理
- Spring学习之AOP