比如两个类层,如dao层和service层,我们通过spring的IOC依赖注入或者接口加单列模式通过工厂方法来连接类层或者别的方式
如UserDao类(dao数据处理层),可以实现IUserDao接口,
而UserService类(业务层)可以实现IUserService接口供action来调用
UserDao和UserService的联系,可以在UserService类中通过定义一个Private IUserDao userDao;
userDao 通过set方法依赖注入或者通过构造方法来实例化,也可以通过工厂模式来取得对象的引用
还有一种就是直接new UserDao实例。想问下这三者的利弊?要是大项目,并发很多的情况下,用单例是否合适。用new是否内存开销太大,影响性能。请大家说说看法。

解决方案 »

  1.   

    既然lz已经想到了IOC,那就IOC好啦,Spring会帮你解决多线程等的问题的,你只管注入就可以了。
      

  2.   

    new的可能不太好,可能不好做单元测试, 用注入会好一些, 
    多几个生命周期短的小的 object 不会占多少内存, JVM的垃圾回收可以应付.用单例有的时候在多线程环境中,如果用类变量,会比较危险, 有的时候就new一些实例可能会好一些,具体要看, 一切都要跑起来之后再看
      

  3.   

    用依赖注入吧,分离需求和相互关系。
    不过我觉得无论是dao层还是service层,无非一个是提供对象化操作数据库的的服务,一个是提供一些业务逻辑的服务,都是像组件一样,基本没有类变量,所以不存在并发的安全问题,当然更可以弄成单例来使用,当然每使用一次就建立个对象也吓不死人。
    ---------
    一家之言啊
      

  4.   

    你分开定义了接口和实现,如果还通过new来构造实现类的实例,就达不到接口和实现分离的目的了。
    用单例时,只要方法中不存在对属性的修改(这会引起线程同步问题),无论多少线程都没有关系。
      

  5.   

    这里不是定义了接口,是用3种不同的方法,一种直接new,没接口,一个是用spring的IOC,一种是用接口+工厂,后2者一般都会是单例模式
    userDao层和userService一般都没属性值,基本都是方法,所以是不是意味着用后2者在大并发时时线程安全的?如果是 是不是意味着用厚2种好过new
    如果不是,用new是不是同样在大并发下会很影响性能
      

  6.   

    1、一种直接new,没接口
    这也就是说你的userService类和userDao类是紧密耦合的
    所有都用接口,通过spring构造,你的程序是松耦合的
    2、userDao层和userService一般都没属性值,基本都是方法
    只要你的方法不去修改当前对象的属性值,这个方法就是线程安全的,单一实例的性能肯定好过new
      

  7.   

    方法调用的时候有自己的堆栈这可是程序的基本功呀!每个人调用自己的方法只在自己的方法中。除非你写的DAO有很多全局静态变量。所以用单例DAO是安全的。但是数据库连接一定要用线程安全去解决。1秒并发一千用户量必然要用单例模式。
      

  8.   

    有时候你认为提升了不少性能,但测试下其实根本提升不了多少。
    直接new 对象会造成紧密耦合,如果修改dao实现的话,必须去修改源代码。
    而是用spring的话,默认spring就会对bean实行单例。肯定比new很多对象性能要高,单也有限