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的注解。
@Compoent
: 作用在类上,通用组件注解,在不知道具体分到哪一类时使用,基本不推荐使用。 @Controller
: 作用在类上。表示这个类是MVC里面的Controller。通常方法需要配合注解@RequestMapping使用。 @Service
: 作用在类上。在Spring mvc 表示服务层,具体业务逻辑写到这一层。 @Repository
: 作用在类上。用于表示在跟数据库相关的操作,就是常说的DAO层。 @Resource
: 作用在类或者字段上,作用在字段上不用写Setter方法。Java提供的注解,默认通过名字注入,当找不到与名称匹配的bean时才按照类型进行装配。 @Autowired
: 作用在类或者字段上,作用在字段上不用写Setter方法。Spring提供的注解,默认按照类型注入。 @Qualifier
: 作用在类上,当创建多个类型相同的bean时,可以通过该注解消除混乱,指定一个具体类来配合 @Autowired
使用。 注意:
在使用注解的时候,我们需要在配置文件中添加 <context:annotation-config/>
。该配置表示向Spring容器注册以下注解解释器
AutowiredAnnotationBeanPostProcessor
, CommonAnnotationBeanPostProcessor
, PersistenceAnnotationBeanPostProcessor
, RequiredAnnotationBeanPostProcessor
。
有了注解解释器,注解才能正常工作。我在《JAVA注解详解》那篇博文里面已经介绍过原理了。
假设你想使用 @Autowired
注解,那么就必须事先在Spring容器中声明 AutowiredAnnotationBeanPostProcessor
。
传统声明方式如下
<bean class = "org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/>
这样显然太麻烦了,使用 <context: annotation-config/>
会帮助我们自动完成以上这些配置。
这个配置是不是很厉害,别着急还有更让你高兴的呢,我们使用注解一般都会配置扫描包的路径,比如
<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/>
还提供了两个子标签。
<context: include-filter/>
指定扫描路径。 <context: exclude-filter/>
排除扫描的路径。 <context: component-scan/>
有一个 use-default-filters
属性,默认为 true
,表示会扫描指定包下全部标有 @Component
( @Service
, @Reposity
是 @Component
的子注解)的类,并注册成bean。当我们想指定扫描某些包的路径的时候可以这样配置。 <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>使用方式类似,只不过表达的是相反的意思。