MENU

浅谈Spring三大注解:@Repository、@Service、@Controller

概述

最近在复习Spring基础的时候又踩了很多坑,今天来谈谈这三个注解
@Repository :dao层
@Service:service层
@Controller:controller层(web层)

0x00 套路

controller调用service,service调用dao。也就是常见的MVC三层模型。

0x01 UserDao

先来瞧瞧最后被调用的dao

import org.springframework.stereotype.Repository;

@Repository("userDao")
public class UserDao {
    public void add() {
        System.out.println("dao - add()");
    }
}

@Repository注解用于dao层,这里给它指定了一个id,"userDao"
给它指定id的原因是上一层里用到了@Qualifier注解
另外如果这里用到接口,例如UserDao是接口,UserDaoImpl1和UserDaoImpl2都是这个接口的实现类,那就需要给他们分别指定id,也就是要用@Qualifier注解来确定实例化哪个实现类
当然,在实际开发中一般都是自动扫描包下Dao的,本文不涉及,所以暂且不谈。

0x02 UserService和UserServiceImpl

这里想提一句,为什么要用接口。

  1. 比较官方一点的说法就是“解耦”(为了实现低耦合高内聚),其实简单来讲就是为了开发和维护方便。比如一个项目先进行Web层开发,如果想调用service层的业务逻辑,但是service层还没写,这时候用接口的好处就体现出来了——上层随意调用而不用管下层是否实现。也就是常说的不需要知道方法的具体实现,加快开发速度。
  2. 另外就是可以对Service写多个实现类,进行不同业务逻辑处理。
  3. 最后一点就是Spring的AOP和事务管理都是基于动态代理的,动态代理的实现依赖于接口,所以有接口的定义才能使用。

UserService接口很简单,里面定义了一个add()方法

//UserService.java
public interface UserService {
    public void add();
}

接下来用UserServiceImpl实现这个接口

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    @Qualifier("userDao")    //这里指定了要注入的UserDao的id
    private UserDao userDao;    //定义成员变量userDao
    
    @Override
    public void add() {
        userDao.add();    //直接调用userDao的add()方法
    }
}

应用了@Service、@Autowire以及@Qualifier注解
@Service注解是给Web层用的,声明了本类是一个Service,后两个注解则是调用Dao层的。
事实上这里不使用Qualifier也是可以的,因为例子中Dao层没使用接口,只有一个Dao的实现类,直接按类型注入就可以了。

0x03 UserController

UserController也是一样,注入Service就可以了。

@Controller("userController")
public class UserController {
    @Autowired
    @Qualifier("userService")
    private UserService userService;
    
    public void add() {
        userService.add();
    }

一样的道理,@Qualifier注解也可以不用

0x04 测试

最后来测试一下

public class TestAnno {
    @Test
    public void demo1() {
        String xmlPath="com/wanvale/spring/a/beans.xml";
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
        UserController userController=applicationContext.getBean("userController",UserController.class);
        userController.add();
    }
}

0x05 总结

其实归根结底就是三句话:
控制层用@Controller,Service层用@Service,Dao层用@Repository。
注入用@Autowire的,需要指定id就用@Qualifier。
注入后根据正常情况下调用方法就可以了。

古人诚不我欺,接触了项目回过头再看看基础才发现,坑更多了


文章标题:浅谈Spring三大注解:@Repository、@Service、@Controller
如果文中内容侵犯了您的权益,请及时与博主取得联系进行删除!
本站文章未经许可禁止转载,本文地址:https://blog.wanvale.com/archives/58/

Last Modified: June 20, 2020
Archives QR Code Tip
QR Code for this page
Tipping QR Code