论坛首页 Java企业应用论坛

再谈开源框架的“非侵入”还有意义吗?

浏览 18356 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2009-08-31  
如果可移植性事关重大,那么就采用初始化方法,否则建议采用InitializingBean接口以减少应用程序所需的配置数量。
Pro Spring说的
As you can see, there is no difference in the output of the two examples; both work in exactly the same way. As we discussed earlier, both approaches have their benefits and drawbacks. Using an initialization method, you have the benefit of keeping your application decoupled from Spring, but you have to remember to configure the initialization method for every bean that needs it. Using InitializingBean, you have the benefit of being able to specify the initialization callback once for all instances of your bean class, but you have to couple your application to do so. In the end, you should let the requirements of your application drive the decision about which approach to use. If portability is an issue, then use the initialization method, otherwise use the InitializingBean interface to reduce the amount of configuration your application needs and the chance of errors creeping into your application due to misconfiguration.
0 请登录后投票
   发表时间:2009-08-31  
框架是用来做东西的,做不出好东西说啥都没用。
1 请登录后投票
   发表时间:2009-08-31   最后修改:2009-08-31
badqiu 写道


当然,我一直使用这个接口。一般是在afterPropertiesSet()中检查bean属性是否设置正确及其它相关操作。
而在spring配置文件中使用如下这种我是不推荐使用的.
<bean class="com.company.test.UserDao" init-method="init"></bean>


既然spring已经有生命周期接口,统一使用接口能够更加统一。

其它应用场景:
Quartz服务的启动
spring本身的DaoSupport
public abstract class DaoSupport implements InitializingBean {

	public final void afterPropertiesSet() throws IllegalArgumentException, BeanInitializationException {
		checkDaoConfig();
		try {
			initDao();
		}
		catch (Exception ex) {
			throw new BeanInitializationException("Initialization of DAO failed", ex);
		}
	}

	protected abstract void checkDaoConfig() throws IllegalArgumentException;
	protected void initDao() throws Exception {
	}

}





你这东西是业务逻辑层的东西?这不就是一个Dao工具类嘛?我不明白这东西为什么要自己实现,即使是自己实现,也不能被划到业务逻辑层的范畴。你这个类,和Spring提供的各种各样的DaoSupport类是没有区别的,是应该被打包到spring.jar中去,成为framework或者辅助类来使用的。

我们所谈的入侵性讨论,要基于的是真正的业务逻辑层的代码,具体表现为XXService或者XXManager。
0 请登录后投票
   发表时间:2009-08-31  
downpour 写道
badqiu 写道


当然,我一直使用这个接口。一般是在afterPropertiesSet()中检查bean属性是否设置正确及其它相关操作。
而在spring配置文件中使用如下这种我是不推荐使用的.
<bean class="com.company.test.UserDao" init-method="init"></bean>


既然spring已经有生命周期接口,统一使用接口能够更加统一。

其它应用场景:
Quartz服务的启动
spring本身的DaoSupport
public abstract class DaoSupport implements InitializingBean {

	public final void afterPropertiesSet() throws IllegalArgumentException, BeanInitializationException {
		checkDaoConfig();
		try {
			initDao();
		}
		catch (Exception ex) {
			throw new BeanInitializationException("Initialization of DAO failed", ex);
		}
	}

	protected abstract void checkDaoConfig() throws IllegalArgumentException;
	protected void initDao() throws Exception {
	}

}





你这东西是业务逻辑层的东西?这不就是一个Dao工具类嘛?我不明白这东西为什么要自己实现,即使是自己实现,也不能被划到业务逻辑层的范畴。你这个类,和Spring提供的各种各样的DaoSupport类是没有区别的,是应该被打包到spring.jar中去,成为framework或者辅助类来使用的。

我们所谈的入侵性讨论,要基于的是真正的业务逻辑层的代码,具体表现为XXService或者XXManager。


首先我列的这个类本来就是spring.jar里面的DaoSupport.

我列出上面的代码的意思就是可以执行checkDaoConfig()这类操作.

我倒是比较怀疑你难道从不使用这些生命周期函数.
而不是要我列举例子!!!

如在spring容器中我们有一个MailEngineService.
在初始化时需要启动一个线程池.
而是系统dispose时,我们需要将这个线程池未执行完成的线程等待它执行完才能将整个应用undeploy.

0 请登录后投票
   发表时间:2009-08-31  
占绝大多数的无状态服务组件不需要这种回调,
你举的MailEngineService的例子应该属于有状态的组件,类似还有连接池等
0 请登录后投票
   发表时间:2009-09-01  
ferreousbox 写道

    "非侵入“这词应该是spring最开始主打的口号吧,也唱响了新一代开源框架的发展潮流,君不见目前非常多的框架都在大谈自己是”非侵入“式的,程序员也在津津乐道”非侵入“式的好处,我个人认为,最开始”非侵入“背后的意义应该是框架的灵活切换,而不仅仅是代码中的”非侵入“,而如今,spring、struts等,虽然可以实现代码的”无侵入“,但背后的”已绑定“似乎已经违背了初衷。那再谈”非侵入“还有何意义?


支持楼主,“非侵入”基本上是在扯淡。

0 请登录后投票
   发表时间:2009-09-01   最后修改:2009-09-01
"侵入了"又怎么样呢?
"非侵入"最好的办法就是不使用。
0 请登录后投票
   发表时间:2009-09-01  
advantech 写道
框架是用来做东西的,做不出好东西说啥都没用。


说的很实在啊
0 请登录后投票
   发表时间:2009-09-01  
badqiu 写道


首先我列的这个类本来就是spring.jar里面的DaoSupport.

我列出上面的代码的意思就是可以执行checkDaoConfig()这类操作.

我倒是比较怀疑你难道从不使用这些生命周期函数.
而不是要我列举例子!!!

如在spring容器中我们有一个MailEngineService.
在初始化时需要启动一个线程池.
而是系统dispose时,我们需要将这个线程池未执行完成的线程等待它执行完才能将整个应用undeploy.



你到底是否明白我们讨论的前提条件?什么是业务逻辑层?要谈入侵性,就必须建立在业务逻辑层这个层面来进行讨论,你给我列一个spring.jar里面的类,告诉我要依赖于Spring,这不是废话吗?这不是业务逻辑层,兄弟!

我可以很负责任的告诉你,我从不在我的业务逻辑层中使用生命周期函数,因为这是没有必要的,所以我举不出例子,我想你也同样举不出例子来,所以你的论点是对的,可惜和入侵性无关。
0 请登录后投票
   发表时间:2009-09-01  
你的代码里,没用到 Spring 的类,就是没有被 Spring 侵入的。
当然,整个工程里,总会有点代码用到 Spring 的。

非侵入,不如叫:“少侵入”
0 请登录后投票
论坛首页 Java企业应用版

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