抽象类不能实例化

1.抽象类不能实例化

最近在搭建SSH框架的时候,我在封层底层的DAO【BaseDao.java】层时,有个方法不能再BaseDao具体实现,为了防止后面的的人,继承该基本类的人,不会忽略重载该类,我便将其写成抽象类,因此,BaseDao类也必须为抽象类

@Repository
public  abstract class BaseDao<T, PK extends Serializable> extends HibernateDao {
/**
     *  获得实体的组合条件
     * @return
  */
 public abstract    Criterion[] criterionsArray(T entity);
 ...
}

  

然而我有写了一个基本的Service类【BaseService】,为了减少应用层,重复再应用层写增删改查的函数,我就干脆在BaseSerice将其实现:

@Service
@Transactional
public abstract class BaseService<T, PK extends Serializable> {

    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private BaseDao<T, Serializable> baseDao;

    public void create(T entity) {
        baseDao.create(entity);
    }

    public void delete(T entity) {
        baseDao.delete(entity);
    }

    public void update(T entity) {
        baseDao.update(entity);
    }

    public List<T> list(T entity){
        Assert.assertNotNull(entity);
        return baseDao.list(entity);
    }

    public T get(String id){
       return (T) baseDao.get(id);
    }
    ...
}

  问题来了,我在Junit测试框架中,应用层【UserSerivice extends BaseService】:测试结果

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.cqs.common.base.dao.BaseDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

自动装配错误。网上说因为各层没有写注解(就是action层添加@Action,service层添加@Service,@Transactional及dao层添加@Repository),我按此方法检查了所有的类,发现都写了【PS之前碰到过,有个service层的类没有写@service注解,的确抛了上述异常】.

为了缩小访问,我有在Junit中,写了一个BaseDao的测试,只做一件事,自动装配BaseDao

public class HibernateDaoTest extends BaseTestConfig{
    @Autowired
    private BaseDao baseDao;
    @Test
    public void testGetCurrentSession(){
        System.out.println("==");
    }
}

  

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext.xml"})
@Transactional
public class BaseTestConfig extends AbstractJUnit4SpringContextTests {
    protected static Logger logger = LoggerFactory.getLogger(BaseTestConfig.class);
}

  运行结果,抛出异常:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.cqs.common.base.dao.BaseDao] is defined: expected single matching bean but found 2: imageUploadDao,userDao

很好,这说明实例化了两个继承BaseDao的类,而BaseDao却不能实例化。所以原因就是在BaseService实例化的BaseDao,却BaseDao却是抽象类,而抽象类是不能实例化的!

下面就是修改BaseDao成普通类就行了

@Repository
public  class BaseDao<T, PK extends Serializable> extends HibernateDao {
/**
     *  获得实体的组合条件
     * @return
  */
 public Criterion[] criterionsArray(T entity){
      return null;
  };

....
}

但是问题就是,结构不如之前申明抽象类好了[后面继承BaseDao类,在没有提示的情况下,重载criterionsArray方法],但是,后面一种办法,可以避免写好些重复性质的代码。

时间: 2024-07-31 23:26:13

抽象类不能实例化的相关文章

抽象类不能实例化对象

抽象类无法实例化,无法创建对象.现实生活中也有抽象类的类子,比如说人类是一个抽象类,无法创建一个叫人类的对象,人继承人类来创建对象.况且抽象类中的抽象方法只有声明,没有主体,如果实例化了,又如何去实现调用呢? sleep和wait的区别有: 1,这两个方法来自不同的类分别是Thread和Object 2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得敏感词线程可以使用同步控制块或者方法. 3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而s

PHP中的特殊类,接口类和抽象类(都不能直接实例化)

