spring3.0使用annotation完全代替XML

时间:2021-12-10 00:34:25

@Service与@Component有什么不同?那天被问到这个问题,一时之间却想不起来,就利用这篇文章来纪录spring3.0中常用的annotation。


从spring2.5开始,annotation结合BeanPostProcessor成了扩展Spring
IoC容器的常用方法。Spring2.5增加了对JSR-250中@Resource, @PostConstruct,
@PreDestroy的支持,Spring 3.0又增加了对JSR-330 (Dependency Injection for Java)中
@Inject,@Qualifier, @Named, @Provider的支持。将相关的jsr
jar包丢到classpath,并注册相应的BeanPostProcessor,其它的一切spring会帮你完成。spring还提供了一个简便的方法,通过在context的XML配置文件中加入:

  1. <context:annotation-config/>

spring 会自动注册AutowiredAnnotationBeanPostProcessor,
CommonAnnotationBeanPostProcessor,
RequiredAnnotationBeanPostProcessor,代码中就可以使用@Autowired,
@Required等annotaion了。



再回到文章开头的问题吧。spring从2.5开始加入了classpath scanning的功能,来代替之前在xml中定义Bean。首先在context的XML配置文件中加入:

  1. <context:component-scan base-package="org.example"/>

spring
便会在org.example以及它的子package中查找所有的类,将符合条件的Bean注册在IoC容器当中。到3.0,spring引入了4种原型annotation(stereotype
annotaion),分别为@Component, @Serivce, @Controller,
@Repository。一般情况下只在将类加上@Componet,spring在扫描classpath的时候会自动检测到,并将这个类注册到IoC

