最近碰到一个以前没有想过的问题,觉得应该跟论坛的朋友们讨论一下:在DAO的实现上,以前常用Spring的依赖注入来生成Dao对象,然后在对象中通过继承或者实现更抽象的接口,调用公共的代码来获得数据库的Connection连接,由于Spring默认情况下都是单例模式,所以每个Dao对象也就只有一个实例。习惯上好像就这样了!那么如果我把Dao对象的CRUD相关方法全部变成静态的呢?
例如:
public class UserDao{
public Session getHibernateSession(){...} public static User getUserByID(String id){
User user = getHibernateSession().get(id);
//close session...
return user;
} public static void addUser(User user){
getHibernateSession().save(user);
//close session...
}
}理论上来说,这样的话甚至节约了new一个UserDao的实例来完成任务,只需要UserDao class实例就可以了,但总觉得这样用不是很放心,希望大家都来讨论一下,用静态方法来完成数据库操作是否有隐藏的危害呢?如果没有,又到底是静态还是Spring注入调用实例的非静态更好一些呢?
例如:
public class UserDao{
public Session getHibernateSession(){...} public static User getUserByID(String id){
User user = getHibernateSession().get(id);
//close session...
return user;
} public static void addUser(User user){
getHibernateSession().save(user);
//close session...
}
}理论上来说,这样的话甚至节约了new一个UserDao的实例来完成任务,只需要UserDao class实例就可以了,但总觉得这样用不是很放心,希望大家都来讨论一下,用静态方法来完成数据库操作是否有隐藏的危害呢?如果没有,又到底是静态还是Spring注入调用实例的非静态更好一些呢?
不知道多线程安全性方面是不是需要考虑,期待高手解答
Spring注入Dao,得到static 的bean就行了。
private static ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
private staitc UserDao = (UserDao) ac.getBean("UserDao");
new 一个对象也节约不了多少空间,如多个Dao共用一个Session可能出错。
public static Session getHibernateSession(){...}
public static User getUserByID(String id){
User user = getHibernateSession().get(id);
//close session...
return user;
} public static void addUser(User user){
getHibernateSession().save(user);
//close session...
}
} dao层多数操作都是比较底层、比较原子性的,可以用static。如果用到spring的话,由于getTemplate()不是statsic的,所以就不能用static了。个人意见
存放的是一些工具方法,在任何程序中都有可能用到的东西。做成静态方法的话,让业务层与 DAO 层完全耦合起来了,如果 DAO 在技术更新后需要采用其他的
ORM 工具重新实现的话,这样一来根本就不可能另外再实现一个 DAO 类,只能在原始的 DAO 类中
更改,要么就需要更改业务类中的代码,如果项目很大的话,这个工作量是非常惊人的。静态 DAO 方法,在事务上下文中会存在问题,没办采用声明式事务进行管理(比如:Spring 中或
者是 EJB 中的),因为声明式事务处理需要采用动态代理方式进行事务上下文的切入,由于不存在
DAO 对象,因此也不存在代理对象,也没办法使用声明式事务,只能手工处理。如果一个业务逻辑调用多个 DAO 方法的话,在这种事务上下文环境中,如果靠手工处理事务那会是
非常繁锁,而且将事务逻辑侵入到了业务层中。上面这些是个人观点,仅供参考,基本上就想到这些了,等以后想到了再来补充。
我以前看过一篇文章,在web开发中,最好别用static,99%都会出错,因为太容易出问题了。有些问题还是未知性的错误啊
当然一些字符串常量是可以用的
private static ApplicationContext _ctx;
private SpringUtil(){
}
static{
_ctx = new ClassPathXmlApplicationContext(
"classpath:/spring-context-db.xml");
}
public static Object getBean(String beanName){
return _ctx.getBean(beanName);
}
}
{
static SessionFactory sessionFactory = null;
static
{
final Configuration cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
} public static SessionFactory getSessionFactory()
{
return sessionFactory;
} public static Session getSeesion()
{
return sessionFactory.openSession();
}
}
还没学Spring..