一. 配置扫描路径
前面创建 Spring 项目和简单使用一文中说到(如何创建一个 Spring 项目并简单使用), 在获取 Spring 的上下文对象时, 是先去 配置文件中读取, 获得 Spring 容器. 因此, 在使用更简单的存 Bean 对象的注解时, 我们也需要进行配置文件
<?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:content="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置扫描路径, 指定要扫描那个路径底下的类注解, 不在该包底下或者在该包底下不加五大类注解都不能读取 --> <!-- 在component-scan 下的子包下加了五大类注解一样可以加入到bean中 --> <content:component-scan base-package="demo1.java"></content:component-scan> </beans>
想要用注解的方式将 Bean 对象注册到 Spring 容器中 , 就需要配置 content: component-scan base-package="具体包路径", 只有配置包路径地下的所有类, 添加了注解才能被正确识别到注册到 Spring 中
二. 简单存储 Bean 的五大类注解
1. @Controller 注解
同样的, 要进行注册到 Spring 容器中, 需要先创建 Bean 对象(普通 Java 对象)
创建好了对象以后, 采用三步走获取 Bean 对象并使用
调用方法成功, 表示成功获取指定 Bean 对象
@controller 表示的是业务逻辑层
2. @Service 注解
同上面一样, 创建 Bean 对象并添加注解进行获取使用
调用方法成功
3. @Repository 注解
调用方法成功
4. @Component 注解
调用方法成功
@Component 组件存储
5. @Configuration 注解
调用方法成功
6. Bean 的命名规则
上面的五大类注解中, 都会发现一个问题: 那就是这里的获取 Bean 对象时, 使用的不在是 spring-config.xml 里的指定 Bean 标签的 id 和类 类型的组合获取 Bean 对象, 哪该如何获取类注解下注入的 Bean 对象呢?
下面看一组示例
调用方法验证
此时我们发现, 和上面五大类注解讲解的时候是一样的获取方法, 但是现在却报错了这是为什么? 仔细看不难发现, 之前的五大类讲解时, 都是类名首字母大写, 而这里是类名的首字母和第二个字母都大写, 因此, 此处我们就要去看看 Bean 的命名规则到底是如何讲解的了
public static String decapitalize(String name) { if (name == null || name.length() == 0) { return name; } if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))){ return name; } char chars[] = name.toCharArray(); chars[0] = Character.toLowerCase(chars[0]); return new String(chars); }
以上为 BeanName 的命名源码, 从上面源码可以看出, 当 首字母和第二个字母都大写的时候, 直接放回当前类名
7. 为什么有这么多相同功能的类注解
细心的可以发现, 上面五大类注解都干了同一件事, 那就是将 Bean 对象注入到 Spring 容器中, 那为什么还需要搞这么多个类注解呢? 是否有这个疑问?
8. 五大类注解之间有关系嘛?
既然功能都是差不多, 那么他们之间有什么关系嘛?
就这个问题, 去看他们的源码
1. @Controller 源码
2. @Service 源码
3. @Repository 源码
4. @Configuration 源码
5. @Component 源码
通过观察上述源码, 发现五大类注解中, 都包含有 @Target @Retention @Documented 注解 ,
同时 除了 @Component 注解外, 其余四个注解都包含了 @Component 注解
因此, 我们可以知道, 其他四个注解都是 @Component 注解的子类