# 【第十二章】零配置 之 12.5 综合示例-积分商城 ——跟我学spring3
## 12.5 综合示例
### 12.5.1 概述
在第十一章中我们介绍了SSH集成,在进行SSH集成时都是通过基于XML配置文件配置每层的Bean,从而产生许多XML配置文件,本节将通过注解方式消除部分XML配置文件,实现所谓的零配置。
### 12.5.2 项目拷贝
1、拷贝【第十一章 SSH集成开发】中的“pointShop”项目将其命名为“pointShop2”;
2、修改“pointShop2”项目下的“.settings”文件夹下的“org.eclipse.wst.common.component”文件,将“**<property name="context-root" value="pointShop"/>**”修改为“**<property name="context-root" value="pointShop2"/>**”,即该web项目的上下文为“pointShop2”,在浏览器中可以通过http://localhost:8080/pointShop2来访问该web项目。
### 12.5.3 数据访问层变化
将dao层配置文件中的dao实现Bean定义删除,通过在dao实现类头上添加“@Repository”来定义dao实现Bean,并通过注解@Autowired来完成依赖注入。
1、删除DAO层配置文件(cn/javass/point/dao/applicationContext-hibernate.xml)中的如下配置:
```
<bean id="abstractDao" abstract="true" init-method="init">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="goodsDao" class="cn.javass.point.dao.hibernate.GoodsHibernateDao"
parent="abstractDao"/>
<bean id="goodsCodeDao" class="cn.javass.point.dao.hibernate.GoodsCodeHibernateDao"
parent="abstractDao"/>
```
2、修改通用DAO实现cn.javass.commons.dao.hibernate.BaseHibernateDao,通过注解实现依赖注入和指定初始化方法:
```
public abstract class BaseHibernateDao<M extends Serializable, PK extends Serializable> extends HibernateDaoSupport implements IBaseDao<M, PK>, InitializingBean {
//省略类字段
@Autowired @Required
public void setSf(SessionFactory sf) {
setSessionFactory(sf);
}
@PostConstruct
@SuppressWarnings("unchecked")
public void init() {
//省略具体实现代码
}
}
```
* setSf方法:通过@Autowired注解自动注入SessionFactory实现;
* init方法:通过@PostConstruct注解表示该方法是初始化方法;
3、修改cn.javass.point.dao.hibernate.GoodsHibernateDao,在该类上添加@Repository注解来进行DAO层Bean定义:
```
@Repository
public class GoodsHibernateDao extends BaseHibernateDao<GoodsModel, Integer> implements IGoodsDao {
……
}
```
4、修改cn.javass.point.dao.hibernate.GoodsCodeHibernateDao,在该类上添加@Repository注解来进行DAO层Bean定义:
```
@Repository
public class GoodsCodeHibernateDao extends BaseHibernateDao<GoodsCodeModel, Integer> implements IGoodsCodeDao {
……
}
```
DAO层到此就修改完毕,其他地方无需修改。
### 12.5.4 业务逻辑层变化
将service层配置文件中的service实现Bean定义删除,通过在service实现类头上添加“@Service”来定义service实现Bean,并通过注解@Autowired来完成依赖注入。
1、删除Service层配置文件(cn/javass/point/service/applicationContext-service.xml)中的如下配置:
```
<bean id="goodsService" class="cn.javass.point.service.impl.GoodsServiceImpl">
<property name="dao" ref="goodsDao"/>
</bean>
<bean id="goodsCodeService" class="cn.javass.point.service.impl.GoodsCodeServiceImpl">
<property name="dao" ref="goodsCodeDao"/>
<property name="goodsService" ref="goodsService"/>
</bean>
```
2、修改cn.javass.point.service.impl.GoodsServiceImpl,在该类上添加@Service注解来进行Service层Bean定义:
```
@Service
public class GoodsServiceImpl extends BaseServiceImpl<GoodsModel, Integer> implements IGoodsService {
@Autowired @Required
public void setGoodsDao(IGoodsDao dao) {
setDao(dao);
}
}
```
* **setGoodsDao方法:**用于注入IGoodsDao实现,此处直接委托给setDao方法。
3、修改cn.javass.point.service.impl.GoodsCodeServiceImpl,在该类上添加@Service注解来进行Service层Bean定义:
```
@Service
public class GoodsCodeServiceImpl extends BaseServiceImpl<GoodsCodeModel, Integer> implements IGoodsCodeService {
@Autowired @Required
public void setGoodsCodeDao(IGoodsCodeDao dao) {
setDao(dao);
}
@Autowired @Required
public void setGoodsService(IGoodsService goodsService) {
this.goodsService = goodsService;
}
}
```
* **setGoodsCodeDao方法:**用于注入IGoodsCodeDao实现,此处直接委托给setDao方法;
* **setGoodsService方法:**用于注入IGoodsService实现。
Service层到此就修改完毕,其他地方无需修改。
### 12.5.5 表现层变化
类似于数据访问层和业务逻辑层修改,对于表现层配置文件直接删除,通过在action实现类头上添加“@Controller”来定义action实现Bean,并通过注解@Autowired来完成依赖注入。
1、 删除表现层所有Spring配置文件(cn/javass/point/web):
```
cn/javass/point/web/pointShop-admin-servlet.xml
cn/javass/point/web/pointShop-front-servlet.xml
```
2、修改表现层管理模块的cn.javass.point.web.admin.action.GoodsAction,在该类上添加@Controller注解来进行表现层Bean定义,且作用域为“prototype”:
```
@Controller("/admin/goodsAction")
@Scope("prototype")
public class GoodsAction extends BaseAction {
private IGoodsService goodsService;
@Autowired @Required
public void setGoodsService(IGoodsService goodsService) {
this.goodsService = goodsService;
}
}
```
* **setGoodsService方法:**用于注入IGoodsService实现。
3、修改表现层管理模块的cn.javass.point.web.admin.action.GoodsCodeAction,在该类上添加@Controller注解来进行表现层Bean定义,且作用域为“prototype”:
```
@Controller("/admin/goodsCodeAction")
@Scope("prototype")
public class GoodsCodeAction extends BaseAction {
@Autowired @Required
public void setGoodsCodeService(IGoodsCodeService goodsCodeService) {
this.goodsCodeService = goodsCodeService;
}
@Autowired @Required
public void setGoodsService(IGoodsService goodsService) {
this.goodsService = goodsService;
}
}
```
* **setGoodsCodeService方法:**用于注入IGoodsCodeService实现;
* **setGoodsService方法:**用于注入IGoodsService实现。
3、修改表现层前台模块的cn.javass.point.web.front.action.GoodsAction,在该类上添加@Controller注解来进行表现层Bean定义,且作用域为“prototype”:
```
@Controller("/front/goodsAction")
@Scope("prototype")
public class GoodsAction extends BaseAction {
@Autowired @Required
public void setGoodsService(IGoodsService goodsService) {
this.goodsService = goodsService;
}
@Autowired @Required
public void setGoodsCodeService(IGoodsCodeService goodsCodeService) {
this.goodsCodeService = goodsCodeService;
}
}
```
* **setGoodsCodeService方法:**用于注入IGoodsCodeService实现;
* **setGoodsService方法:**用于注入IGoodsService实现。
### 12.5.6 其他变化
1、定义一个基于Java方法的配置类,用于加载XML配置文件:
```
package cn.javass.point;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource(
{"classpath:applicationContext-resources.xml",
"classpath:cn/javass/point/dao/applicationContext-hibernate.xml",
"classpath:cn/javass/point/service/applicationContext-service.xml"
})
public class AppConfig {
}
```
该类用于加载零配置中一般不变的XML配置文件,如事务管理,数据源、SessionFactory,这些在几乎所有项目中都是类似的,因此可以作为通用配置。
2、修改集成其它Web框架的通用配置,将如下配置:
```
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext-resources.xml,
classpath:cn/javass/point/dao/applicationContext-hibernate.xml,
classpath:cn/javass/point/service/applicationContext-service.xml,
classpath:cn/javass/point/web/pointShop-admin-servlet.xml,
classpath:cn/javass/point/web/pointShop-front-servlet.xml
</param-value>
</context-param>
```
修改为如下配置:
```
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>cn.javass.point</param-value>
</context-param>
```
* **contextClass:**使用notationConfigWebApplicationContext替换默认的XmlWebApplicationContext;
* **contextConfigLocation:**指定为“cn.javass.point”,表示将通过扫描该类路径“cn.javass.point”下的注解类来进行加载Bean定义。
启动pointShop2项目,在浏览器输入http://localhost:8080/pointShop2/admin/goods/list.action访问积分商城后台,如果没问题说明零配置整合成功。
到此零配置方式实现SSH集成已经整合完毕,相对于基于XML方式主要减少了配置的数量和配置文件的数量。
原创内容,转载请注明私塾在线【[http://sishuok.com/forum/blogPost/list/2553.html](http://sishuok.com/forum/blogPost/list/2553.html#7328)】
- 跟我学 Spring3
- 【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3
- 【第二章】 IoC 之 2.2 IoC 容器基本原理 ——跟我学Spring3
- 【第二章】 IoC 之 2.3 IoC的配置使用——跟我学Spring3
- 【第三章】 DI 之 3.1 DI的配置使用 ——跟我学spring3
- 【第三章】 DI 之 3.2 循环依赖 ——跟我学spring3
- 【第三章】 DI 之 3.3 更多DI的知识 ——跟我学spring3
- 【第三章】 DI 之 3.4 Bean的作用域 ——跟我学spring3
- 【第四章】 资源 之 4.1 基础知识 ——跟我学spring3
- 【第四章】 资源 之 4.2 内置Resource实现 ——跟我学spring3
- 【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
- 【第四章】 资源 之 4.4 Resource通配符路径 ——跟我学spring3
- 【第五章】Spring表达式语言 之 5.1 概述 5.2 SpEL基础 ——跟我学spring3
- 【第五章】Spring表达式语言 之 5.3 SpEL语法 ——跟我学spring3
- 【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL—跟我学spring3
- 【第六章】 AOP 之 6.1 AOP基础 ——跟我学spring3
- 【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我学spring3
- 【第六章】 AOP 之 6.3 基于Schema的AOP ——跟我学spring3
- 【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我学spring3
- 【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3
- 【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3
- 【第六章】 AOP 之 6.7 通知顺序 ——跟我学spring3
- 【第六章】 AOP 之 6.8 切面实例化模型 ——跟我学spring3
- 【第六章】 AOP 之 6.9 代理机制 ——跟我学spring3
- 【第七章】 对JDBC的支持 之 7.1 概述 ——跟我学spring3
- 【第七章】 对JDBC的支持 之 7.2 JDBC模板类 ——跟我学spring3
- 【第七章】 对JDBC的支持 之 7.3 关系数据库操作对象化 ——跟我学spring3
- 【第七章】 对JDBC的支持 之 7.4 Spring提供的其它帮助 ——跟我学spring3【私塾在线原创】
- 【第七章】 对JDBC的支持 之 7.5 集成Spring JDBC及最佳实践 ——跟我学spring3
- 【第八章】 对ORM的支持 之 8.1 概述 ——跟我学spring3
- 【第八章】 对ORM的支持 之 8.2 集成Hibernate3 ——跟我学spring3
- 【第八章】 对ORM的支持 之 8.3 集成iBATIS ——跟我学spring3
- 【第八章】 对ORM的支持 之 8.4 集成JPA ——跟我学spring3
- 【第九章】 Spring的事务 之 9.1 数据库事务概述 ——跟我学spring3
- 【第九章】 Spring的事务 之 9.2 事务管理器 ——跟我学spring3
- 【第九章】 Spring的事务 之 9.3 编程式事务 ——跟我学spring3
- 【第九章】 Spring的事务 之 9.4 声明式事务 ——跟我学spring3
- 【第十章】集成其它Web框架 之 10.1 概述 ——跟我学spring3
- 【第十章】集成其它Web框架 之 10.2 集成Struts1.x ——跟我学spring3
- 【第十章】集成其它Web框架 之 10.3 集成Struts2.x ——跟我学spring3
- 【第十章】集成其它Web框架 之 10.4 集成JSF ——跟我学spring3
- 【第十一章】 SSH集成开发积分商城 之 11.1 概述 ——跟我学spring3
- 【第十一章】 SSH集成开发积分商城 之 11.2 实现通用层 ——跟我学spring3
- 【第十一章】 SSH集成开发积分商城 之 11.3 实现积分商城层 ——跟我学spring3
- 【第十二章】零配置 之 12.1 概述 ——跟我学spring3
- 【第十二章】零配置 之 12.2 注解实现Bean依赖注入 ——跟我学spring3
- 【第十二章】零配置 之 12.3 注解实现Bean定义 ——跟我学spring3
- 【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3
- 【第十二章】零配置 之 12.5 综合示例-积分商城 ——跟我学spring3
- 【第十三章】 测试 之 13.1 概述 13.2 单元测试 ——跟我学spring3
- 【第十三章】 测试 之 13.3 集成测试 ——跟我学spring3
- 跟我学 Spring MVC
- SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结
- Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列
- Spring3 Web MVC下的数据类型转换(第一篇)——《跟我学Spring3 Web MVC》抢先看
- Spring3 Web MVC下的数据格式化(第二篇)——《跟我学Spring3 Web MVC》抢先看
- 第一章 Web MVC简介 —— 跟开涛学SpringMVC
- 第二章 Spring MVC入门 —— 跟开涛学SpringMVC
- 第三章 DispatcherServlet详解 ——跟开涛学SpringMVC
- 第四章 Controller接口控制器详解(1)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(2)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(3)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解 (4)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(5)——跟着开涛学SpringMVC
- 跟着开涛学SpringMVC 第一章源代码下载
- 第二章 Spring MVC入门 源代码下载
- 第四章 Controller接口控制器详解 源代码下载
- 第四章 Controller接口控制器详解(6)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(7 完)——跟着开涛学SpringMVC
- 第五章 处理器拦截器详解——跟着开涛学SpringMVC
- 源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC
- 注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
- 源代码下载 第六章 注解式控制器详解
- SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解——跟着开涛学SpringMVC
- Spring MVC 3.1新特性 生产者、消费者请求限定 —— 第六章 注解式控制器详解——跟着开涛学SpringMVC
- SpringMVC强大的数据绑定(1)——第六章 注解式控制器详解——跟着开涛学SpringMVC
- SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
- SpringMVC数据类型转换——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
- SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
- SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC