Finder image unix vector serialization plugins jboss angular material vue绑定点击事件 后台界面模板 access教学视频 jq去空格 软件测试项目实战案例 mysql默认密码 java两个数组合并 oracle取第一条数据 chrome发送post请求 git下载代码到本地命令 axure导出html文件 svn安装后右键不显示 python如何注释 python关键字 python的re模块 java的instanceof java文件读写 java网页 摩斯电码翻译器 winterboard 今日头条邀请码 ps从入门到精通 相册制作工具 万能低格工具还原u盘 正则表达式数字 调试js 冬青黑体简体中文 机械换装 js数组操作 js弹出框 zepto下载 联发科p22
当前位置: 首页 > 学习教程  > 编程语言

Spring 注解面面通 之 @Component、@Controller、@Service、@Repository

2020/11/24 10:00:21 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

注解简介 经典的MVC模式中,Model表示数据层、View表示视图层、Controller表示业务控制层。Spring通过Controller、Service、Repository实现此模式,Repository对应数据层(Model),Controller和Service对应业务控制层&…

  注解简介

  经典的MVC模式中,Model表示数据层、View表示视图层、Controller表示业务控制层。Spring通过@Controller@Service@Repository实现此模式,@Repository对应数据层(Model),@Controller@Service对应业务控制层(Controller),但是进行了细分。

  @Component@Controller@Service@Repository四个注解均位于源码路径org.springframework.stereotype下。

  注解详解

注解项注解描述
@Component带有@Component注解的类是"组件",例如除@Controller@Service@Repository定义外的组件
@Controller带有@Controller注解的类是"控制",如常见的Web控制,主要用于进行请求控制处理
@Service带有@Service注解的类是"服务",主要用于进行业务逻辑处理
@Repository带有@Repository注解的类是"存储",主要用于数据访问处理

  · 当使用基于这些注解的类路径扫描时,被注释的类会自动装载到Spring Bean工厂。

  · 自动扫描需通过<context:component-scan />配置来开启,<context:component-scan />实际包括了<context:annotation-config />配置,开启基于注解的配置管理。

  · @Controller@Service@Repository@Component在广义角度来看,都代表组件,他们之间并没有明显的差别,甚至可以相互替代使用。

  · @Controller@Service@Repository@Component在狭义角度来看,比如基于MVC模型的Web应用角度,每个注解都有其专有领域,@Controller与其他注解的差异较大,Spring围绕@Controller进行了一系列处理和增强,以保证暴露的Http服务尽可能满足业务需求,@Controller不能被替代,但是@Service@Repository@Component并没有十分明确的差异,但为了保证代码逻辑的清晰度,尽量按照注解含义进行应用。

  注解示例

  1)Controller类,用来处理接入的请求。

package com.arhorchin.securitit.stereotype.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.arhorchin.securitit.stereotype.bean.SecReqVo;
import com.arhorchin.securitit.stereotype.bean.SecResVo;
import com.arhorchin.securitit.stereotype.component.SecComponent;
import com.arhorchin.securitit.stereotype.service.SecService;

/**
 * @author Securitit.
 * @note Controller示例.
 */
@Controller
@RequestMapping("")
public class SecController {

    @Autowired
    private SecService secService;

    @Autowired
    private SecComponent secComponent;

    @ResponseBody
    @RequestMapping("/person/query")
    public SecResVo queryPersonInfo(SecReqVo secReqVo) throws Exception {
        SecResVo secResVo = null;

        secResVo = secService.queryPersonInfo(secReqVo);
        secResVo.setAge(secComponent.incrAge(secResVo.getAge()));
        return secResVo;
    }

}

  2)Service接口和实现类,用来进行业务层处理。

package com.arhorchin.securitit.stereotype.service;

import com.arhorchin.securitit.stereotype.bean.SecReqVo;
import com.arhorchin.securitit.stereotype.bean.SecResVo;

/**
 * @author Securitit.
 * @note Service接口.
 */
public interface SecService {

    public SecResVo queryPersonInfo(SecReqVo secReqVo) throws Exception;
    
}
package com.arhorchin.securitit.stereotype.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.arhorchin.securitit.stereotype.bean.SecReqVo;
import com.arhorchin.securitit.stereotype.bean.SecResVo;
import com.arhorchin.securitit.stereotype.repository.SecRepository;
import com.arhorchin.securitit.stereotype.service.SecService;

/**
 * @author Securitit.
 * @note Service实现.
 */
@Service
public class SecServiceImpl implements SecService {

    @Autowired
    private SecRepository secRepository;
    
    @Override
    public SecResVo queryPersonInfo(SecReqVo secReqVo) throws Exception {
        return secRepository.queryPersonInfo(secReqVo);
    }

}

  3)Repository接口和实现类,此处没有连接数据库,仅生成Bean并填充值。

package com.arhorchin.securitit.stereotype.repository;

import com.arhorchin.securitit.stereotype.bean.SecReqVo;
import com.arhorchin.securitit.stereotype.bean.SecResVo;

/**
 * @author Securitit.
 * @note Repository接口.
 */
public interface SecRepository {

    public SecResVo queryPersonInfo(SecReqVo secReqVo) throws Exception;
    
}
package com.arhorchin.securitit.stereotype.repository.impl;

import org.springframework.stereotype.Service;

import com.arhorchin.securitit.stereotype.bean.SecReqVo;
import com.arhorchin.securitit.stereotype.bean.SecResVo;
import com.arhorchin.securitit.stereotype.repository.SecRepository;

/**
 * @author Securitit.
 * @note Repository实现.
 */
@Service
public class SecRepositoryImpl implements SecRepository {

    @Override
    public SecResVo queryPersonInfo(SecReqVo secReqVo) throws Exception {
        SecResVo secResVo = null;
        
        secResVo = new SecResVo();
        if("Securitit".equals(secReqVo.getName())) {
            secResVo.setName("Securitit");
            secResVo.setAge(30);
        } else {
            secResVo.setName("Securitit");
            secResVo.setAge(0);
        }
        return secResVo;
    }

}

  4)Component类,类似工具类,用来对VOage属性进行处理。

package com.arhorchin.securitit.stereotype.component;

import org.springframework.stereotype.Component;

/**
 * @author Securitit.
 * @note 自定义Spring组件.
 */
@Component("SecComponent")
public class SecComponent {

    public Integer incrAge(int age) {
        return age + 10;
    }

}

  5) 建请求和响应的VO类,用来承载请求和响应的数据。

package com.arhorchin.securitit.stereotype.bean;

/**
 * @author Securitit.
 * @note 请求Model示例.
 */
public class SecReqVo {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
package com.arhorchin.securitit.stereotype.bean;

/**
 * @author Securitit.
 * @note 响应Model示例.
 */
public class SecResVo {

    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

}

  6) 访问http://localhost:9199/spring-annotations/person/query.dohttp://localhost:9199/spring-annotations/person/query.do?name=Securitit来确认构建的内容。

在这里插入图片描述

在这里插入图片描述

  总结

  @Controller@Service@Repository是实际工作中比较常用的分层注解,相对来说,~使用比较少,一般应用在游离于MVC模型之外的Bean,比如期望Spring容器管理某工具类,则此时可以声明为,此时,在正常的MVC模型Bean`可以方便的引用。

  若文中存在错误和不足,欢迎指正!


本文链接: http://www.dtmao.cc/news_show_400202.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?