接口类不用实例化,需要一一实现接口定义的所有方法.关键字interface implements 接口interface 是一个规定,给人继承用的东西,有点像抽象类在里面定义的方法,却不去实例化,而需要别的类去implements 它,而且必须一一实现接口定义的所有方法, 实际上接口类说白了,就是一个类的模板,一个类的规定, 举个例子interface Shop { public function buy($gid); public function sell($gid); public fun

抽象类与接口分析

抽象类: 定义:包含抽象方法的类称为抽象类. 语法:抽象类和抽象方法都必须用abstract声明 抽象类可声明但不可直接实例化,抽象类的实例化必须依靠子类继承来完成. 抽象类中可包含构造方法,但依靠子类调用. 代码示例: abstract class A{ public A(){ // 构造方法 System.out.println("*************************") ; } public abstract void fun() ; }; class B exte

接口与抽象类

首先声明,本文基本参考自 http://dev.yesky.com/436/7581936.shtml 加入从其他资料中获得的观点. 1从逻辑上说 抽象类描述了一系列"东西"的本质. 接口描述一系列"东西"应该具有的功能,或者说接口就是一组契约. 在oop的观点里,世界上任何实物都能在思想的角度给一个类与之配对,但反过来说,并不是思想中所有的类都能在现实世界里找到一个实物配对.(这里说的思想里的类 也是个逻辑概念 包括普通的类也包括抽象类 接口等等) 举个例子,我们

C#OOP之八 继承 接口和抽象类

继承 在现实生活中有所谓的"种瓜得瓜.种豆得豆"的说法,在生物学概念上就是"遗传"的概念,在面向对象中"继承"就类似于生物学中的遗传,通过继承,可以更好的实现代码的重用(复用,多次使用的意思).增加扩展性.简化代码等. 下面是现实生活中的引用: 定义与使用继承 继承一次最常用的就是通过合法程序(比如遗嘱)从别人那里接受财产或爵位等,有点类似于世袭制. 另外一个含义,是人从父母那里继承一些特征,如果孩子从父母继承的身高.相貌等特征.那么在什么情况下

关于抽象类

1. 抽象类 语法:public abstract class 类名(){}; 2. 抽象方法 语法:public abstract 返回值类型 方法名(参数列表); 例:public abstract void print(); 注意:抽象方法有abstract修饰,并且抽象方法没有方法体. 3. 抽象类和抽象方法的特点 a.都用abstract修饰 b.抽象方法没有方法体 c.抽象类不能实例化,并且继承必需重写抽象类中的所有抽象方法 注意: 1.抽象类中不一定有抽象方法 2.含有抽象类方法的

接口 和 抽象类

前言:一个类能实现多个接口,抽象类只能被一个类继承. 今天和周敏去吃饭,别人问的是:接口和抽象类有什么区别,你连一点头绪都没有 别人还知道接口是用interface定义的,抽象类是用abstract class定义的(啊不石爪克特) 1.抽象类不能实例化对象,抽象类的其他功能和普通类是相似的: 比如成员变量,成员方法,构造方法,访问方式都和普通类是一样的 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用 抽象方法:是用abstract定义的 Public abstract double

java -- 抽象类

1.抽象类的概念和作用: Java中可以定义没有方法体的方法,该方法由其子类具体实现,该没有方法体的方法称之为抽象方法.含有抽象方法的类称之为抽象类. 2.抽象方法的特点: a.只有方法头,没有方法体的方法称之为抽象方法. b.抽象方法用abstract来修饰. c.抽象方法代表一种不确定草操作法或行为. d.抽象方法不能被调用.**只能被子类重写. 3.抽象类的特点: a.定义中含有抽象方法的类叫做抽象类. b.抽象类用abstract来修饰. c.抽象类代表一种抽象的对象类型. d.抽象类不

面向对象(2)之抽象类

1.抽象类概念和特点 * A:抽象类概述 * 抽象就是看不懂的 * B:抽象类特点 * a:抽象类和抽象方法必须用abstract关键字修饰 * abstract class 类名 {} * public abstract void eat();//当不知道该方法具体是怎么实现的 //比如动物吃,你知道它吃什么吗?怎么吃?都不知道 * b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口 * c:抽象类不能实例化那么,抽象类如何实例化呢? * 按照多态的方式,由具体的子类实例化.其实