先贴代码
  单例类:
   
     
/***
 * 文书号服务类(单例)
 * @author oyh
 *
 */
public class DocNumberSingleton{

private String docNumberType1;//文书类型1 ---号
private String docNumberType2;//文书类型2 ---号

private String docType;// 文书类型

@Resource
private IUtilDao iUtilDao; 


private static DocNumberSingleton instance = new DocNumberSingleton();
 
private DocNumberSingleton(){
}

/**
  * 获取实例
  * @return 唯一的instance
  */
public static DocNumberSingleton getInstance() {
/** 
 * 初始化值  不同文书类型的当前文书号的最大值Something 
 */
instance.setDocNumberType1("00001");
instance.setDocNumberType2("00001");

String hql = "from TDocNumber tn where tn.maxMark=0 and tn.isDele=0";
   try {
List<TDocNumber> objList = (List<TDocNumber>) instance.iUtilDao.getHqlQuery(hql);
if(objList!=null&&objList.size()>0){
for (TDocNumber tDocNumber : objList) {
if(tDocNumber.getDocType().getId()=="1"){
instance.setDocNumberType1(tDocNumber.getDocNumber());
}else if(tDocNumber.getDocType().getId()=="2"){
instance.setDocNumberType2(tDocNumber.getDocNumber());
} }
}
    } catch (Exception e) {
  e.printStackTrace();
    }
    return instance;
 } /***
 * 
 * 根据doc类型 返回一个当前需要的文书号
 * @param docType
 * @return
 * 
 */
public String getDocNumber(String docType){
/** 
 *  内容:
 *  1.先把当前的需要的文书号得到(是当前数据库值+1)
 *  2.在把当前类型的最大的文书号值+1
 *  
 *  */
try{
DDocType docTypeObj = (DDocType) this.iUtilDao.getObjectById(DDocType.class, docType);
String docNumber = "";
String num = "";
int tempNum = 0;
if(docType=="1"||"1".equals(docType)){
num = this.getDocNumberType1();
tempNum = Integer.parseInt(num);
tempNum = tempNum + 1;
docNumber = formatNumber(tempNum);
this.setDocNumberType1(docNumber);
}else if(docType=="2"||"2".equals(docType)){
num = this.getDocNumberType2();
tempNum = Integer.parseInt(num);
tempNum = tempNum + 1;
docNumber = formatNumber(tempNum);
this.setDocNumberType2(docNumber);
} String hql = "from TDocNumber tn where tn.docType.id='"+docType+"' tn.maxMark=0 and tn.isDele=0 ";
List<TDocNumber> objList = (List<TDocNumber>) instance.iUtilDao.getHqlQuery(hql);
if(objList!=null&&objList.size()>0){
TDocNumber obj = objList.get(0);
obj.setMaxMark(1);
this.iUtilDao.update(obj);
TDocNumber numObj = new TDocNumber();
numObj.setDocType(docTypeObj);
numObj.setIsDele(0);
numObj.setMaxMark(0);
numObj.setDocNumber(this.getDocNumberType1());
numObj.setVersion(Util.version);
this.iUtilDao.save(numObj);
}
return docNumber;
}catch (Exception e) {
  e.printStackTrace();
    }
return "";
}

/***
 * 将int文书号转化成格式文书号  如:   11--->000011
 * @return
 */
public String formatNumber(int num){
String docNumber = "";
if(num<10){
docNumber = "00000"+String.valueOf(num);
}else if(num<100){
docNumber = "0000"+String.valueOf(num);
}else if(num<1000){
docNumber = "000"+String.valueOf(num);
}else if(num<10000){
docNumber = "00"+String.valueOf(num);
}else if(num<100000){
docNumber = "0"+String.valueOf(num);
}else{
docNumber = String.valueOf(num);
}
return docNumber;
}


public String getDocNumberType1() {
return docNumberType1;
} public void setDocNumberType1(String docNumberType1) {

this.docNumberType1 = docNumberType1;
} public String getDocNumberType2() {
return docNumberType2;
} public void setDocNumberType2(String docNumberType2) {
this.docNumberType2 = docNumberType2;
}
public String getDocType() {
return docType;
} public void setDocType(String docType) {
this.docType = docType;
} public static void setInstance(DocNumberSingleton instance) {
DocNumberSingleton.instance = instance;
} public IUtilDao getiUtilDao() {
return iUtilDao;
} public void setiUtilDao(IUtilDao iUtilDao) {
this.iUtilDao = iUtilDao;
}
}
  因为是使用注解来注入的,但是,当我在Action层调用单例时,
  
     ServletActionContext.getResponse().setContentType("text/xml;charset=utf-8");
PrintWriter out = null;
out = ServletActionContext.getResponse().getWriter();
try{
DocNumberSingleton docObj = DocNumberSingleton.getInstance();
String num = docObj.getDocNumber(docType);
          out.write("1");
out.flush();
out.close();
}catch (Exception e) {
e.printStackTrace();
}
   当运行到单例类中的初始化  instance.iUtilDao.getHqlQuery(hql)时,  直接报instance.iUtilDao为null
  debug进去 ,instance已经实例化了,但是iUtilDao是为空的,
   很明显是Spring没有注入
    请问,有人做过类似的麽? 
 谢谢
   

解决方案 »

  1.   

    首先你要将spring的bean扫描开启 <context:component-scan base-package=" "/>
    既然你是Struts+spring,action中的单例模式可以用@Scope("prototype")来注解,同时也用注解将服务层的bean注入进来。
      

  2.   


       我已经开启过bean的扫描了。    action中的单例?没明白你的意思...
      我在Action中是之间调用单例的方法,
    单例类更改(粉色是新增加的):      @Scope("prototype")public class DocNumberSingleton{

    private String docNumberType1;//文书类型1 ---号
    private String docNumberType2;//文书类型2 ---号
    private String docNumberType3;//文书类型3 ---号
    private String docNumberType4;//文书类型4 ---号
    private String docNumberType5;//文书类型5 ---号
    private String docNumberType6;//文书类型6 ---号

    private String docType;// 文书类型


    @Resource
    private IUtilDao iUtilDao; 
             ....
               ....
    但是还是得不到UtilDao。。还是没注入进去
        
      

  3.   

      没人回答...
        我已经解决了。 把单例中需要注入Hibernate的 改为使用JDBC,
      但是,JDBC得不到一个对象,只能得到对象的值,我又搜索代码把值弄到对象中去。。
       解决了。
         结贴