Spring 原始注解
1. 基本认识
- Spring 是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替 xml 配置文件,可以简化配置,提高开发效率。
Spring 原始注解主要是替代 Spring 配置文件中
标签的配置: 
2. 原始注解入门操作


但是这样进行注解配置后程序会报错:
NoSuchBean?因为我们没有告诉 Spring 要在哪里找到注解,找不到注解那就没办法帮我们创建 Bean 对象了!所以我们接下来还要在 Spring 配置文件中配置组件扫描:
上面这句话的意思就是 Spring 会在 cn.wrj 包中以及该包的所有子包中进行扫描,一旦扫描到注解,就会进行识别!
接下来我们测试一下是否成功:
成功了!3. 原始注解详解1
3.1 @Component 注解改进
@Component 注解表示 Spring 只要扫描到这个注解,就会帮你创建对应的 id 值的对象到 Spring 容器中!
@Component 注解可以下面三个注解替代,让语义更加明确!

3.2 注解注入不需要 Set 方法



程序仍然可以运行。
所以,我们如果用 Spring 配置文件进行反射注入,则我们需要写 Set 方法,而如果我们用注解进行注入,则不用 Set 方法。3.3 @Autowired
@Autowired 可以按照需要注入的数据类型在 Spring 容器中自动找到一个符合的且唯一的 Bean 进行注入。

所以,把@Qualifier 注解删掉仍然可以进行注入,因为此时 Spring 容器中只存在一个 UserDao 类型的 Bean,需要注意的是,如果 spring 容器中存在多个 UserDao 类型的 Bean 那此时的容器则不知道该注入哪一个!3.4 @Qualifier
该注解是根据 id 值名称在 Spring 容器中找到对应的 Bean 进行注入,但此注解必须结合 @Autowired 一起使用!
3.5 @Resource

@Resource 可以直接单独使用,并且是根据 id 值在 Spring 容器中找 Bean 进行注入。
直接一行搞定。
但是!JDK8 之后,若想使用 @Resource 注解需要在 pom.xml 中导入一个依赖,不然就用不了!<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>4. 原始注解详解2
4.1 @Value
该注解直接用传入的普通数据类型进行注入。
这里的应用场景就是当 Spring 加载了数据库配置文件后,我们可以用 Spring 表达式来为其进行注入。
之前:

4.2 @Scope
4.3 @PostConstruct 与 @PreDestroy

Spring 新注解
1. 基本介绍
原始注解对非自己创建的类是没办法进行注解的,比如我们要创建一个数据源的 Bean ,就只能在 Spring 配置文件中进行配置,而无法使用注解。
(你**也可以使用注解,比如你要注解 Druid 数据源,你可以到阿里巴巴的公司内部,把 Druid 数据源的源代码复制一份到你的电脑里,然后使用注解配置!哈哈哈,笑死)**
所以我们引入了新注解。
学习完这些新注解后,下面的配置文件中的配置就可以全部被替换掉:
2. 新注解详解
2.1 @Configuration
详解之前,我们要有一个思想:我们要用一个核心的配置文件类去完全替代配置文件!

这样就可以用配置**类去代替配置文件;用注解去代替标签**。
2.2 @ComponentScan
该注解是组件扫描注解,功能是:扫描指定包及其子包下的所有已存在的注解。
2.3 @Bean
之前在配置文件中配置 Druid 数据源:
现在在核心配置类中用注解配置 Druid 数据源:
但此时你可以看到我画线的地方和数据库配置文件没有半毛钱关系,完全用不到数据库配置文件,是耦合死的,所以接下来我们要用注解加载数据库配置文件!
2.4 @PropertySource
用 Spring 加载数据库配置文件:
然后就可以将 2.3 中获取 Durid 数据源方法与数据库配置文件进行解耦,使用 Spring 表达式:

但你以为这样没错嘛?
肯定有错!Spring 表达式只能在 Spring 配置文件中供 Spring 去解析,但在 Java 类中这样写只是表示一个字符串!!!!哈哈哈,笑死!应该这样搞:
我们不是已经将数据库配置文件加载进Spring 容器里了吗?
那就用注解进行注入!
Spring 表达式要想在 Java 类中被解析,只能借助与 Spring 提供的注解!
然后将 driver 传进去就行了:
2.5 @Import
像配置文件一样,一个配置文件中可以导入另一个配置文件,我们的核心配置类也可以导入其他配置类。
比如可以把数据库的配置抽成一个数据库配置类,然后再用 @Import 注解导入到核心配置类中:
然后在核心配置类中导入该数据库配置类就行了:
注意 @Import 标签传进去的是一个数组,因为一个核心配置文件可能需要多个配置类!
** 2.6 使用注解方式获取 Spring 容器 :new AnnotationConfigApplicationContext( 核心配置类.class )
使用注解配置后,获取 Spring 容器的方式也发生了变化。
之前我们是根据 Spring 的配置文件来获取 Spring 容器:
现在由于我们使用了注解配置代替了配置文件的配置,所以获取方式也发生了变化:
至此,我们就用注解配置代替了配置文件进行配置,一开始的 Spring 配置文件我们可以删除了也没关系,因为一毛钱关系都没有!
我们以后就可以使用全注解开发,再也不需要用到 Spring 配置文件了!
