首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

spring3.0应用annotation完全代替XML(续)

2012-09-22 
spring3.0使用annotation完全代替XML(续)上一篇文章还有些话没说完,没想到一拖就是2周,所以干脆另开一篇吧

spring3.0使用annotation完全代替XML(续)
上一篇文章还有些话没说完,没想到一拖就是2周,所以干脆另开一篇吧。

从回帖的反应来看,大多数人还是不赞成完全代替XML的,这点倒是在意料之中。我个人还是倾向于用代码来取代XML的Bean定义,当然这更多的是关乎个人偏好,不代表与我观点不同的人就是错的。

先来说说代码相对于XML的优点吧:

   1. 更加简洁,相对于XML的“语法”,java来得更熟悉
   2. 类型安全,更大程度上发挥java静态语言的特性
   3. 对重构更加友好

再说说用annotation代替XML的可能性吧,目前看来是不大可能,主要还存在以下的限制:

1. java的语言文化

不知道还有哪门语言比java更加依赖XML,尤其是做web开发。在JDK5之前,没有annotation的时代,用XML来记录一些补充语义,似乎也没有比这更理想的方案。这些年用着用着大家就习惯了,于是不再有人去质疑。回头看看平时使用的各种大大小小的框架,除了Bob Lee开发的google guice,没有哪个从最初的设计开始就抛开XML的,在java主流文化的影响下拿出这么“非主流”的作品,难怪他自称crazybob。好在这些情况在慢慢好转,annotation以及CoC等观念被越来越多的人接受。

2. spring本身的限制

spring2.0开始引入的schema与namespace大大简化了XML Bean的定义,比如<tx:annotation-driven />,简单一行就开启了用annotation来配置事务的功能(还记得spring1.x的时候需要多少行来配置事务吗?)。换做用 @Configuration要如何实现?这个时候只能深入spring的细节,找出<tx:annotation-driven />注册的所有bean,一个一个地在AppConfig.java中手工定义。我之前想过写一个插件来解决这个问题,即通过代码定义一个简单的bean就可以实现namespace这样的功能。后来在spring的jira上发现了spring3.1即将提供这样的支持,在基于java的配置中增加以下高级配置的功能:

    * Enabling annotation-driven transaction management (<tx:annotation-driven/>)
    * Enabling annotation-driven scheduling (<task:annotation-driven/>)
    * Enabling AspectJ auto-proxying (<aop:aspectj-autoproxy)
    * Enabling domain object DI with @Configurable (<aop:spring-configured/>)
    * Enabling property-placeholder replacement (<context:property-placeholder/>)
    * Enabling AspectJ load-time weaving (<context:load-time-weaver/>)
    * Enabling MBean Export (<context:mbean-export/>)
    * Enabling component scanning (<context:component-scan/>)
    * Performing JNDI lookups (<jee:jndi-lookup/>)
    * Looking up local and remote stateless session beans (<jee:local-slsb/>; <jee:remote-slsb/>)

所以这个问题在未来的版本中也会得到解决

总结:所以我觉得java-based configuration会是一个趋势。说来惭愧,像python, ruby等语言不早就这么做了吗?看看django, rails,里面的配置不都是用自己的语言来写吗?大家都玩得这么High,java怎么能缺席呢?
@Configurationpublic class AppConfig {@Value("#{datasource.url}")private String databaseUrl;@Value("#{datasource.driver}")private String driverName;@Value("#{datasource.username}")private String username;@Value("#{datasource.password}")private String password; @Bean(destroyMethod = "close") public BasicDataSource dataSource(){ BasicDataSource dataSource = new BasicDataSource(); dataSource.setUrl(databaseUrl); dataSource.setDriverClassName(driverName); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; }}
像数据库连接等所有依赖外部环境的配置都可以放到properties里面,再通过spring el注入到代码中来@Configurationpublic class AppConfig {@Value("#{datasource.url}")private String databaseUrl;@Value("#{datasource.driver}")private String driverName;@Value("#{datasource.username}")private String username;@Value("#{datasource.password}")private String password; @Bean(destroyMethod = "close") public BasicDataSource dataSource(){ BasicDataSource dataSource = new BasicDataSource(); dataSource.setUrl(databaseUrl); dataSource.setDriverClassName(driverName); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; }}
像数据库连接等所有依赖外部环境的配置都可以放到properties里面,再通过spring el注入到代码中来

Spring的数据源配置还是不建议这样做。数据源这种不容易的变得东西是可以用annotation的,但变化主要在于大量Action,Bs,Dao,用annotation就要改代码。其实你的数据源这样做,还是要读取xml配置文件,不划算的。一般我们像下面这样在xml里面做配置就可以包括连接池和数据源一次性解决。

