SpringFramework实战指南(五)
-
-
- 4.3 基于 注解 方式管理 Bean
-
- 4.3.1 实验一: Bean注解标记和扫描 (IoC)
- 4.3.2 实验二: 组件(Bean)作用域和周期方法注解
- 4.3.3 实验三: Bean属性赋值:引用类型自动装配 (DI)
- 4.3.4 实验四: Bean属性赋值:基本类型属性赋值 (DI)
- 4.3.5 实验五: 基于注解+XML方式整合三层架构组件
-
4.3 基于 注解 方式管理 Bean
4.3.1 实验一: Bean注解标记和扫描 (IoC)
-
注解理解
和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作。
本质上:所有一切的操作都是 Java 代码来完成的,XML 和注解只是告诉框架中的 Java 代码如何执行。
举例:元旦联欢会要布置教室,蓝色的地方贴上元旦快乐四个字,红色的地方贴上拉花,黄色的地方贴上气球。
班长做了所有标记,同学们来完成具体工作。墙上的标记相当于我们在代码中使用的注解,后面同学们做的工作,相当于框架的具体操作。
-
扫描理解
Spring 为了知道程序员在哪些地方标记了什么注解,就需要通过扫描的方式,来进行检测。然后根据注解进行后续操作。
-
准备Spring项目和组件
- 准备项目pom.xml
<dependencies>
<!--spring context依赖-->
<!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.6</version>
</dependency>
<!--junit5测试-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.1</version>
</dependency>
</dependencies>
2. 准备组件类
普通组件
/**
* projectName: com.atguigu.components
*
* description: 普通的组件
*/
public class CommonComponent {
}
Controller组件
/**
* projectName: com.atguigu.components
*
* description: controller类型组件
*/
public class XxxController {
}
Service组件
/**
* projectName: com.atguigu.components
*
* description: service类型组件
*/
public class XxxService {
}
Dao组件
/**
* projectName: com.atguigu.components
*
* description: dao类型组件
*/
public class XxxDao {
}
- 组件添加标记注解
-
组件标记注解和区别
Spring 提供了以下多个注解,这些注解可以直接标注在 Java 类上,将它们定义成 Spring Bean。
-
注解 | 说明 |
---|---|
@Component | 该注解用于描述 Spring 中的 Bean,它是一个泛化的概念,仅仅表示容器中的一个组件(Bean),并且可以作用在应用的任何层次,例如 Service 层、Dao 层等。 使用时只需将该注解标注在相应类上即可。 |
@Repository | 该注解用于将数据访问层(Dao 层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
@Service | 该注解通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
@Controller | 该注解通常作用在控制层(如SpringMVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
![](http://heavy_code_industry.gitee.io/code_heavy_industry/assets/img/img017.93fb56c5.png)
通过查看源码我们得知,@Controller、@Service、@Repository这三个注解只是在@Component注解的基础上起了三个新的名字。
对于Spring使用IOC容器管理这些组件来说没有区别,也就是语法层面没有区别。所以@Controller、@Service、@Repository这三个注解只是给开发人员看的,让我们能够便于分辨组件的作用。
注意:虽然它们本质上一样,但是为了代码的可读性、程序结构严谨!我们肯定不能随便胡乱标记。
2. 使用注解标记
普通组件
/**
* projectName: com.atguigu.components
*
* description: 普通的组件
*/
@Component
public class CommonComponent {
}
Controller组件
/**
* projectName: com.atguigu.components
*
* description: controller类型组件
*/
@Controller
public class XxxController {
}
Service组件
/**
* projectName: com.atguigu.components
*
* description: service类型组件
*/
@Service
public class XxxService {
}
Dao组件
/**
* projectName: com.atguigu.components
*
* description: dao类型组件
*/
@Repository
public class XxxDao {
}
-
配置文件确定扫描范围
情况1:基本扫描配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="