我看到您在一些回答网友文章的帖子中说建议放弃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的注入方式,而采用单例模式作为编码的写法,您是怎么考虑的,可以和我分析一下吗???谢谢
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
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 无状态时的一种节省时空的写法。