去年6月份开始接触Java,到8,9月份基本掌握Spring,Hibernate,Struts,然后自己搭建了一个框架,并成功的应用到项目上。应该说,从那个时候起,我就开始思考这个问题,这个过程持续了很长的时间。
大概是今年年后,51之前的这一段时间,突然想通了怎么在Spring里面实现范型,大致的实现如下:
public class UserServiceImp implements UserService {
private RootService<T> rootService;
public setRootService(RootService<T> rootService)
{
this.rootService = rootService;
}
}
applicationContext.xml文件的相关配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> <property name="mappingDirectoryLocations"> <list> <value>classpath:/com/upup/bean/</value> </list> </property> </bean> <bean id="rootService" class="com.upup.dao.RootServiceImp">
<property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="userService" class="com.upup.business.service.UserServiceImp">
<property name="rootService"> <ref local="rootService" /> </property> </bean> 在解决了Spring的范型支持的问题后,开始考虑Hibernate的范型支持的问题,但始终受困于如何在范型类中根据T得到class,因为不能简单的调用T.getClass来获得class,直到昨天看到江南白衣的blog上的那篇文章,终于发现了解决办法,即定义一个范型父类AbstractBaseService,在其中实现基本的CRUD操作,然后UserService继承AbstractBaseService,这样完美的实现了Spring、Hibernate对于范型的支持,可以大量简化开发工作。当然,现在还有个局限,即只能通过继承父类的方法来实现在父类中获得T的class。
相关实现的代码:
UserServiceImp.java
public class UserServiceImp extends AbstractBaseService<User> implements
UserService { public UserServiceImp() { super("User"); } @Override
public User add(User obj) { obj = super.add(obj); this.getCache().addToCache(obj, this.getGetAllKey(), obj.getId()); this.getCache().putCountKey(this.getGetAllCountKey()); return obj; } }
AbstractBaseService.java
public abstract class AbstractBaseService<T>{
private Class<T> entityClass; private Log logger = null;
private String tableName;
private RootService<T> rootService;
private CacheService<T> cache;
public void setCache(CacheService<T> cacheService) {
this.cache = cacheService; cache.setEntityClass(entityClass); cache.setTableName(tableName); } public AbstractBaseService(String tableName) {
this.tableName = tableName; entityClass = (Class<T>) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; logger = LogFactory.getLog(entityClass); } public T findByID(Serializable id) {
return cache.getObjectFormCacheByID(id.toString()); } public T add(T obj) { try { obj = rootService.insertObject(obj); return obj; } catch (DataAccessException ex) {
logger.error("add(T obj):", ex.getCause()); return null; } } public T save(T obj) { try { rootService.saveObject(obj); return obj; } catch (DataAccessException ex) { logger.error("save(T obj):" + ex); return null; } } public void delete(T obj) { rootService.deleteObject(obj); } }
以上代码也考虑对缓存的支持,关于缓存的实现,留待下次专门讨论。
|
|
来自: shaobin0604@1... > 《Java》