专栏首页java干货Spring系列十四: Spring @Component, @Controller, @Repository and @Service

Spring系列十四: Spring @Component, @Controller, @Repository and @Service

少小虽非投笔吏,论功还欲请长缨。

概述

spring自动装配中,@Autowired注解只处理连接部分。我们仍然需要定义bean,以便容器能够识别它们并为我们注入它们。

使用@Component@Repository@Service@Controller注解,并启用自动组件扫描,Spring将自动将bean导入容器并注入依赖项。这些注解也被称为原型注解。

在开始使用这些注解之前,我们先快速了解一下关于这些注解的事实,这将帮助我们更好地决定何时使用哪个注解。

Spring bean原型注解

@Component注解

@Component注解将java类标记为bean,因此spring的组件扫描机制可以获取它并将其拉入应用程序上下文。要使用此注解,请将其应用于类,如下所示:

@Component
public class EmployeeDAOImpl implements EmployeeDAO {
    // ...
}

@Repository注解

尽管上面使用@Component足够好,但是我们可以使用更合适的注解,该注解专门为DAO提供些额外的功能,即@Repository注解。@Repository注解是@Component注解的特化,具有相似的用途和功能。除了将DAO导入DI容器之外,它还使未经检查的异常(从DAO方法抛出)转换为Spring DataAccessException

@Service 注解

@Service注解也是@Component注解的特殊化。目前,它没有提供@Component注解以外的任何其他行为,但是最好在服务层类中使用@Service而不是@Component,因为它可以更好地指定意图。此外,其他行为和工具可能会依赖它。

@Controller 注解

@Controller注解将一个类标记为Spring Web MVC控制器。它也是@Component特殊化,因此标有它的bean将自动导入DI容器中。当我们将@Controller注解添加到一个类时,我们可以使用另一个注解,即@RequestMapping。将URL映射到类的实例方法。

在实际使用中,我们将遇到非常罕见的情况,需要使用@Component注解。大多数时候,我们将使用@Repository@Service@Controller注解。当该类不属于控制器,业务层和dao这三个类别中的任何一个类别时,应使用@Component

如果我们想自定义DI容器中注册的bean的名称,则可以在注解属性本身中传递名称,例如@Service(“ employeeManager”)

启用组件扫描

以上四个注解仅在由Spring框架的DI容器扫描时才进行扫描和配置。要启用此扫描,我们将需要在applicationContext.xml文件中使用context:component-scan标记。

<context:component-scan base-package="cn.howtodoinjava.demo.service" />
<context:component-scan base-package="cn.howtodoinjava.demo.dao" />
<context:component-scan base-package="cn.howtodoinjava.demo.controller" />

context:component-scan元素需要一个base-package属性,顾名思义,该属性指定了递归组件搜索的起点。我们可能不希望将顶层软件包交给spring,所以应该声明三个component-scan元素,每个元素都具有指向不同软件包的base-package属性。

使用@Component@Repository@Service@Controller注解

正如我已经说过的,在DAO,管理器和控制器类上使用@Repository@Service@Controller注解。但是在现实生活中,在DAO和业务员层,我们通常有单独的类和接口。接口用于定义契约,类用于定义契约的实现。

始终在具体的类上的实现上添加注解;而不是通过接口。

public interface EmployeeDAO
{
    //...
}
 
@Repository
public class EmployeeDAOImpl implements EmployeeDAO
{
    //...
}

bean上具有这些构造型注解后,就可以直接使用在具体类中定义的bean引用。请注意,引用是类型接口。在这种情况下,Spring DI容器足够聪明,可以注入正确的实例。

@Component@Bean注解之间的区别

Spring中,两个注解大不相同。

@Component用于使用类路径扫描自动检测和自动配置bean。在带注解的类和Bean之间存在隐式的一对一映射(即每个类一个Bean)。

@Bean用于显式声明单个bean,而不是让Spring为我们自动完成。

另一个很大的不同是@Component是类级别的注释,其中@Bean是方法级别的注释,默认情况下,方法的名称用作Bean名称。

测试

Bean定义

public interface EmployeeDAO
{
    public EmployeeDTO createNewEmployee();
}
 
@Repository ("employeeDao")
public class EmployeeDAOImpl implements EmployeeDAO
{
    public EmployeeDTO createNewEmployee()
    {
        EmployeeDTO e = new EmployeeDTO();
        e.setId(1);
        e.setFirstName("Lokesh");
        e.setLastName("Gupta");
        return e;
    }
}
public interface EmployeeManager
{
    public EmployeeDTO createNewEmployee();
}
 
@Service ("employeeManager")
public class EmployeeManagerImpl implements EmployeeManager
{
    @Autowired
    EmployeeDAO dao;
     
    public EmployeeDTO createNewEmployee()
    {
        return dao.createNewEmployee();
    }
}
@Controller ("employeeController")
public class EmployeeController
{
        @Autowired
    EmployeeManager manager;
     
