一》最近在研究Spring,对于AOP,IoC有了一点认识。首先我发一个整合的代码
1,使用的IDE是netbeans,个人觉得什么工具都一样。
2,代码结构视图
3,各个类的代码,先从Dao说起,IUserDao跟UserDaoImpl这个不用说,是持久层的代码。用spring来管理hibernate。首先要继承HibernateDaoSupport。然后我们就可以利用getHibernateTemplate()方法了。
IUserDao.java
package com.fly.user.dao;
/**
*
* @author fly.zhou
*/
public interface IUserDao {
//增加对应实体的一条记录
public boolean add(Object o);
//更新对应实体的一条记录
public boolean update(Object o);
//增加或者更新对应实体的一条记录
public boolean addOrUpdate(Object o);
//删除对应实体的一条记录
public boolean delete(Object o);
}
UserDaoImpl.java
package com.fly.user.dao.daoimpl;
import com.fly.user.dao.IUserDao;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
*
* @author Administrator
*/
public class UserDaoImpl extends HibernateDaoSupport implements IUserDao {
@Override
public boolean add(Object o) {
getHibernateTemplate().save(o);
return true;
}
@Override
public boolean update(Object o) {
getHibernateTemplate().update(o);
return true;
}
@Override
public boolean addOrUpdate(Object o) {
getHibernateTemplate().saveOrUpdate(o);
return true;
}
@Override
public boolean delete(Object o) {
getHibernateTemplate().delete(o);
return true;
}
}
4,有了持久层的支持,业务逻辑层有可以实现了。首先要定义接口IUserService,有些人很可能不明白为什么要定义IUserDao跟IUserService,其实这就是Spring注入思想的一个体现。
IUserService.java
package com.fly.user.service;
import com.fly.user.entity.User;
import java.util.List;
/**
*
* @author Administrator
*/
public interface IUserService {
public boolean addUser(User user);
public boolean updateUser(User user);
public boolean deleteUser(User user);
public User loginCheck(String name, String passwd);
public boolean loginOut();
public List<User> showUsers();
public boolean ifUserNameHave(Object pValue);
}
UserServiceImpl.java
package com.fly.user.serviceimpl;
import com.fly.user.dao.IUserDao;
import com.fly.user.entity.User;
import com.fly.user.service.IUserService;
import java.util.List;
/**
*
* @author Administrator
*/
public class UserServiceImpl implements IUserService {
private IUserDao userDao;//这个地方不能用new方法,不然就失去使用spring的意义了,而且会出现异常;然后必须生成set方法,对应的就是spring的set注入方式了。
public IUserDao getUserDao() {
return userDao;
}
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
@Override
public boolean addUser(User user) {
return userDao.add(user);
}
@Override
public boolean updateUser(User user) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean deleteUser(User user) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public User loginCheck(String name, String passwd) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean loginOut() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public List<User> showUsers() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean ifUserNameHave(Object pValue) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
5,业务逻辑实现了,对于Beans就好说了UserLoginBean
public class UserLoginBean {
private IUserService userService;
//这个地方不能用new方法,不然就失去使用spring的意义了,而且会出现异常;然后必须生成set方法,对应的就是spring的set注入方式了。
private String name;
private String passwd;
public IUserService getUserService() {
return userService;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}
/**
* Creates a new instance of UserLoginBean
*/
public UserLoginBean() {
}
public void addAction() {
User user = new User(name, passwd, "", 1);
userService.addUser(user);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
6,然后就是spring注入了,当然是配置了applicationContext.xml
<!-- 配置 dataSource 使用Hibernate2的话要修改下面的第一行 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver<alue>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/nrfmwebdb<alue>
</property>
<property name="username">
<value>root<alue>
</property>
<property name="password">
<value>root<alue>
</property>
</bean>
<!-- 配置sessionFactory, 注意这里引入的包的不同 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>User.hbm.xml<alue>
<st>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="userDao" class="com.fly.user.dao.daoimpl.UserDaoImpl">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="userService" class="com.fly.user.serviceimpl.UserServiceImpl">
<property name="userDao">
<ref bean="userDao" />
</property>
</bean>
除了这个还有faces-config.xml
<managed-bean>
<managed-bean-name>userManage</managed-bean-name>
<managed-bean-class>com.fly.user.beans.UserManageBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>userLogin</managed-bean-name>
<managed-bean-class>com.fly.user.beans.UserLoginBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>userService</property-name>
<value>#{userService}</value>
</managed-property>
</managed-bean>
<application><variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver></application>
需要加上下面这段配置让Spring的变量解析器来替换JSF的变量解析器,那么就可以在spring来管理managedbean,而faces-config.xml中就不需要来配置managedbean信息。配置如下:
<bean id="managebean" name="userLogin" scope="session" class="com.fly.user.beans.UserLoginBean">
<property name="userService" ref="userService"/><!--仔细观察,会发现跟faces-config.xml中的配置差不多一模一样,很简单吧-->
</bean>
6,最后就是jsf页面了,这里略。
三》最后来谈下spring,jsf,hibernate整合的要点
1,用到spring mvc,那么就必须理解注入,spring三种注入方式,单最常用的还是set。
2,既然用到注入就不能使用new,使用new就不能注入,因为这本身就是矛盾的。
3,使用getHibernateTemplate()的XXXDaoImpl类必须继承HibernateDaoSupport。
4,一般情况我们比如在业务实现XXXServiceImpl中生命持久层IXXXDao的接口,然后插入set方式,同时配置spring配置文件,一般是两个bean,一个是spring管理业务bean,一个是spring管理实体bean。如果XXXServiceImpl中调用了几个持久层的接口,那就需要配置几个bean来管理。如果你想把managedbean也交给spring,那就最低三个配置文件。