容器中,在代码的其它部分,便可以借助@Autowired来注入这个Bean。后面的三种原型分别是特殊的@Conponet,适用于更加特殊的场合,比如Service层,Spring
MVC, DAO等。这一点从源码上也可以看出:

  1. @Target({ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Component
  5. public @interface Service {
  6. String value() default "";
  7. }

@Service本身就是被@Componet这个元注解(meta annotaion)标注的。因此对于这三个层的Bean,
spring的文档也推荐将它们标注为@Service,
@Controller与@Repository,因为这样更方便其它工具对这些特殊Bean的处理以及为它们加上相关AOP的
aspects,spring在后续版本的升级上也可能对它们增加更多的特殊语义。至于它们到底比普通的@Componet多了哪些
aspects,spring的文档上并没有详细说明,只简单地提到了对于@Repository,spring会自动加上exception
translation,用于转化持久层抛出的异常。我google了一下,包括spring论坛的帖子,也没能找到这方面的详细信息,这点希望熟悉spring源代码的朋友能够说说。



现在通过classpath
scanning以及@Component,@Autowired等annotation,我们已无须通过xml来定义Bean了。但还必须在application

context的xml中添加<context:annotation-config/>与<context:component-scan

base-package="org.example"/>。再进一步想,能不能把这个配置文件也去掉,实现真正的零配置?spring3.0原先Spring
JavaConfig项目的功能移到了Spring
Core里面,从而实现了利用Java代码来代替传统的XML配置文件,这个功能是通过@Configuration, @Bean, @Import,
@DependsOn等annotation实现的。

  1. @Configuration
  2. public class AppConfig {
  3. @Bean
  4. public GreetingDao greetingDao() {
  5. return new GreetingDao();
  6. }
  7. }
  8. public class GreetingDao {
  9. public String getGreeting(){
  10. return "Hi";
  11. }
  12. }

@configuration表明这个类包含Bean的定义,@Bean在这里就相当于原先的配置:<bean
id="greetingDao"
class="septem.demo.GreetingDao"/>。通过AnnotationConfigApplicationContext就可以使用这个Bean了:

  1. @Test
  2. public void test_java_config(){
  3. AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
  4. GreetingDao dao = ctx.getBean(GreetingDao.class);
  5. assertEquals("Hi", dao.getGreeting());
  6. }

注意AppConfig里面的greetingDao虽然是是直接new出来的,但它的默认scope仍是singleton,跟采用配置文件的情况是一样的,如果需要prototype,则可以另外为它加上@Scope("prototype")。上面采用的方法是手工将Bean定义在
@Configuration里面,我们同样可以让spring自动检测Bean,比如下面的GreetingSerivce:

  1. @Service
  2. public class GreetingService {
  3. public String sayHello(){
  4. return "Hello";
  5. }
  6. }

将GreetingService标注为@Service,就不需要在AppConfig里面注册了:

  1. @Test
  2. public void test_service(){
  3. AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
  4. ctx.scan("septem.demo");
  5. ctx.refresh();
  6. GreetingService service = ctx.getBean(GreetingService.class);
  7. assertEquals("Hello", service.sayHello());
  8. }

以上的ctx.scan("septem.demo")就相当于配置文件:<context:component-scan
base-package="septem.demo"/>。注意因为@Configuration本身也是被@Component这个meta-annotation标注的,所以AppConfig也不需要手工在
AnnotationConfigApplicationContext里注册,它同@Service一样会被自动检测到。Spring3.0还提供了
AnnotationConfigWebApplicationContext用来代替原先web项目中的
XmlWebApplicationContext,这样在web项目中同样可以实现真正的零配置了。Spring的官方文档还提供了针对更复杂情况的处理方法,有兴趣的朋友可以看看。

spring3.0使用annotation完全代替XML的更多相关文章

  1. spring3&period;0使用annotation完全代替XML&lpar;三&rpar;

    很久之前写过两篇博客: spring3.0使用annotation完全代替XML spring3.0使用annotation完全代替XML(续) 用java config来代替XML,当时还遗留下一些 ...

  2. spring3&period;0使用annotation完全代替XML&lpar;续&rpar;

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

  3. Spring3&period;0 入门进阶&lpar;三&rpar;&colon;基于XML方式的AOP使用

    AOP是一个比较通用的概念,主要关注的内容用一句话来说就是"如何使用一个对象代理另外一个对象",不同的框架会有不同的实现,Aspectj 是在编译期就绑定了代理对象与被代理对象的关 ...

  4. Spring3&period;0 与 MyBatis框架 整合小实例

    本文将在Eclipse开发环境下,采用Spring MVC + Spring + MyBatis + Maven + Log4J 框架搭建一个Java web 项目. 1. 环境准备: 1.1 创建数 ...

  5. 开发基础框架:mybatis-3&period;2&period;8 &plus;hibernate4&period;0&plus;spring3&period;0&plus;struts2&period;3

    一:项目下载地址(点击 Source code(zip)) https://github.com/fzxblgong/frame_2014-12-15/releases 版本:v1.2大小:20M 二 ...

  6. MyEclipse-10&period;0下Struts2&period;1&plus;Spring3&period;0&plus;Hibernate3&period;3整合过程

    新建web project: 命名为SSH,做如下设置: 新建后的工程目录如下: 然后开始添加SSH框架,这里我按照struts-spring-hibernate顺序进行添加. 首先添加struts2 ...

  7. 模块化之Spring3&period;0 web fragment和gradle构建项目

      1.背景 模块化开发很久以前就开始普及的概念.但是到了企业实际情况中,真正把模块化作为系统架构的核心的不多.或者说对模块化有这个意识,但是具体到底该如何实现,有些模糊,同时也许因为项目紧.任务中. ...

  8. Spring3&period;0之后-&gt&semi;Spring MVC过滤器-HiddenHttpMethodFilter

    浏览器form表单只支持GET与POST请求,而DELETE.PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET.POST.PUT ...

  9. spring3&period;0结合Redis在项目中的运用

    推荐一个程序员的论坛网站:http://ourcoders.com/home/ 以下内容使用到的技术有:Redis缓存.SpringMVC.Maven.项目中使用了redis缓存,目的是在业务场景中, ...

随机推荐

  1. x&colon;bind不支持样式文件 或 此Xaml文件必须又代码隐藏类才能使用&lbrace;x&colon;Bind&rcub; 解决办法

    这两天学习UWP开发,发现一个很有趣的问题,就是我题目中的描述的. 我习惯了在ResourceDictionary中写样式文件,但是发现用x:Bind时会有问题 如果是写在Style里,则提示 “x: ...

  2. codeforces 336 Div&period;2 B&period; Hamming Distance Sum

    题目链接:http://codeforces.com/problemset/problem/608/B 题目意思:给出两个字符串 a 和 b,然后在b中找出跟 a 一样长度的连续子串,每一位进行求相减 ...

  3. 夺命雷公狗---node&period;js---20之项目的构建在node&plus;express&plus;mongo的博客项目5mongodb在项目中实现添加数据

    我们上一步就引入了mongodb了,那么下一步就要开始写添加数据了,不过有个前提是先将表单的数据处理好: 最基本的这部现在已经成功了,因为最基本的这步就是先将表单处的提交方式和提交地址给处理好,这里和 ...

  4. 【Linux】自动化部署可信任登录

    Linux信任登录,免密码登录的脚本: 需要安装expect,可以yum也可以编译安装,编译后注意脚本中的expect路径. rsa.exp #!/usr/bin/expect ########### ...

  5. SEO优化的黑帽手法是否值得使用&quest;

    PR劫持 可能很多人也会听到说,什么网站权重越高越好,这也就是后面越来越多人都对谷歌的PR的宣传看的很重,自建站的都追求PR值,权重越高代表这个网站越受信任. 比如一个新站PR值为0,一个老站PR为6 ...

  6. 凡客副总裁被曝离职:或因IPO受阻&vert;凡客&vert;王春焕&vert;离职&lowbar;互联网&lowbar;新浪科技&lowbar;新浪网

    凡客副总裁被曝离职:或因IPO受阻|凡客|王春焕|离职_互联网_新浪科技_新浪网 凡客副总裁被曝离职:或因IPO受阻 2013年05月07日 00:56   每日经济新闻    我有话说     每经 ...

  7. Python内置函数&lpar;33&rpar;——any

    英文文档: any(iterable) Return True if any element of the iterable is true. If the iterable is empty, re ...

  8. 批量执行工具PSSH详解

    批量执行工具PSSH详解 pssh是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,使用必须在各个服务器上配置好密钥认证访问. 安装pssh包 yum 安 ...

  9. window下php5&period;5安装redis扩展

    redis是现在比较流行的noSQL,主流大型网站都用的比较多,很多同学不知道怎么安装,这里介绍在windows下面安装以及扩展,提供学习使用,实际使用环境多在Linux下. 1.phpinfo(), ...

  10. MD5&lowbar;Util工具类代码

    package com.yby.mall.utils; import java.math.BigInteger; import java.security.MessageDigest; public ...