Spring之@Repository @Service @Component @Controller的区别和使用场景

1. @Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
2. @Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能,当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller来替代它,同时这些注解会具备有更多的功能,而且功能各异。
3. @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
4. @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
5. @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。

在这里插入图片描述
Component.class

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
    String value() default "";
}

Repository.class

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

Controller和Service的源码同样拥有Component的所有实现
{ @AliasFor(
annotation = Component.class
)}

简单实现@Repository注解的案例:

数据库dao


@Repository
public class ClassInfoDao implements ClassInfoImpl {

    @Autowired
    JdbcTemplate jdbcTemplate;
    
    @Override
    public List<Map<String, Object>>  getClasses() {
        List<Map<String, Object>> list = new ArrayList<>();
        String sql = "select * from exmaple_classes";
        List<Map<String, Object>> l = jdbcTemplate.queryForList(sql);
        if (l != null && l.size() > 0) {
            list.addAll(l);
        }
        return list;
    }
}

前端请求接口实现


@RestController
@RequestMapping("/test")
public class TestRestController {

    @Autowired
    ClassInfoDao classInfoBean;

    @PostMapping("/classes")
    public Map userInfo(@RequestBody PostUserBean postUserBean){
        Map map = new HashMap() ;
        if (postUserBean == null || postUserBean.getName() == null ||!postUserBean.getName().equals("邱工")){
            map.put("msg","请传入{“Name:邱工”}");
        } else {
            map.put("classInfo",classInfoBean.getClasses());
//            if (postUserBean.getClsName() != null&& postUserBean.getClsName().length() != 0 ){
//                map.put("selectById",classInfoBean.selectById(postUserBean.getClsName()));
//            }
        }
        return map ;
    }
}

请求结果:
在这里插入图片描述

Spring 注解 @Autowired 和@Resource 的区别
1、@Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上。
2、@Autowired属于Spring的;@Resource为JSR-250标准的注释,属于J2EE的。
3、@Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false),如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:

@Autowired() 
@Qualifier("baseDao")
private BaseDao baseDao;

4、@Resource,默认安装名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource(name="baseDao")
private BaseDao baseDao;

文章来源:@Component, @Repository, @Service的区别+@Autowired 和@Resource 的区别

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

将哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值