Spring 原始注解

1. 基本认识

  • Spring 是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替 xml 配置文件,可以简化配置,提高开发效率。
  • Spring 原始注解主要是替代 Spring 配置文件中 标签的配置:

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1779007/1625367571320-07511e0c-2c50-42bc-8cb6-b814f03f2e47.png#align=left&display=inline&height=629&margin=%5Bobject%20Object%5D&name=image.png&originHeight=629&originWidth=1093&size=486816&status=done&style=none&width=1093)

    2. 原始注解入门操作

    image.png
    image.png
    但是这样进行注解配置后程序会报错:
    image.png
    NoSuchBean?因为我们没有告诉 Spring 要在哪里找到注解,找不到注解那就没办法帮我们创建 Bean 对象了!所以我们接下来还要在 Spring 配置文件中配置组件扫描
    image.png
    上面这句话的意思就是 Spring 会在 cn.wrj 包中以及该包的所有子包中进行扫描,一旦扫描到注解,就会进行识别!
    image.png
    接下来我们测试一下是否成功:
    image.png
    成功了!

    3. 原始注解详解1

    3.1 @Component 注解改进

    @Component 注解表示 Spring 只要扫描到这个注解,就会帮你创建对应的 id 值的对象到 Spring 容器中!
    @Component 注解可以下面三个注解替代,让语义更加明确!
    image.png
    image.png
    image.png

    3.2 注解注入不需要 Set 方法

    image.png
    image.png
    image.png
    程序仍然可以运行。
    所以,我们如果用 Spring 配置文件进行反射注入,则我们需要写 Set 方法,而如果我们用注解进行注入,则不用 Set 方法。

    3.3 @Autowired

    @Autowired 可以按照需要注入的数据类型在 Spring 容器中自动找到一个符合的且唯一的 Bean 进行注入。
    image.png
    所以,把@Qualifier 注解删掉仍然可以进行注入,因为此时 Spring 容器中只存在一个 UserDao 类型的 Bean,需要注意的是,如果 spring 容器中存在多个 UserDao 类型的 Bean 那此时的容器则不知道该注入哪一个

    3.4 @Qualifier

    该注解是根据 id 值名称在 Spring 容器中找到对应的 Bean 进行注入,但此注解必须结合 @Autowired 一起使用

    3.5 @Resource

    image.png
    @Resource 可以直接单独使用,并且是根据 id 值在 Spring 容器中找 Bean 进行注入。
    image.png
    直接一行搞定。
    但是!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 表达式来为其进行注入。
    之前:
    image.png
    image.png
    image.png

    4.2 @Scope

    单例的或者是多例的。
    image.png

    4.3 @PostConstruct 与 @PreDestroy

    image.png

Spring 新注解


1. 基本介绍

原始注解对非自己创建的类是没办法进行注解的,比如我们要创建一个数据源的 Bean ,就只能在 Spring 配置文件中进行配置,而无法使用注解。
image.png
(你**也可以使用注解,比如你要注解 Druid 数据源,你可以到阿里巴巴的公司内部,把 Druid 数据源的源代码复制一份到你的电脑里,然后使用注解配置!哈哈哈,笑死)**
image.png
所以我们引入了新注解。
image.png

学习完这些新注解后,下面的配置文件中的配置就可以全部被替换掉:
image.png

2. 新注解详解

2.1 @Configuration

详解之前,我们要有一个思想:我们要用一个核心的配置文件类去完全替代配置文件!
image.png
image.png
这样就可以用配置**去代替配置文件;用注解去代替标签**。

2.2 @ComponentScan

该注解是组件扫描注解,功能是:扫描指定包及其子包下的所有已存在的注解
image.png

2.3 @Bean

之前在配置文件中配置 Druid 数据源:
image.png
现在在核心配置类中用注解配置 Druid 数据源:
image.png
但此时你可以看到我画线的地方和数据库配置文件没有半毛钱关系,完全用不到数据库配置文件,是耦合死的,所以接下来我们要用注解加载数据库配置文件

2.4 @PropertySource

用 Spring 加载数据库配置文件:
image.png
然后就可以将 2.3 中获取 Durid 数据源方法数据库配置文件进行解耦,使用 Spring 表达式:
image.png
image.png
但你以为这样没错嘛?
肯定有错!Spring 表达式只能在 Spring 配置文件中供 Spring 去解析,但在 Java 类中这样写只是表示一个字符串!!!!哈哈哈,笑死!应该这样搞:
我们不是已经将数据库配置文件加载进Spring 容器里了吗?
那就用注解进行注入!
image.png
Spring 表达式要想在 Java 类中被解析,只能借助与 Spring 提供的注解!
然后将 driver 传进去就行了:
image.png
image.png

2.5 @Import

像配置文件一样,一个配置文件中可以导入另一个配置文件,我们的核心配置类也可以导入其他配置类
比如可以把数据库的配置抽成一个数据库配置类,然后再用 @Import 注解导入到核心配置类中:
image.png
然后在核心配置类中导入该数据库配置类就行了:
image.png
注意 @Import 标签传进去的是一个数组,因为一个核心配置文件可能需要多个配置类!

** 2.6 使用注解方式获取 Spring 容器 :new AnnotationConfigApplicationContext( 核心配置类.class )

使用注解配置后,获取 Spring 容器的方式也发生了变化。
之前我们是根据 Spring 的配置文件来获取 Spring 容器:
image.png
现在由于我们使用了注解配置代替了配置文件的配置,所以获取方式也发生了变化:
image.png
至此,我们就用注解配置代替了配置文件进行配置,一开始的 Spring 配置文件我们可以删除了也没关系,因为一毛钱关系都没有!
我们以后就可以使用全注解开发,再也不需要用到 Spring 配置文件了!