spring annotation,spring 注解,spring 注解扫描 | AiTi修炼|重剑无锋,拈花微笑
  • Spring »
  • Spring注解不能不知道的注解扫描组件
Header
Header

Spring注解不能不知道的注解扫描组件

一、写在前面的导语

 过往将spring的学习存于个人笔记中,恰好近期陆续有时间在整理,故打算将一些个人学习、实践使用spring的经历整理到博客来,一来是方便那些与对技术充满好奇之心的新学习者借鉴,二来是方便自己将笔记再次梳理,方便后续的体系化。

 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

二、spring注解扫描组件

  • spring注解基本术语

 自从Spring 2.5开始,spring就提供了更多典型化注解(stereotype annotations): @Component、@Service和 @Controller。@Component是所有受Spring管理组件的通用形式;而@Repository、@Service和 @Controller则是@Component的细化,用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层)。也就是说,你能用@Component来注解你的组件类,但如果用@Repository、@Service 或@Controller来注解它们,你的类也许能更好地被工具处理,或与切面进行关联。例如,这些典型化注解可以成为理想的切入点目标。当然,在Spring Framework以后的版本中, @Repository、@Service和 @Controller也许还能携带更多语义。如此一来,如果你正在考虑服务层中是该用@Component还是@Service,那@Service显然是更好的选择。同样的,就像前面说的那样, @Repository已经能在持久化层中进行异常转换时被作为标记使用了。

  • 注解扫描组件

 sprig中提供了这个组件扫描组件,可以使我们非常方便的使用spring注解标识,降低以往在xml的大量配置工作,当然两种方式孰优孰劣不能简单来评价,需要具体场景需要而论。有了这个组件我们就可以在xml将另一个标签移除掉,因为 配置项不但启用了对类包进行扫描以实施注解驱动 Bean 定义的功能,同时还启用了注解驱动自动注入的功能(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor等),这将更方便我们使用,将程序的“懒惰性”进一步释放。

  • 简单却不失灵活

 相对来讲注解扫描组件的使用是非常简单的,但又不失灵活性,在中提供两个子标签:各代表引入和排除的过滤,方便使用者对于需要载入spring容器的资源按需进行控制。

 如下面示例,就是告诉spring框架,在配置中使用了context:component-scan注解扫描组件,且只针对源码中包路径为com.rscala.spring.budget的service包下类进行扫描初始化Bean。:

<context:component-scan base-package="com.rscala.spring.budget" >
<context:include-filter type="regex" expression=".service.*"/>
</context:component-scan>

filter标签在Spring3有五个type,如下:

Filter Type Examples Expression Description
annotation org.example.SomeAnnotation 符合SomeAnnoation的target class
assignable org.example.SomeClass 指定class或interface的全名
aspectj org.example..*Service+ AspectJ语法
regex org.example.Default.* Regelar Expression
custom org.example.MyTypeFilter Spring3新增自訂Type,实作org.springframework.core.type.TypeFilter
  • 注解配置与xml配置的使用场景总结

 是否有了这些IOC注解,我们就可以完全摒除原来XML配置的方式呢?答案是否定的。有以下几点原因:

 1、注解配置不一定在先天上优于XML配置。如果Bean的依赖关系是固定的,(如 Service 使用了哪几个 DAO 类),这种配置信息不会在部署时发生调整,那么注解配置优于 XML 配置;反之如果这种依赖关系会在部署时发生调整,XML 配置显然又优于注解配置,因为注解是对 Java 源代码的调整,您需要重新改写源代码并重新编译才可以实施调整。

 2、如果 Bean 不是自己编写的类(如 JdbcTemplate、SessionFactoryBean 等),注解配置将无法实施,此时 XML 配置是唯一可用的方式。

 3、注解配置往往是类级别的,而XML配置则可以表现得更加灵活。比如相比于 @Transaction 事务注解,使用 aop/tx 命名空间的事务配置更加灵活和简单。
 
 所以在实现应用中,我们往往需要同时使用注解配置和XML配置,对于类级别且不会发生变动的配置可以优先考虑注解配置;而对于那些第三方类以及容易发生调整的配置则应优先考虑使用 XML 配置。Spring 会在具体实施 Bean 创建和 Bean 注入之前将这两种配置方式的元信息融合在一起。

rscala.com版权所有,本文Spring注解不能不知道的注解扫描组件转载请注明出处:http://rscala.com/index.php/486.html

该文章归档分类于 Spring

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

*

code