    public EmployeeDTO createNewEmployee()
    {
        return manager.createNewEmployee();
    }
}
public class EmployeeDTO {
 
    private Integer id;
    private String firstName;
    private String lastName;
}

运行测试用例

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import cn.howtodoinjava.demo.service.EmployeeManager;
 
public class TestSpringContext
{
    public static void main(String[] args)
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
 
        //EmployeeManager manager = (EmployeeManager) context.getBean(EmployeeManager.class);
         
        //OR this will also work
         
        EmployeeController controller = (EmployeeController) context.getBean("employeeController");
         
        System.out.println(controller.createNewEmployee());
    }
}

输出:

Jan 22, 2015 6:17:57 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1b2b2f7f:
startup date [Thu Jan 22 18:17:57 IST 2015]; root of context hierarchy
 
Jan 22, 2015 6:17:57 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
 
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
 
Employee [id=1, firstName=Lokesh, lastName=Gupta]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 两个原因导致Spring @Autowired注入的组件为空

    原文链接:https://www.moreofless.co.uk/spring-mvc-java-autowired-component-null-repos...

    三分恶
  • kotlin整合spring cglib问题分析

    此时在浏览器中访问:http://localhost:8080/api/test/list的方法栈如下:

    开发架构二三事
  • Spring的一些注解解析

    @Repository、@Service、@Controller 和 @Component 将类标识为Bean spring 自 2.0 版本开始,陆续引入了一...

    用户1220053
  • Spring中重要的注解

    现在大部分的Spring项目都会用到注解。使用注解来替换xml,一行简单的注解就可以解决很多事情。但是你真的懂其中的原理吗。

    yunlgonn
  • <context:component-scan> 配置 —— 分库遇到问题(1)

    相信有些人看到我贴出来的配置就知道我要说明什么问题了,如果你还是没有头绪的话,可以看下我遇到的问题。 这个配置文件本来是想要扫描 xxx包下面的Control...

    日薪月亿
  • Spring基础知识之依赖注入

    Spring框架的四大原则:   1)使用POJO进行轻量级和最小侵入式的开发。   2)通过依赖注入和基于接口编程实现松耦合。   3)通过AOP和默认习惯进...

    用户1134788
  • 【刨根问底】在Springboot中MVC的常用注解<上>

    我们再实际开发过程中一般大致为三层:controller/service/dao或者repository。其中本文最要是分享controller层相关的注解使用...

    田维常
  • 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration

    现在大部分的Spring项目都采用了基于注解的配置,采用了@Configuration 替换标签的做法。一行简单的注解就可以解决很多事情。但是,其实每一个注解背...

    格姗知识圈
  • 原创 | 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration

    现在大部分的Spring项目都采用了基于注解的配置,采用了@Configuration 替换标签的做法。一行简单的注解就可以解决很多事情。但是,其实每一个注解背...

    cxuan
  • 测试开发之Spring篇(三)

    参与代码编译,以@开头,类似与添加注释,又不是注释,它的作用是将类或方法与特定的应用程序相关联。

    muntainyang
  • Java EE之SSM框架整合开发 -- (3) Spring Bean

    在Spring的应用中,Spring IOC容器可以创建、装配和配置应用组件对象,这里的组件对象称为Bean。本章我们主要讲述Spring中Bean的配置、Be...

    浩Coding
  • Spring 注解比较,@Bean 和 @Component的区别

    本文打算介绍几个不太容易说出其区别,或者用途的 Spring 注解,比如 @Component 与 @Bean 的比较,@ControllerAdvice 是如...

    良月柒
  • 精进Spring—Spring常用注解【经典总结】

    Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式...

    Java编程指南
  • 【Spring】Spring基础配置-依赖注入

    Spring框架本身有四大原则: 1、使用POJO进行轻量级和最小侵入式开发 2、通过依赖注入和基于接口编程实现松耦合 3、通过AOP和默认习惯进行...

    谙忆
  • Spring 注解编程之模式注解

    Spring 框架中有很多可用的注解,其中有一类注解称模式注解(Stereotype Annotations),包括 @Component, @Service,...

    andyxh
  • Spring 注解大全

    @Autowired标记Spring将要解析和注入的依赖项。我们可以使用构造函数、setter或字段注入来使用这个注释。

    终身幼稚园
  • springboot注解  转载自:springboot注解

    我们的Example类上使用的第一个注解是 @RestController 。这被称为一个构造型(stereotype)注解。它为阅读代码的人们提供建议。对于S...

    用户1518699
  • Spring Boot 最最最常用的注解梳理

    @SpringBootApplication: 包含了@ComponentScan、@Configuration和@EnableAutoConfiguratio...

    芋道源码
  • SpringBoot 注解大全,收藏一波!!!

    @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration...

    后端码匠

扫码关注云+社区

领取腾讯云代金券