常用的注解有如下几种:@Component、 @Repository 、@Service、 @Controller 、@Autowired 、@Resource 、@Qualifier。下面列出一个表格,详细的介绍一下它们。
注解名称 | 注解描述 |
@Component | 可以使用这个注解去描述Spring中的Bean,是一个泛化的概念,标注于Java类上,表示该类是一个组件,可用于任何层次。 |
@Repository | 其功能和@Component相同,将@Component细化,用于标识数据访问层(DAO层)的类,工程层次看起来更加清晰。 |
@Service | 其功能和@Component相同,将@Component细化,用于标识业务层(Service层)的类,工程层次看起来更加清晰。 |
@Controller | 其功能和@Component相同,将@Component细化,用于标识控制器(Controller),工程层次看起来更加清晰。 |
@Autowired | 用于对Bean的属性变量,属性的setter方法以及构造方法进行标注,配合对应的注解处理器完成bean的自动配置。默认按照Bean的类型进行装配。 例:UserDAO userDAO;Bean的类型为 UserDAO, Bean的实例名称为 userDAO @Autowired 的 执行步骤如下。
|
@Resource | 用于对Bean的属性变量,属性的setter方法以及构造方法进行标注,配合对应的注解处理器完成bean的自动配置。默认按照Bean的实例名称进行装配。 例:UserDAO userDAO;Bean的类型为 UserDAO, Bean的实例名称为 userDAO |
@Qualifier | 与@Autowired配合使用,会将 默认按照Bean的模式进行装配 改为 默认按照Bean的实例名称进行装配,Bean的实例名称由@Qualifier的参数指明。 |
下面给出工程的源码,创建一个 spring 工程可参考 : IntelliJ IDEA 创建 第一个 Spring 项目 (入门实例),创建完项目后再添加这个jar 包:javax.annotation-api-1.3.2.jar。jar包可以自行下载,也可以在云盘里面下载:https://pan.baidu.com/s/1G9JWQjusUgiAZd7lXKjeVw 提取码:xr3z 。项目的工程目录如下:
2.1 service 层源码
UserService.java 源代码如下:
package com.study.spring.service;
public interface UserService {
public void save();
}
UserServiceImpl.java 源代码如下:
package com.study.spring.service.impl;
import com.study.spring.dao.UserDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.study.spring.service.UserService;
import javax.annotation.Resource;
@Component("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
@Resource
private UserDAO userDAO01;
public void save() {
this.userDAO.save();
this.userDAO01.save();
System.out.println("userService save...");
}
}
2.2 DAO层源码
DAO 中有一个用户接口,两个用户接口的实现类。
UserDAO.java 源代码如下:
package com.study.spring.dao;
public interface UserDAO {
public void save();
}
UserDAOImpl.java 源代码如下:
package com.study.spring.dao.impl;
import com.study.spring.dao.UserDAO;
import org.springframework.stereotype.Repository;
@Repository("userDAO")
public class UserDAOImpl implements UserDAO {
@Override
public void save() {
System.out.println("userDao save ...");
}
}
UserDAOImpl01.java 源代码如下:
package com.study.spring.dao.impl;
import com.study.spring.dao.UserDAO;
import org.springframework.stereotype.Repository;
@Repository("userDAO")
public class UserDAOImpl implements UserDAO {
@Override
public void save() {
System.out.println("userDao save ...");
}
}
2.3 控制器源码
UserController.java 源代码如下:
package com.study.spring.controller;
import org.springframework.stereotype.Controller;
import com.study.spring.service.impl.UserServiceImpl;
import javax.annotation.Resource;
@Controller("userController")
public class UserController {
@Resource(name = "userService")
private UserServiceImpl userService;
public void save() {
this.userService.save();
System.out.println("userController save...");
}
}
2.4 测试类
test.java 源代码如下:
package com.study.spring.test;
import com.study.spring.controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
public static void main(String args[]) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController userController = (UserController) context.getBean("userController");
userController.save();
}
}
2.5 applicationContext.xml
3.1 测试一
运行 test.java , 运行截图如下。
3.2 测试二
将 @Repository("userDAO") 修改 为 @Repository,运行 test.java , 报错,错误截图如下:
错误原因:如果按照Bean的类型查询的结果不止一个,那么@Autowired会根据名称来查找。如果根据名称查询,查询的结果为空,报出异常。
3.3 测试三
添加 @Qualifier 注解 , 如下:
运行截图:
原因:@Qualifier与@Autowired配合使用,会将 默认按照Bean的模式进行装配 改为 默认按照Bean的实例名称进行装配,Bean的实例名称由@Qualifier的参数指明