Spring - 更简单的获取 Bean 对象

目录

二、获取 Bean 对象(对象装配或者对象注入)

1. 属性注入

1.1 属性注入的优点和缺点:

2. Setter注入

 2.1 Setter注入的优点和缺点

3. 构造方法注入(spring 官方推荐的对象注入方式)

3.1 构造方法的优点和缺点

4. @Autowired 注解 和 @Resource 注解的区别

4.1 @Autowired 和 @Source 的区别


前言

    上一篇文章讲到了如何更简单的存储 Bean 对象,有两种方式:  1. 使用五大 类注解,2. 使用 @Bean 方法注解。这篇文章继续介绍如何更简单的获取 Bean 对象。

二、获取 Bean 对象(对象装配或者对象注入)

    对象注入 :  更加简单的读取 Bean 对象(指的是从 Spring 容器中读取某个对象,放到当前类里面)

    在 Spring 中实现依赖注入的常见方式有三种:

1. 属性注入
2. Setter 注入
3. 构造方法注入

1. 属性注入

    目标:在 Controller 中 得到一个 Service 对象:(如下代码所示,使用 @Autowired 的方式来实现对象注入)

Spring - 更简单的获取 Bean 对象_第1张图片

    注:如果是在一个静态方法中或者是一个静态属性,此时加载的时机是在 spring容器初始化之前开始执行的,所以不能在静态方法中使用属性注入获取 Bean 对象的。

    所以在启动类的 main 方法中还是用原来的方式获取到 Controller 对象,重点是关注使用属性注入的方式是否可以拿到 Service 这个 Bean 对象。

Spring - 更简单的获取 Bean 对象_第2张图片

     如上图代码运行结果:就是使用属性注入的结果。

1.1 属性注入的优点和缺点:

    优点:属性注入的最大的优点就是实现简单,使用简单,只要给变量上边加上一个注解(@Auotwired),就可以在不 new 对象的情况下直接获取注入的对象了,(这就是DI,依赖注入)

    缺点:属性注入同样也会有很多问题,甚至编译器都不推荐使用这种方法,属性注入的缺点包含以下三个:

1. 功能性问题:无法注入一个不可变的对象(被 final 修饰的对象)

Spring - 更简单的获取 Bean 对象_第3张图片

2.兼容性问题:只能适用于 IoC 容器,也就是在IoC容器之外这种方式就不适用了。
3. 设计原则问题:容易违反单一谁原则(单一原则:一个类或者一个方法就只实现一个功能)但是加了属性注入之后,就有了更多的 Bean 对象,此时承担的职责也就更多了。

2. Setter注入

Spring - 更简单的获取 Bean 对象_第4张图片

     运行结果:

Spring - 更简单的获取 Bean 对象_第5张图片

 2.1 Setter注入的优点和缺点

    优点:完全符合单一设计的原则,每一个Setter 只针对一个对象。

    缺点:

1. 不能注入不可变对象(final 修饰的对象)Spring - 更简单的获取 Bean 对象_第6张图片

2. 注入的对象可以被修改

Spring - 更简单的获取 Bean 对象_第7张图片

 

 3. 构造方法注入(spring 官方推荐的对象注入方式)

Spring - 更简单的获取 Bean 对象_第8张图片

     运行结果:

Spring - 更简单的获取 Bean 对象_第9张图片

    特点: 如果当前类中只有一个构造方法的时候,允许在构造方法上面不加 @Autowired 注解,然后也是可以拿到 UserService 这个对象的;如下图运行结果:

Spring - 更简单的获取 Bean 对象_第10张图片

     运行结果:

Spring - 更简单的获取 Bean 对象_第11张图片

3.1 构造方法的优点和缺点

    优点:

1. 可以注入一个不可变的对象。(final 修饰的对象)在Java中,被final 修饰的对象必须满足两个条件中的任意一个:

    (1)final 修饰的对象,要么直接进行赋值。

    (2)final 修饰的对象,要么必须在构造方法中赋值。

2. 注入的对象不会被修改。(因为构造方法只能调用一次)
3. 注入的对象完全被初始化。(一个类是先执行实例化,然后执行初始化,在初始化时就会把 Bean 对象注入到当前类当中)
4. 兼容性更好。(构造方法是所有框架都支持的,所以脱离IoC容器也可以使用)

4. @Autowired 注解 和 @Resource 注解的区别

    在进行类注入的时候除了使用 @Autowired 注解之外,还可以使用 @Resource 注解,两种在大部分的场景下使用是没有区别的,都可以实现对象注入,但是也是有一点点区别的

4.1 @Autowired 和 @Source 的区别

  1. 出身不同:@Autowired 是属于spring 的,而 @Resource 来自于JDK的注解。

  2. 使用时设置的参数不同:相对 @Autowired,@Resource 支持更多的参数设置,我们可以看下两个注解的源码:

Spring - 更简单的获取 Bean 对象_第12张图片

 

  3. @Autowired 可以在三种注入方法中都可以使用,但是 @Resource 只可以在 Setter注入和属性注入中使用,不能用在构造方法上,如下代码:

Spring - 更简单的获取 Bean 对象_第13张图片

 

你可能感兴趣的:(JavaEE进阶,spring,java)