论坛首页 Java企业应用论坛

我的开发经验分享(一)-Spring业务bean零配置

浏览 10187 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (6) :: 隐藏帖 (1)
作者 正文
   发表时间:2008-09-28  
我觉得这个这个注意不错啊,有点像grails中的思想,用约定替代配置。而且可以继承Spring BeanFactory写一个工厂类来生成service。
0 请登录后投票
   发表时间:2008-09-28  
如果说约定优于配置,那就用autowire,至少那个方式对代码是无侵入的,楼主的这种方式以后再想改为配置的,那就难了
0 请登录后投票
   发表时间:2008-09-28  
你把配置文件分开不久可以了吗。
而且如果你真的想实现0配置的话也行,spring的注解支持;你现在的设计…………颇有黑代码的味道。
0 请登录后投票
   发表时间:2008-09-28  
BeanFactory.createBean(UserService.class),
pikachu 写道

事实上构想不错,要是没有理解错的话,这个组件完成的是service,dao,transaction之间的依赖.并且将spring作为一个硕大的factory. 现在大家的问题是,为什么在更前端的代码要调用BeanFactory.createBean(UserService.class),难道不能进一步将service也注入么?


还是你看明白了我的文章。
Spring我还是看作IoC容器,
BeanFactory 代码我没贴出来吧,可能真的是漏了些材料:
/**
	 * 通过Spring容器创建bean
	 * 其中会检查bean的scope ,避免冲突。bean的scope取决与第一次创建时定义的scope。
	 * @param beanID
	 * @param beanClass
	 * @param isSingleton
	 * @return
	 */
	public static Object createBean(String beanID,Class beanClass,boolean isSingleton ) {
		
		if(!SpringContextManager.containsBean(beanID)) {
			
			if(log.isDebugEnabled())
				log.debug("bean dynamic register " + beanID +",class:" + beanClass +",scope(singleton?)" + isSingleton );
			SpringContextManager.registerBean(beanID, beanClass, isSingleton);
		}else {  //检查bean的scope ,避免冲突。bean的scope取决与第一次创建时定义的scope。
			BeanDefinition def = SpringContextManager.getBeanDefinition(beanID);
			if(isSingleton != def.isSingleton()) {
				throw new IllegalArgumentException("Can't register bean as " +  ( !def.isSingleton() ? "singleton" : "prototype")  + ", it's already registered as "
							+ (def.isSingleton() ? "singleton" : "prototype") +". Bean beanID '" + beanID  +"'");
			}
		}
		return getBean(beanID);	
	}




实际就是Spring context 的一个简单封装而已,加入动态注册功能,createBean(UserService.class),还是将对象注入IoC容器; 注入了容器,Spring 的AOP,事务等就能自动关联。
0 请登录后投票
   发表时间:2008-09-28  
bloodwolf_china 写道
我觉得这个这个注意不错啊,有点像grails中的思想,用约定替代配置。而且可以继承Spring BeanFactory写一个工厂类来生成service。


"用约定替代配置", 就是这个了。
XXXService,XXXDAO 的包名,类名制定了统一规则,正是按这个规则,可以自动为Service 找到对应的DAO类,并进行动态注入。
0 请登录后投票
   发表时间:2008-09-28  
Readonly 写道
为什么不反思一下别人为啥不赞同你的帖子呢?反而跑去说别人的帖子如何如何,这不是典型的酸葡萄心理么...

另外关于你的方案,难道你不知道spring有autowire功能么?


唉,你还没看明白我的文章到底在讨论什么问题。

如果你是一个个配置,当然可以用 autowire 了;在你目前的用法下,OK的啊。
而我讨论的是如何不配置,零配置的问题。
0 请登录后投票
   发表时间:2008-09-28  
flyingpigaa 写道
同意楼上观点,我们项目里spring 里bean 也超多,但并没有阅读困难。楼主是不是有点因噎废食


没有阅读困难就好,呵呵;每个项目,自己的方案用惯了就好; 没有说谁一定要替代谁。
如果有的话,或觉得配置麻烦的话,才需要参考我的方案。

我是在看Spring书籍的第三天,看到 service ,dao要一个个配置,我当时就有一个念头,我不想让程序员配置,一个都不想,我要减少他们的工作量 —— 零配置。
0 请登录后投票
   发表时间:2008-09-28  
mazzystar 写道
这样配置文件就不完整了,配置文件中不能明确展现类之间的关系,看了之后肯定一头雾水,不如全部都零配置吧


对于业务bean, XXXService,XXXDAO,一般是byName来 autowire。
对于类之间的关系,按这种约定型设计,本来就是一目了然的。 userService当然要注入 userDAO,我想你不会把  orderDAO 注入给 userService吧。
业务bean的名称是稳定的, userService一旦确定,我想以后没有特殊理由,应该不会再改了。

数据库配置,事务配置,这些可变的信息才应该在applicationContext.xml 中配置,体现IoC思想。
0 请登录后投票
   发表时间:2008-09-28  
raymond2006k 写道


还是你看明白了我的文章。




所以你的文章和老外的文章还是有差距的.再好的想法,不能清晰的表述,总是会带来这样那样的问题.


可以参考一下那些老外的行文,多看看他们的paper.毕竟技术类文章写作思路都是一致的,标准八股文写法是

1.概述或介绍.主要是背景,问题,所依赖技术以及主要功能
2.详述.
3.总结.使用方案后的效果,优势,同其他类似产品的比较
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics