spring 抽象类注入问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 抽象类注入问题相关的知识,希望对你有一定的参考价值。
我的basedao类是抽象父类 底下有很多实现类调用了父类的方法 在用spring注入的时候报错.错误就不贴了 大概的意思是不能实例化抽象类(我注入的是继承了的子类) 我就把abstract关键字给删了 里面的方法和字段还用的protected. 有没有什么影响???
说错了,sorry,LocalSessionFacoryBean不是实现sessionFactory的接口,这里想当然的以为sessionFactory是被 LocalSessionFacoryBean实现的,去研读了一下代码发现LocalSessionFactoryBean继承了AbstractSessionFactoryBean这个抽象类,这个类实现了org.springframework.beans.factory.FactoryBean接口, spring在装配的时候, 如果发现实现了org.springframework.beans.factory.FactoryBean接口, 就会使用FactoryBean#getObject() 方法返回的对象装配,
这个抽象类两个重要的实现org.hibernate.SessionFactory的方法如下:
//在产生类实例后生成sessionFacotry实例,注入到这个类的sessionFactory中
public void afterPropertiesSet() throws Exception
SessionFactory rawSf = buildSessionFactory();
this.sessionFactory = wrapSessionFactoryIfNecessary(rawSf);
//因为实现FactoryBean接口这个类注入的时候通过getObject()注入的是sessionFactory组件,而不是这个LocalSessionFactoryBean的实例
public Object getObject()
return this.sessionFactory;
---------------------------------------------------------------------
楼主去研读一下sessionFactory的代码,其实里面都是空方法,为什么呢,因为他是个接口,你不结合Spring直接用 Hibernate的时候,sessionFactory用的都是SessionFacotryImpl类的实例(因为接口不能实例化)同理,org.springframework.orm.hibernate3.LocalSessionFactoryBean也是这个接口的实现所以可以注入到sessionFactory中
______________________问题分割线______________________________________
<property name="sessionFactory" ref="sessionFactory"/> 这个注入的不是自己的类org.springframework.orm.hibernate3.HibernateTransactionManager,而是自己类用到的组件LocalSessionFacoryBean
比如Class Person
private String head;
注入的是head而不是Person,但是其中Person的head是依赖你外面配置的head(sessionFactory)的,不知道我这样说楼主明白否
参考技术A 关系应该是这样的,你的实现类继承basedao抽像类并实现其方法.
在SPRING 注入的时候,要注入basedao抽像类的接口并不是basedao抽像类本身
你是不是没有建立basedao抽像类的接口,直接注入到basedao抽像类本身了. 参考技术B 在引用父类的地方,要对应写上实现类。不然无法根据父类引用来确定是哪个子类的对象。 参考技术C 代码如下:
public abstract class B implements A
private JdbcTemplate jdbctemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
this.jdbcTemplate = jdbcTemplate;
protected void beforeProcess()
//............
protected abstract void process();
protected void afterProcess()
//............
public void execute() throws FrameBizException
beforeProcess();
process();
afterProcess()
参考技术D 没问题啊,是不是你那边写错了
推荐用接口来注入,用父类应该也没问题的
继承一个抽象类,并实例化抽象类中定义的方法,这个方法返回spring注入的一个对象,值一直为空?
class Action extends AbstractObj
@Resource
private Object obj;
....
@Override
public Object getObj()
//这个地方返回的一直是null,求大神呀
return obj;
2、在action里面有没有给obj这个属性set和get方法,set方法一定要名否则不能注入。
3、或者你在定义action那个bean里就初始化这个属性,但是还是一定要先定义obj这个bean先,然后通过<property name="obj(属性名)" ref="obj"/> ref是引用你前面定义的obj那个bean这样,属性obj的值就被注入了。 参考技术A 真心不会答 参考技术B 你Action类注入到IoC容器了吗?
以上是关于spring 抽象类注入问题的主要内容,如果未能解决你的问题,请参考以下文章
spring gclib final @Transactional