1.Xml和Annotation的比较
相信大多人都使用过java的xml和annotation来作为配置项,xml拥有的功能annotation也拥有,这时对于何时使用xml,何时使用annotation产生的疑问。我们先来比较一下各自的优缺点:
| 优点 | 缺点 |
Xml | 1. xml 作为可扩展标记语言最大的优势在于开发者能够为软件量身定制适用的标记,使代码更加通俗易懂。 2.利用 xml 配置能使软件更具扩展性。例如 Spring 将 class 间的依赖配置在 xml 中,最大限度地提升应用的可扩展性。 3.具有成熟的验证机制确保程序正确性。利用 Schema 或 DTD 可以对 xml 的正确性进行验证,避免了非法的配置导致应用程序出错。 4.修改配置而无需变动现有程序。
| 1.需要解析工具或类库的支持。 2. 解析 xml势必会影响应用程序性能,占用系统资源。 3.配置文件过多导致管理变得困难。 4.编译期无法对其配置项的正确性进行验证,或要查错只能在运行期。 5.IDE无法验证配置项的正确性无能为力。 6.查错变得困难。往往配置的一个手误导致莫名其妙的错误。 7.开发人员不得不同时维护代码和配置文件,开发效率变得低下。 8.配置项与代码间存在潜规则。改变了任何一方都有可能影响另外一方。
|
Annotation | 1.保存在 class文件中,降低维护成本。 2.无需工具支持,无需解析。 3. 编译期即可验证正确性,查错变得容易。 4.提升开发效率。
| 1.若要对配置项进行修改,不得不修改 Java 文件,重新编译打包应用。 2.配置项编码在 Java 文件中,可扩展性差。
|
通过以上对比,细心的读者可能已经发现它们的优缺点恰恰是互补的。xml的强项是Annotation 所不具备的,而Annotation 的优势也是xml 所欠缺的。
那么何时应该采用xml,何时采用annotation呢?笔者认为涉及到像数据库等外围的配置时(这时非专业人士也可以来更改配置)采用xml,因为外围设备可能经常发生变动,而系统内部的一些,比如spring的bean就没有必要写到xml里了,因为这些配置是由开发人员来维护的,写到xml会浪费时间,影响开发效率。
2. springmvc的完全注解方式的使用
· spring扫描类
package com.aotain;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;;
@Configuration
//这个@ComponentScan非常重要,表面spring将会以该类所在的基础包向下扫描包中的所有Bean
@ComponentScan(basePackageClasses = AppConfig.class)
public class AppConfig {
}
· Web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 这里告诉web容器从哪里开始扫描,若使用xml,这里写xml所在路径 -->
<param-name>contextConfigLocation</param-name>
<param-value>com.aotain.AppConfig</param-value>
</init-param>
<!--这里配置解析bean的spring容器 -->
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
· 其他类
package com.aotain.dao;
import org.springframework.stereotype.Component;
@Component("jdbcAccess")
public class JdbcAccess {
//这里写数据库的相关逻辑
}
package com.aotain.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.aotain.dao.JdbcAccess;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
@Qualifier("jdbcAccess")
private JdbcAccess jdbcAccess;
@RequestMapping("/add")
public void add(){
System.out.println(jdbcAccess);
}
}
结果
在浏览器输入
http://ip:port/工程名/user/add便可打印出