我们大家都知道,spring功能是很强大的~主要体现在两个方面:一是Ioc控制反转,二是AOP面向切面思想。
spring可以托管Hibernate以及事务,并且还提供了HibernateTemplate,HibernateDaoSupport,HibernateCallBack三个类来简化Hibernante的操作
它们的作用分别是:
HibernateTemplate:所有持久化操作的门面类。它可以在不涉及sessionFactory的情况下对数据库进行操作,对于事物的关闭,打开完全自动完成。
HibernateDaoSupport:该类是用来支持dao层的操作的,通过继承该类,便可以通过内置的getHibernateTemplate()方法获得HibernateTemplate对象,并进行操作
所有继承该类的类,在依赖注入时,必须添加HibernateTemplate的注入,该来会通过内置的setHibernateTemplate()获得,除了这两个方法外,还有一个setSessionFactory()方法。
HibernateCallback:该类是个抽象类,用它允许程序猿直接面向原生的Hibernate session进行操作,比如:分与查询时,HibernateTemplate无法完成,就只有依靠它了。
以上就是Hibernate进行托管后操作的三个API了。
Ioc它可以对数据访问层和业务逻辑层进行依赖注入,降低二者时间的耦合度,使其之间业务分明~~~
其中,在依赖注入时,经常会出现这么个问题~~~(这才是这篇讲的重点)
有时候,我们对dao层,service层,action进行依赖注入时,经常会提示空指针异常,也就是注入失败~~~!!!
天哪~~找好半天还是找不到哪里错了~~~只好,利用ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");来进行加载,代用了~~
这样却每一点异常,正常使用~~到底是怎么回事呢???原因如下:
在依赖注入时,对dao层类的注入和action还不一样!!有点小差异!!
我们那个例子来解释一下,两种注入的细微的区别~:
对dao层的注入例子:
<bean id="loginregistserviceimpl" class="com.serviceImpl.LoginRegistServiceImpl">
<constructor-arg name="udao"><ref bean="userdaoimpl"/></constructor-arg>
</bean>
<bean id="servicemanager" class="com.serviceImpl.ServiceManager" >
<property name="lrs"><ref bean="loginregistserviceimpl"/></property>
</bean>
这个是很常见的吧~~没什么疑问
来看一下action的注入:
<bean id="servicemanager" class="com.serviceImpl.ServiceManager" >
<property name="lrs"><ref bean="loginregistserviceimpl"/></property>
</bean>
<bean id="loginregistaction" class="com.action.LoginRegistAction" >
<property name="servicemanager"><ref bean="servicemanager"/></property>
</bean>
看到两者什么区别吗?(当然代码肯定是不一样的)
重点就在:
<property name="servicemanager"><ref bean="servicemanager"/></property>
action注入中,必须要求action定义的变量名字和注入bean的id名字保持一致,否者注入失败~~~
哈哈,明白了吧!!!
类似一下加载的代码,在整个项目中时完全没必要出现的!!
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
BeanFactory bf=ac;
manager = bf.getBean("servicemanager", ServiceManager.class);
还有一个小知识:
<property name="lrs"><ref bean="loginregistserviceimpl"/></property>
以上是通过set方法注入
以下是通过构造函数注入
<constructor-arg name="udao"><ref bean="userdaoimpl"/></constructor-arg>
今天就讲解到这里~~~
明天继续~~~