Spring注解系列一

Spring在程序员的圈子里可以说是大名鼎鼎,关于Spring的知识点都可以写好几本书了。你新爷目前还没有那么大本事去写任何一本关于spring的书籍,这里我只是想简单总结一下Spring常用的注解。Spring经过这么多年的发展,功能变得越来越完善,野心也越来越大,什么都想做,具体可以去看Spring官网。你新爷刚入行的时候,spring还是2.X版本,当时做WEB开发的标准三件套还是Struct+Spring+Hibernate。

当年的三剑客现在也只有Spring活的越来越好,现在已经到5.X版本了,而且已经发展成了集团军作战。现在搞web工程,Spring MVC基本已经成了事实标准。当年那个年代,Spring只负责类的注入。现在不一样了,现在Spring全都管了。而且使用方式也跟以前大不相同,以前Spring要配合大量的XML配置文件使用。把所有注入的类,通过XML配置来实现。现在推荐使用注解来实现。
这样有个好处就是不用再写那么多配置文件了。不写配置文件能带来什么好处呢,这好处还真有,就是当你看代码的时候不用总是在配置文件和JAVA代码之间跳来跳去了。用了注解之后,配置和代码浑然融为一体,看起来简单了,写起来也简单了,精神倍儿舒畅。但是唯一的麻烦就是程序员有需要多学一些东西了。

下面开始正题,一句话简单介绍Spring的注解。

  1. @Compoent : 作用在类上,通用组件注解,在不知道具体分到哪一类时使用,基本不推荐使用。
  2. @Controller : 作用在类上。表示这个类是MVC里面的Controller。通常方法需要配合注解@RequestMapping使用。
  3. @Service : 作用在类上。在Spring mvc 表示服务层,具体业务逻辑写到这一层。
  4. @Repository : 作用在类上。用于表示在跟数据库相关的操作,就是常说的DAO层。
  5. @Resource: 作用在类或者字段上,作用在字段上不用写Setter方法。Java提供的注解,默认通过名字注入,当找不到与名称匹配的bean时才按照类型进行装配。
  6. @Autowired : 作用在类或者字段上,作用在字段上不用写Setter方法。Spring提供的注解,默认按照类型注入。
  7. @Qualifier: 作用在类上,当创建多个类型相同的bean时,可以通过该注解消除混乱,指定一个具体类来配合@Autowired使用。

注意:
在使用注解的时候,我们需要在配置文件中添加 <context:annotation-config/>。该配置表示向Spring容器注册以下注解解释器
AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor
有了注解解释器,注解才能正常工作。我在《JAVA注解详解》那篇博文里面已经介绍过原理了。
假设你想使用@Autowired注解,那么就必须事先在Spring容器中声明 AutowiredAnnotationBeanPostProcessor
传统声明方式如下

1
<bean class = "org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/>

这样显然太麻烦了,使用<context: annotation-config/>会帮助我们自动完成以上这些配置。
这个配置是不是很厉害,别着急还有更让你高兴的呢,我们使用注解一般都会配置扫描包的路径,比如

1
<context:component-scan base-package = “com.frank”/>

该配置项其实也包含了自动注入上述processor的功能,因此当使用<context: component-scan/>后,就可以将<context: annotation-config/>移除了。也就是说写了<context: component-scan/> 就不用使用 <context: annotation-config/> 这个配置了。

比如:<context: component-scan base-package = "Controller, Service,Dao"/> 就是把controller,service,dao下的注解全部扫描了。
另外 <context: annotation-config/> 还提供了两个子标签。

  1. <context: include-filter/> 指定扫描路径。
  2. <context: exclude-filter/>排除扫描的路径。
    <context: component-scan/>有一个use-default-filters属性,默认为true,表示会扫描指定包下全部标有@Component(@Service,@Reposity@Component的子注解)的类,并注册成bean。当我们想指定扫描某些包的路径的时候可以这样配置。
1
2
3
<context: component-scan base-package="com.frank" use-default-filters="false">
<context: include-filter type="regex" expression="com.frank.controller.*"/>
</context: component-scan>

表示只扫描controller下面的包。<context: exclude-filter>使用方式类似,只不过表达的是相反的意思。

-------------本文结束-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%