基于注解的装配方式
在Spring中,使用XML配置文件可以实现Bean的装配工作,但在实际开发中如果Bean的数量过多,导致XML配置文件过于臃肿,给后期维护和升级带来一定的困难。为解决此问题,Spring提供了注解,通过注解也可以实现Bean的装配。
Spring常用注解:
注解 | 描述 |
---|---|
@Component | 指定一个普通的Bean,可以作用在任何层次 |
@Controller | 指定一个控制器组件Bean,用于将控制层的类标识为Spring中的Bean,功能上等同于@Component |
@Service | 指定一个业务逻辑组件Bean,用于将业务逻辑层的类标识为Spring中的Bean,功能上等同于@Component |
@Repository | 指定一个数据访问组件Bean,用于将数据访问层的类标识为Spring中的Bean,功能上等同于@Component |
@Scope | 指定Bean实例的作用域 |
@Value | 指定Bean实例的注入值 |
@Autowired | 指定要自动装配的对象 |
@Resource | 指定要注入的对象 |
@Qualifier | 指定要自动装配的对象名称,通常与@Autowired联合使用 |
@PostConstruct | 指定Bean实例完成初始化后调用的方法 |
@PreDestroy | 指定Bean实例销毁前调用的方法 |
注解装配示例:
第一步: 在IDEA中创建新的Maven项目,然后在pom.xml文件中加载需要使用到的Spring四个基础包(spring-core-5.2.8.RELEASE.jar、spring-beans-5.2.8.RELEASE.jar、spring-context-5.2.8.RELEASE.jar、spring-expression-5.2.8.RELEASE.jar)以及Spring的一个依赖包(commons-logging-1.2.jar),除此之外,还要导入spring-aop-5.2.8.RELEASE.jar依赖包:
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-aop</artifactId>
- <version>5.2.8.RELEASE</version>
- </dependency>
- 复制代码
第二步: 创建applicationContext.xml,在该文件中引入Context约束并启动Bean的自动扫描功能(扫描出包下所有的类,进行注解解析)
- <context:component-scan base-package="com.hexiaoxing"/>
- 复制代码
第三步: 定义实体类,新建entity包,在entity包下创建User实体类
- @Component("student")
- @Scope("singleton")
- public class User{
- @Value("2020001234")
- private int stuId;
- @Value("何小幸")
- private Spring name;
- //省略getter、setter和toString()
- }
- 复制代码
第四步: 定义dao层,创建StudentDao接口作为数据访问层接口,并在StudentDao接口中声明save()方法,用于查询Student实体的对象信息
- package com.hexiaoxing.dao
- public interface StudentDao{
- public void save();
- }
- 复制代码
第五步: 创建StudenDaoImpl作为StudenDao的实现类,并在StudenDaoImpl类中实现StudentDao接口中的save()方法
- @Repository("studentDao")
- public class UserDaoImpl implements StudentDao{
- public void save(){
- ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
- Student student = (Student)applicationContext.getBean("student");
- System.out.println(student);
- System.out.println("执行UserDaoImpl.save()");
- }
- }
- 复制代码
第六步: 定义service层,创建StudentService接口作为业务逻辑层接口,并在StudentService接口中定义save()方法
- package com.hexiaoxing.service
- public interface StudentService{
- public void save();
- }
- 复制代码
第七步: 定义service层,创建StudentServiceImpl作为StudentService的实现类,并在StudentServiceImpl类中实现StudentService接口中的save()方法
- @Service("studentService")
- public class StudentServiceImpl implements StudentService{
- //使用@Resource注解注入StudentDao
- @Resource(name="studentDao")
- private StudentDao studentDao;
- public void save(){
- this.studentDao.save();
- System.out.println("执行StudentServiceImpl.save()");
- }
- }
- 复制代码
第八步: 定义controller层,创建StudentController类作为控制层
- @Controller
- public class StudentController{
- //使用@Resource注解注入StudentDao
- @Resource(name="studentDao")
- private StudentService studentService;
- public void save(){
- this.studentService.save();
- System.out.println("执行StudentController.save()");
- }
- }
- 复制代码
到目前,我们定义了student类,在dao层定义并实现了save()接口方法,方法中获取了student对象,在service中也定义了save来调用dao层的save,就这样,controller->service->dao三层,分别调用上一层的save方法
第九步: 定义测试类,在类中通过Spring容器加载配置文件并获取UserController实例,然后调用实例中的save()方法,查看结果