开发者社区 问答 正文

为什么不考虑使用Spring的IOC来管理bean?

我看到您在一些回答网友文章的帖子中说建议放弃Spring,但是我觉得Spring的IOC模式挺不错,很适合在Web中的开发使用,那么您建议放弃Spring的理由是什么呢???为什么您更倾向于使用单例模式维护bean?难道就是因为编码上更简洁了吗???如:我现在写一个Service

public class UserService {
    public static UserService me = new UserService();
    public void getCurrutUser(){
        System.out.println(User.dao.getName());
    }
}

这是您的推荐的写法(这个Service方法如果被其他的Controller代码使用的话就存在多个单例被调用,如果是并发量高的情况下,会不会出现线程不可靠的问题),如果是用Spring的话

public class UserService {

    @Autowired
    private User user;

    public void getCurrutUser(){
        System.out.println(user.getName());
    }
}

为什么不使用Spring的注入方式,而采用单例模式作为编码的写法,您是怎么考虑的,可以和我分析一下吗???谢谢

展开
收起
a123456678 2016-03-18 10:13:32 2771 分享 版权
1 条回答
写回答
取消 提交回答
  • 1:jfinal 为啥没有 IOC

    通常来说 IOC 是为了实现 AOP,而 AOP 最常应用于权限管理及声名式事务,而 jfinal 提供的拦截器已经实现了AOP,并且可以避免 IOC 带来的大量 XML 配置或者 Annotation, Annotation 也是配置的一种形式,jfinal 主张尽可能减少配置,这样才能实现极速开发的目标。
    
      当前通常使用 Spring 的人无论要不要 AOP,都将controller、service、dao、model 等等各层次通过 xml 一层一层组装起来,这是对 AOP 的一种滥用,而且极大增加了代码量、降低了开发效率,这是在当下飞速发展的移动互联网背景下非常不经济的方式。
    

    2:关于单例模式

    与楼主所说的相反,jfinal 并没有主张单例模式,而只是当 Service 没有状态时,建议在 controller 中 private static Service service = new Service() 这样创建一个 static 属性,由于controller 是非单例的,而 service 又是无状态的,这种方式可以避免每个请求过来都创建 service 对象,节省时空,所以这里主要是根据项目实际情况来做选择。
    

    3:有关线程安全

     对于 controller 来说,是每个请求过来都创建对象,所以是线程安全的。对于controller 所依赖的 service 属性,只要是无状态的就可以直接 static Service service 创建一次,让多线程共享,也不存在线程安全问题。如果 Service 是状态的,如果是轻量级的对象,每次 new Service().doSomeThing() 就可以。
    

    4:注入、单例模式

    注入就需要 IOC,有了 IOC 就有一堆配置,有了一堆配置就不是极速开发,不是极速开发成本就高。jfinal 并未刻意要求过使用单例模式,相反而是建议直接使用 new 出对象来替代传统的 IOC 注入方式,而在 controller 中 static Service 的做法本质上也不是单例,只是在servcie 无状态时的一种节省时空的写法。

    2019-07-17 19:05:59
    赞同 展开评论