<bean id="dataSource" destroy-method="close"><property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /><property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" /><property name="username" value="name" /><property name="password" value="111111" /></bean>
17 楼 septem 2010-09-04   zzy9zzy 写道其实你的数据源这样做,还是要读取xml配置文件

不大明白你的意思。。。像driverClassName之类的数据库连接配置是放在properties文件里的,通过spring el注入到代码中,本来就没有xml,何来还是要读取xml之说?

对于这种外部环境的配置,都放在properties文件中,也可以避免因修改配置而走测试流程。但我还是觉得需要不需要测试不能简单地根据是修改代码还是修改xml来判断。如果你用xml来描述bean之间的依赖关系,修改xml就代表bean之间的依赖关系变了,对于这些影响比较大的变动,不也应该仔细地测试一下吗?

而且很多时候修改xml是由代码改动引起的,比如某个类被重命名了。。。 18 楼 slaser 2010-09-05   个人觉得java可读性比xml差。如上面的用java配置数据源,我觉得很SB.因为我开发中确实经常改数据源的。而且我觉得数据源就该是配置,和代码有毛关系。哪个简单,直接比行数就可以了。 19 楼 septem 2010-09-05   slaser 写道个人觉得java可读性比xml差。如上面的用java配置数据源,我觉得很SB.因为我开发中确实经常改数据源的。而且我觉得数据源就该是配置,和代码有毛关系。哪个简单,直接比行数就可以了。

还是第一次听说xml的可读性比java好。。。个人的习惯是很难改变的,用你觉得舒服的方式就好,没必要纠结于这些细节。。。

是不是很多人都没看明白帖子啊,数据源的配置是放在properties里面的,即使改也是改properties,这点跟你用代码还是xml无关。。。

行数是会比xml多几行,不过也仅仅是多几行而已,差别不大,相对来说,写代码总比写xml舒服一些吧。。。
20 楼 slaser 2010-09-05   septem 写道slaser 写道个人觉得java可读性比xml差。如上面的用java配置数据源,我觉得很SB.因为我开发中确实经常改数据源的。而且我觉得数据源就该是配置,和代码有毛关系。哪个简单,直接比行数就可以了。

还是第一次听说xml的可读性比java好。。。个人的习惯是很难改变的,用你觉得舒服的方式就好,没必要纠结于这些细节。。。

是不是很多人都没看明白帖子啊,数据源的配置是放在properties里面的,即使改也是改properties,这点跟你用代码还是xml无关。。。

行数是会比xml多几行,不过也仅仅是多几行而已,差别不大,相对来说,写代码总比写xml舒服一些吧。。。

你觉得写java舒服估计是有API提示的原因。
对于数据源这种相对固定的配置,没几个人记不住。

IOC关系定义这块确实有争议。说说我所遇到的工作环境,经常有项目被转移给别人做,对于有经验的人,要明白代码,首先看applicationContext.xml. 这个比看annotation快多了。

21 楼 jcs7575 2010-09-05   xml配置还是很必要的,可以集中很多信息,很方便的,annotation比较分散

除非用annotation比xml性能有很大提升,否则即使有个三方的工具之类的东西可以提取出所有anntoation 也还是没有xml来的方便快捷。 22 楼 zzy9zzy 2010-09-06   septem 写道zzy9zzy 写道其实你的数据源这样做,还是要读取xml配置文件

不大明白你的意思。。。像driverClassName之类的数据库连接配置是放在properties文件里的,通过spring el注入到代码中,本来就没有xml,何来还是要读取xml之说?

对于这种外部环境的配置,都放在properties文件中,也可以避免因修改配置而走测试流程。但我还是觉得需要不需要测试不能简单地根据是修改代码还是修改xml来判断。如果你用xml来描述bean之间的依赖关系,修改xml就代表bean之间的依赖关系变了,对于这些影响比较大的变动,不也应该仔细地测试一下吗?

而且很多时候修改xml是由代码改动引起的,比如某个类被重命名了。。。

properties和xml不是一个意思嘛,都是配置文件。对了,你的项目是不是不用Spring啊,我记得以前不用Spring做项目的时候,确实是把数据库配置放在properties里面的,那你的做法我还是赞同的。 23 楼 septem 2010-09-06   zzy9zzy 写道
properties和xml不是一个意思嘛,都是配置文件。对了,你的项目是不是不用Spring啊,我记得以前不用Spring做项目的时候,确实是把数据库配置放在properties里面的,那你的做法我还是赞同的。
我接触到的项目,不管用什么框架,数据库连接等配置都是放在properties里面的

热点排行