`

Spring-Context注解 @Repository、@Service、@Controller 和 @Component

阅读更多

转自:http://blog.csdn.net/ye1992/article/details/19971467

@Repository、@Service、@Controller 和 @Component 将类标识为Bean

Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发。@Repository注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO类上即可。同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用Bean 的自动扫描功能,这可以通过<context:component-scan/>实现。如下所示:

 // 首先使用 @Repository 将 DAO 类声明为 Bean 
 package bookstore.dao; 
 @Repository 
 public class UserDaoImpl implements UserDao{ …… } 

 // 其次,在 XML 配置文件中启动 Spring 的自动扫描功能
 <beans … > 
    ……
 <context:component-scan base-package=”bookstore.dao” /> 
……
 </beans> 

 

如此,我们就不再需要在 XML 中显式使用 <bean/> 进行Bean 的配置。Spring 在容器初始化时将自动扫描 base-package 指定的包及其子包下的所有 class文件,所有标注了 @Repository 的类都将被注册为 Spring Bean。

为什么 @Repository 只能标注在 DAO 类上呢?这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。

Spring 2.5 在 @Repository的基础上增加了功能类似的额外三个注解:@Component、@Service、@Constroller,它们分别用于软件系统的不同层次:

  • @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
  • @Service 通常作用在业务层,但是目前该功能与 @Component 相同。
  • @Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。

通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。

另外,除了上面的四个注解外,用户可以创建自定义的注解,然后在注解上标注 @Component,那么,该自定义注解便具有了与所@Component 相同的功能。不过这个功能并不常用。

当一个 Bean 被自动检测到时,会根据那个扫描器的 BeanNameGenerator 策略生成它的 bean名称。默认情况下,对于包含 name 属性的 @Component、@Repository、 @Service 和@Controller,会把 name 取值作为 Bean 的名字。如果这个注解不包含 name值或是其他被自定义过滤器发现的组件,默认 Bean 名称会是小写开头的非限定类名。如果你不想使用默认 bean命名策略,可以提供一个自定义的命名策略。首先实现 BeanNameGenerator接口,确认包含了一个默认的无参数构造方法。然后在配置扫描器时提供一个全限定类名,如下所示:

 <beans ...> 
 <context:component-scan 
    base-package="a.b" name-generator="a.SimpleNameGenerator"/> 
 </beans> 

 

与通过 XML 配置的 Spring Bean 一样,通过上述注解标识的Bean,其默认作用域是"singleton",为了配合这四个注解,在标注 Bean 的同时能够指定 Bean 的作用域,Spring2.5 引入了 @Scope 注解。使用该注解时只需提供作用域的名称就行了,如下所示:

 @Scope("prototype") 
 @Repository 
 public class Demo { … } 

 

如果你想提供一个自定义的作用域解析策略而不使用基于注解的方法,只需实现 ScopeMetadataResolver接口,确认包含一个默认的没有参数的构造方法。然后在配置扫描器时提供全限定类名:

 <context:component-scan base-package="a.b"
 scope-resolver="footmark.SimpleScopeResolver" /> 
分享到:
评论

相关推荐

    Spring注解@Component、@Repository、@Service、@Controller区别.doc

    Spring 注解@Component、@Repository、@Service、@Controller 区别 在 Spring 框架中,@Component、@Repository、@Service、@Controller 是四个常用的注解,它们都是继承自 @Component 注解,用于标注不同的组件或 ...

    Spring注解 @Component、@Repository、@Service、@Controller区别

    通过配置`&lt;context:component-scan&gt;`标签,Spring可以在指定的包下自动扫描带有`@Component`、`@Repository`、`@Service`或`@Controller`注解的类,并将它们自动注册为bean。这种方式极大地提高了开发效率,特别是在...

    spring-context-3.0.2.release.jar.zip

    开发者可以使用`&lt;bean&gt;`标签来定义Bean,或者使用`@Component`、`@Service`、`@Repository`和`@Controller`等注解将类标记为Bean,让Spring自动扫描并管理。 其次,Spring-Context 3.0.2 RELEASE增强了对AOP(面向...

    spring-context-3.0.0.RELEASE.jar.zip

    1. **注解驱动**:3.0版本进一步加强了对注解的支持,如@Component、@Service、@Repository和@Controller等,使得无XML配置成为可能。 2. **泛型集合的类型安全注入**:允许在Bean定义中使用泛型,Spring可以自动...

    Spring扫描器—spring组件扫描使用详解

    它会遍历指定包及其子包下的所有类,寻找带有特定注解(如@Service、@Component、@Repository、@Controller等)的类,并将这些类实例化为Spring容器中的bean。通过这种方式,我们可以避免手动编写大量的XML配置,...

    Spring @compenent注解详解

    这个注解及其派生注解(如`@Service`、`@Repository`和`@Controller`)是Spring依赖注入(Dependency Injection, DI)机制的基础。在这篇文章中,我们将深入探讨`@Component`注解的各个方面,以及如何在实际应用中...

    Spring配置文件spring-context.zip

    7. `&lt;context:component-scan&gt;`:通过注解扫描特定包下的类,自动发现并注册带有特定注解(如@Controller、@Service、@Repository和@Service)的bean。 8. `&lt;context:annotation-config&gt;`:激活对注解的处理,如@...

    spring4注解

    该注解通常配合`&lt;context:component-scan&gt;`使用,以便Spring能够自动检测和实例化标记了此注解的类。 - **@Repository**: 主要用于数据访问层(DAO层)的类,它可以提供额外的功能,如异常转换等。 - **@Service**: ...

    spring注解笔记

    在本节中,我们主要介绍几个Spring中常用的注解,它们分别是@Component、@Controller、@Service和@Repository,这些注解用于将Java类声明为Spring管理的Bean。 #### 2. @Component注解 @Component是一个通用的构...

    spring-mvc-4.2.xsd.zip

    而`&lt;context:component-scan&gt;`则用于扫描指定包下的所有类,自动发现带有`@Component`、`@Service`、`@Repository`和`@Controller`等注解的bean。 `spring-mvc-4.2.xsd.txt`可能是该xsd文件的文本格式,方便开发者...

    Spring_mvc注解

    - 对于服务层的实现类,可以使用 `@Service` 注解。例如: ```java @Service("userService") public class UserServiceImpl implements UserService { // 实现服务接口的方法 } ``` 4. **Repository 层**: ...

    Spring注解笔记

    - **组件自动扫描**:Spring提供了一种机制,能够在类路径下自动扫描并发现标注了特定注解(如@Component、@Service、@Controller、@Repository)的类,并将其注册为Spring容器中的Bean。 - **配置示例**: ```xml ...

    spring @Component注解原理解析

    在 Spring 框架中,@Component 注解有多种衍生注解,如 @Controller、@Service、@Repository 等,这些注解都是 @Component 注解的子集,它们分别用于标注控制器、业务层和数据访问层的 Bean。 在使用 @Component ...

    spring3.x注解

    在 Spring 3.x 中,提供了多种用于类注册的注解,如 @Component、@Repository、@Service、@Controller 等。 1. @Component @Component 注解是所有受 Spring 管理组件的通用形式,默认的名称(id)是小写开头的非...

    Spring2.5_注解介绍(3.0通用)

    - `@Service`、`@Repository`和`@Component`:这组注解是Spring中的组件注解,用于标记业务层、数据访问层和通用组件类。它们都是`@Component`的特殊形式,提供了一些默认的语义。 - `@Scope`:用于定义bean的作用...

    Spring_Annotation_IOC代码

    为了解决这一问题,Spring引入了注解,如`@Autowired`、`@Component`、`@Service`、`@Repository`和`@Controller`等,它们可以用于类、方法、参数等多个层面,以声明式的方式进行配置。 ### 2. `@Component`家族 -...

    spring使用注解依赖jar

    除了依赖注入,Spring还提供了一些其他的注解,如`@Component`、`@Service`、`@Repository`和`@Controller`,它们用于定义不同类型的bean,帮助Spring容器管理这些bean的生命周期。 1. `@Component`:这是最基础的...

    springboot学习思维笔记.xmind

    @Service在业务逻辑层(service层) @Repository在数据访问层(dao层) @Controller在展现层(MVC→SpringMVC) 注入Bean的注解 @Autowired:Spring提供的注解 @Inject:JSR-330提供的注解 ...

    2-Spring注解1

    - `@Service`、`@Repository`和`@Controller`:这些是@Component的子注解,分别用于标记业务层、数据访问层和控制层的Bean。 5. **Spring的自动扫描** 为了启用注解配置,Spring需要知道在哪里寻找带有注解的类...

    spring-framework-3.2.5.RELEASE.rar

    例如,通过`@Component`、`@Service`、`@Repository`和`@Controller`注解声明bean,然后通过`@Autowired`自动装配依赖。 7. **最佳实践** 在实际项目中,为了充分利用Spring的优势,开发者应遵循一些最佳实践,如...

Global site tag (gtag.js) - Google Analytics