在用SSH开发项目的过程中,对于spring初始化bean这块:
显然,初始化的bean有三类:DAO、Service、Action。DAO和Service都是无状态的bean,多线程访问的时候不会出问题;而Action是有状态的。所谓有状态的bean,是bean中含有一些成员变量,按照我的理解,就是可以区分对象与对象。对于有成员变量的bean,在多个用户的访问中,可能会出现问题。具体可以见
http://blog.youkuaiyun.com/anyoneking/archive/2010/01/12/5182164.aspx
例:
DAO
package com.ultratech.omis.fa.dao;
import java.util.Date;
import java.util.List;
import org.hibernate.LockMode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.ultratech.base.framework.BaseDAO;
import com.ultratech.omis.fa.bo.FaMaintain;
/**
* A data access object (DAO) providing persistence and search support for
* FaMaintain entities. Transaction control of the save(), update() and delete()
* operations can directly support Spring container-managed transactions or they
* can be augmented to handle user-managed Spring transactions. Each of these
* methods provides additional information for how to configure it for the
* desired type of transaction control.
*
* @see com.ultratech.omis.fa.bo.FaMaintain
* @author MyEclipse Persistence Tools
*/
public class FaMaintainDAO extends BaseDAO {
private static final Logger log = LoggerFactory
.getLogger(FaMaintainDAO.class);
// property constants
public static final String EQUIP_ID = "equipId";
public static final String STATUS = "status";
public static final String CREATE_USER_ID = "createUserId";
public static final String CREATE_DEPT_ID = "createDeptId";
public static final String PRIORITY = "priority";
public static final String REPLACE = "replace";
public static final String MAINTAIN_DEPT_ID = "maintainDeptId";
public static final String MAINTAIN_USER_ID = "maintainUserId";
public static final String MEMO = "memo";
protected void initDao() {
// do nothing
}
public void save(FaMaintain transientInstance) {
log.debug("saving FaMaintain instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
public void delete(FaMaintain persistentInstance) {
log.debug("deleting FaMaintain instance");
try {
getHibernateTemplate().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
public FaMaintain findById(java.lang.Long id) {
log.debug("getting FaMaintain instance with id: " + id);
try {
FaMaintain instance = (FaMaintain) getHibernateTemplate().get(
"com.ultratech.omis.fa.bo.FaMaintain", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
public List findByExample(FaMaintain instance) {
log.debug("finding FaMaintain instance by example");
try {
List results = getHibernateTemplate().findByExample(instance);
log.debug("find by example successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}
public List findByProperty(String propertyName, Object value) {
log.debug("finding FaMaintain instance with property: " + propertyName
+ ", value: " + value);
try {
String queryString = "from FaMaintain as model where model."
+ propertyName + "= ?";
return getHibernateTemplate().find(queryString, value);
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
}
public List findByEquipId(Object equipId) {
return findByProperty(EQUIP_ID, equipId);
}
public List findByStatus(Object status) {
return findByProperty(STATUS, status);
}
public List findByCreateUserId(Object createUserId) {
return findByProperty(CREATE_USER_ID, createUserId);
}
public List findByCreateDeptId(Object createDeptId) {
return findByProperty(CREATE_DEPT_ID, createDeptId);
}
public List findByPriority(Object priority) {
return findByProperty(PRIORITY, priority);
}
public List findByReplace(Object replace) {
return findByProperty(REPLACE, replace);
}
public List findByMaintainDeptId(Object maintainDeptId) {
return findByProperty(MAINTAIN_DEPT_ID, maintainDeptId);
}
public List findByMaintainUserId(Object maintainUserId) {
return findByProperty(MAINTAIN_USER_ID, maintainUserId);
}
public List findByMemo(Object memo) {
return findByProperty(MEMO, memo);
}
public List findAll() {
log.debug("finding all FaMaintain instances");
try {
String queryString = "from FaMaintain";
return getHibernateTemplate().find(queryString);
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}
public FaMaintain merge(FaMaintain detachedInstance) {
log.debug("merging FaMaintain instance");
try {
FaMaintain result = (FaMaintain) getHibernateTemplate().merge(
detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
}
public void attachDirty(FaMaintain instance) {
log.debug("attaching dirty FaMaintain instance");
try {
getHibernateTemplate().saveOrUpdate(instance);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
public void attachClean(FaMaintain instance) {
log.debug("attaching clean FaMaintain instance");
try {
getHibernateTemplate().lock(instance, LockMode.NONE);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
public static FaMaintainDAO getFromApplicationContext(ApplicationContext ctx) {
return (FaMaintainDAO) ctx.getBean("FaMaintainDAO");
}
}
Service
package com.ultratech.omis.fa.service;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import com.ultratech.base.framework.BaseService;
import com.ultratech.base.framework.DetachedCriteriaBuilder;
import com.ultratech.base.framework.PageMeta;
import com.ultratech.base.framework.ServiceException;
import com.ultratech.omis.fa.bo.FaMaintain;
import com.ultratech.omis.fa.bo.FaMaterialIn;
import com.ultratech.omis.fa.dao.FaMaintainDAO;
public class MaintainService extends BaseService{
public FaMaintainDAO maintainDAO;
public void saveMaintain(FaMaintain instance)throws ServiceException{
maintainDAO.attachDirty(instance);
}
public void deleteMMaintain(FaMaintain instance) throws ServiceException {
maintainDAO.delete(instance);
}
public void deleteMaintainById(Long maintainIds[]) throws ServiceException{
FaMaintain instance = new FaMaintain();
DetachedCriteria criteria = DetachedCriteriaBuilder.build(instance);
criteria.add(Restrictions.in("maintainId", maintainIds));
maintainDAO.getHibernateTemplate().deleteAll(maintainDAO.findByCriteria(criteria));
}
public FaMaintain findMaintainById(Long maintainId)throws ServiceException{
return maintainDAO.findById(maintainId);
}
public List<FaMaintain> findMaintain(FaMaintain instance, PageMeta page) throws ServiceException{
DetachedCriteria criteria = DetachedCriteriaBuilder.build(instance);
return this.findByPage(maintainDAO, criteria, page);
}
public List<FaMaintain> findMaintain(DetachedCriteria criteria, PageMeta page) throws ServiceException {
criteria.addOrder(Order.asc("maintainId"));
return this.findByPage(maintainDAO, criteria, page);
}
public int getCount(DetachedCriteria criteria) throws ServiceException{
return maintainDAO.findTotalByCriteria(criteria);
}
public FaMaintainDAO getMaintainDAO(){
return maintainDAO;
}
public void setMaintainDAO(FaMaintainDAO maintainDAO){
this.maintainDAO = maintainDAO;
}
}
Action
package com.ultratech.omis.fa.web;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.struts2.ServletActionContext;
import com.ultratech.base.framework.BaseAction;
import com.ultratech.base.framework.DetachedCriteriaBuilder;
import com.ultratech.base.framework.ServiceException;
import com.ultratech.base.util.BeanTools;
import com.ultratech.base.util.Constants;
import com.ultratech.base.util.StringTools;
import com.ultratech.omis.fa.bo.FaEquipment;
import com.ultratech.omis.fa.bo.FaMaintain;
import com.ultratech.omis.fa.bo.FaMaintainLog;
import com.ultratech.omis.fa.service.EquipmentService;
import com.ultratech.omis.fa.service.MaintainLogService;
import com.ultratech.omis.fa.service.MaintainService;
import com.ultratech.omis.fnd.bo.FndUser;
import com.ultratech.omis.fnd.web.UserUtil;
//基本表中的维修人必填!!
public class MaintainEditAction extends BaseAction{
private String maintainId;
private String equipId;
private String status;//
private String createUserId;
private String createDeptId;
private String createDate;
private String priority;///
private String replace;///
private String maintainDeptId;//从基本表信息取
private String maintainUserId;
private String fixDate;//不填
private String fixMethod;//不填
private String memo;
private FaEquipment faEquipment;
private List<FaMaintainLog> maintainLogList;
private MaintainService maintainService;
private EquipmentService equipmentService;
private MaintainLogService maintainLogService;
public MaintainEditAction(MaintainService maintainService, EquipmentService equipmentService, MaintainLogService maintainLogService){
this.maintainService = maintainService;
this.equipmentService = equipmentService;
this.maintainLogService = maintainLogService;
}
public void prepare() throws Exception {
clearErrorsAndMessages();
}
public String save(){
FndUser user = this.getUser();
//保存维修记录及日志,更改基本表
FaMaintain instance = new FaMaintain();
FaMaintainLog log = new FaMaintainLog();
BeanTools.copyProperties(instance, this);//equipId
try {
FaEquipment old = equipmentService.FindEquipmentById(StringTools.parseLong(equipId));
old.setHealthStatus("01");//损坏
instance.setStatus("00");//报修
instance.setCreateDate(new Date());
instance.setCreateDeptId(user.getDeptId());
instance.setCreateUserId(user.getUserId());
instance.setMaintainDeptId(old.getMaintainDeptId());
instance.setMaintainUserId(old.getMaintainUserId());
instance.setFaEquipment(old);
maintainService.saveMaintain(instance); //维修表
log.setMaintainId(instance.getMaintainId());
log.setCreateDeptId(user.getDeptId());
log.setCreateUserId(user.getUserId());
log.setCreateDate(new Date());
log.setMemo(memo);
maintainLogService.saveMaintainLog(log);//报修日志
equipmentService.saveEquipment(old); //基本表
return SUCCESS;
} catch (ServiceException ex) {
ex.printStackTrace();
this.addActionError(ex.getMessage());
return INPUT;
}
}
public boolean isModified() {
try {
FaMaintain old = maintainService.findMaintainById(StringTools.parseLong(maintainId));
if(old != null) {
if(
((old.getFixMethod() != null) && old.getFixMethod().equals(fixMethod))
&& ((old.getMaintainDeptId() == null && (maintainDeptId == null || maintainDeptId.equals(""))) || (old.getMaintainDeptId() != null && old.getMaintainDeptId().toString().equals(maintainDeptId)))
&& ((old.getMaintainUserId() == null && (maintainUserId == null || maintainUserId.equals(""))) || (old.getMaintainUserId() != null && old.getMaintainUserId().toString().equals(maintainUserId)))
&& ((old.getStatus() == null && (status == null || status.equals(""))) || (old.getStatus() != null && old.getStatus().toString().equals(status)))
&& old.getMemo().equals(memo)
) {
return false;
} else
return true;
}
else
return false;
}catch(ServiceException ex) {
ex.printStackTrace();
return false;
}
}
public String saveAssigned() {
try {
FaMaintain old = maintainService.findMaintainById(StringTools.parseLong(maintainId));
//判断改没有,改了就产生新日志
if(this.isModified()) {
FaMaintainLog log = new FaMaintainLog();
old.setMaintainDeptId(StringTools.parseLong(maintainDeptId));
old.setMaintainUserId(StringTools.parseLong(maintainUserId));
//old.setStatus("11");//维修中
FaEquipment t = equipmentService.FindEquipmentById(old.getEquipId());
t.setMaintainDeptId(StringTools.parseLong(maintainDeptId));
t.setMaintainUserId(StringTools.parseLong(maintainUserId));
old.setStatus(status);
if(status.equals("90")) { //已修复
log.setMemo(memo+"。设备已修好!");
old.setFixDate(new Date());
t.setHealthStatus("00");//正常
}
else {
log.setMemo(memo);
}
equipmentService.saveEquipment(t);
old.setFixMethod(fixMethod);
old.setMemo(memo);
maintainService.saveMaintain(old);
log.setCreateDate(new Date());
log.setMaintainId(StringTools.parseLong(maintainId));
log.setCreateDeptId(StringTools.parseLong(maintainDeptId));
log.setCreateUserId(StringTools.parseLong(maintainUserId));
maintainLogService.saveMaintainLog(log);
}
return SUCCESS;
} catch (ServiceException ex) {
ex.printStackTrace();
this.addActionError(ex.getMessage());
return INPUT;
}
}
public String info(){
try {
FaMaintain instance;
instance = maintainService.findMaintainById(StringTools.parseLong(maintainId));
BeanTools.copyProperties(this, instance);
this.faEquipment = equipmentService.FindEquipmentById(instance.getEquipId());
createDate = StringTools.formatDate(instance.getCreateDate());
fixDate = StringTools.formatDate(instance.getFixDate());
//找出相关日志
FaMaintainLog log = new FaMaintainLog();
log.setMaintainId(StringTools.parseLong(maintainId));
maintainLogList = maintainLogService.findMaintainLog(log, null);
return SUCCESS;
} catch (ServiceException e) {
e.printStackTrace();
return ERROR;
}
}
public String delete(){
String[] values = ServletActionContext.getRequest().getParameterValues("maintainId");
Long[] MaintainIds = (Long[]) ConvertUtils.convert(values, Long.class);
try {
maintainService.deleteMaintainById(MaintainIds);
return SUCCESS;
} catch (ServiceException e) {
e.printStackTrace();
return ERROR;
}
}
public String assign() {
String[] values = ServletActionContext.getRequest().getParameterValues("maintainId");
Long[] maintainIds = (Long[]) ConvertUtils.convert(values, Long.class);
try {
for(int i = 0; i < maintainIds.length; i++) {
FaMaintainLog log = new FaMaintainLog();
FaMaintain faMaintain = maintainService.findMaintainById(maintainIds[i]);
log.setMaintainId(faMaintain.getMaintainId());
log.setCreateDate(new Date());
log.setCreateDeptId(faMaintain.getCreateDeptId());
log.setCreateUserId(faMaintain.getCreateUserId());
log.setMemo("下达任务");
maintainLogService.saveMaintainLog(log);
faMaintain.setStatus("11");
maintainService.saveMaintain(faMaintain);
}
return SUCCESS;
} catch(ServiceException e) {
e.printStackTrace();
return ERROR;
}
}
public FndUser getUser() {
HttpSession session = ServletActionContext.getRequest().getSession();
return (FndUser)session.getAttribute(Constants.SESSION_USER);
}
public String execute() {
try {
this.faEquipment = equipmentService.FindEquipmentById(StringTools.parseLong(equipId));
return SUCCESS;
} catch (ServiceException e) {
e.printStackTrace();
return ERROR;
}
}
public String getMaintainId() {
return maintainId;
}
public void setMaintainId(String maintainId) {
this.maintainId = maintainId;
}
public String getEquipId() {
return equipId;
}
public void setEquipId(String equipId) {
this.equipId = equipId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getCreateUserId() {
return createUserId;
}
public void setCreateUserId(String createUserId) {
this.createUserId = createUserId;
}
public String getCreateDeptId() {
return createDeptId;
}
public void setCreateDeptId(String createDeptId) {
this.createDeptId = createDeptId;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
public String getPriority() {
return priority;
}
public void setPriority(String priority) {
this.priority = priority;
}
public String getReplace() {
return replace;
}
public void setReplace(String replace) {
this.replace = replace;
}
public String getMaintainDeptId() {
return maintainDeptId;
}
public void setMaintainDeptId(String maintainDeptId) {
this.maintainDeptId = maintainDeptId;
}
public String getMaintainUserId() {
return maintainUserId;
}
public void setMaintainUserId(String maintainUserId) {
this.maintainUserId = maintainUserId;
}
public String getFixDate() {
return fixDate;
}
public void setFixDate(String fixDate) {
this.fixDate = fixDate;
}
public String getFixMethod() {
return fixMethod;
}
public void setFixMethod(String fixMethod) {
this.fixMethod = fixMethod;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
public FaEquipment getFaEquipment() {
return faEquipment;
}
public void setFaEquipment(FaEquipment faEquipment) {
this.faEquipment = faEquipment;
}
public List<FaMaintainLog> getMaintainLogList() {
return maintainLogList;
}
public void setMaintainLogList(List<FaMaintainLog> maintainLogList) {
this.maintainLogList = maintainLogList;
}
}
在spring的配置文件中,初始化这些bean:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><!-- Spring与Hibernate集成的桥梁 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml">
</property>
</bean>
<bean id="FaMaterialDAO" class="com.ultratech.omis.fa.dao.FaMaterialDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="MaintainService" class="com.ultratech.omis.fa.service.MaintainService">
<property name="maintainDAO" ref="FaMaintainDAO" />
</bean>
<bean id="MaintainEditAction" class="com.ultratech.omis.fa.web.MaintainEditAction" scope="prototype">
<constructor-arg ref="MaintainService" />
<constructor-arg ref="EquipmentService"/>
<constructor-arg ref="MaintainLogService"/>
</bean>
scope="prototype"(多态)是在每次用户发起请求时重新生成action对象,对于多线程访问不会出现问题,如果没有配置scope=prototype则添加的时候不会新建一个action,他任然会保留上次访问的过记录的信息。
默认是scope="singleton"(单态),这些bean被spring初始化后,始终只有一份,很适用于无状态的bean,DAO、Service都采用的这种。当然,scope的值还有session,request等等。