感谢各位一年多的陪伴,因内容调整,本站将于近日迁移到新域名并不再更新主要内容。
特此通知。
概述
最近在复习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
这里想提一句,为什么要用接口。
- 比较官方一点的说法就是“解耦”(为了实现低耦合高内聚),其实简单来讲就是为了开发和维护方便。比如一个项目先进行Web层开发,如果想调用service层的业务逻辑,但是service层还没写,这时候用接口的好处就体现出来了——上层随意调用而不用管下层是否实现。也就是常说的不需要知道方法的具体实现,加快开发速度。
- 另外就是可以对Service写多个实现类,进行不同业务逻辑处理。
- 最后一点就是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。
注入后根据正常情况下调用方法就可以了。
古人诚不我欺,接触了项目回过头再看看基础才发现,坑更多了