第二周笔记

一、Bean的装配方式——Bean的依赖注入

红色方框中用到了Bean的装配

spring page 实现类_java

1、DI依赖注入
1.什么是DI ?
DI ( Dependency Injection)“依赖注入” 是实现IoC的方法。是由IoC容器在运行期间,动态地将被依赖的对象注入到需要的对象之中,从而实现对象之间的解耦。
2.Bean的装配实现方法:
电脑依赖外部设备实现扩展功能时,只要挂接的外部设备符合USB接口标准,由使用者(第三方)插入电脑接口中即可。
	**USB连接方式的特点**
  1. 电脑和外部设备相互独立,电脑可以依赖外部设备扩展功能。
  2. 通用便捷,需要使用时只需将外部设备用USB接口连接上电脑即可。
3.DI核心思想:
依赖对象需要被依赖对象实现扩展功能时,只要有符合标准的注入接口, IoC容器即会自动将被依赖对象注入到依赖对象中。
4.DI依赖注入优点:
<1>使依赖对象和被依赖对象之间相互独立,降低耦合性。
	<2>使用方便, 依赖对象需要使用被依赖对象时, IoC容器自动从注入接口注入被依赖对象。
2、XML装配方法

Spring支持两种Bean的装配方式:XML方式注解方式

spring page 实现类_java_02

1.示例1:设值注入
设值注入的必须条件:

**Bean类必须有一个无参构造方法;Bean类必须为属性提供setter方法。**详情如下图

spring page 实现类_构造方法_03

设值注入就是通过成员变量的set方法进行注入

spring page 实现类_Java_04


设值注入xml,(对象用ref)固定的值用value

spring page 实现类_构造方法_05

2.示例2:构造注入

构造注入是通过构造方法赋值的。

如何通过构造器直接为业务类注入所依赖的数据访问层对象,实现保存用户数据的功能?

**构造注入的必须条件:**创建带参构造方法。(编写带参构造方法后,Java虚拟机不再提供默认的无参构造方法,为了保证使用的灵活性,建议自行添加一个无参构造方法)

当写一个带参构造函数,也要手动添加一个无参构造函数

spring page 实现类_spring page 实现类_06


如果创建了一个有参构造函数的情况下,不手动添加无参构造函数,则出现如下图的报错(即没有默认的构造函数)

spring page 实现类_spring page 实现类_07


特别注意:index下标,从0开始

spring page 实现类_spring_08

3、xml的2种装配方法,对比总结

1.构造注入和设值注入的主要区别就是体现在service类的实现类里和配置文件

2.Spring通过setter访问器实现对属性的赋值,这种做法称为设值注入;Spring还提供了通过构造方法赋值的能力,称为构造注入。使用设值注入时,Spring通过JavaBean的无参构造方法实例化对象。

3.两种方式对比(如下图)

spring page 实现类_java_09


(4)基于xml的装配过程

  • 创建Java类,提供有参、无参构造以及属性setter方法;
  • 创建Spring配置文件beans5.xml,使用2种方式配置Bean;
  • 创建测试类,测试程序。
4、Annotation注解(基于注解的装配方法)
1.什么是Annotation注解?

Annotation注解和基于XML模式的Bean装配目标一样,注解是通过为Bean实现类添加标注的方式对Bean进行装配的方法。(相同点)

2.Annotation注解的优点:
  • 注解与Java代码紧密结合,大大精简了配置文件的内容,提升运行速度。
  • 在Java代码中即可体现对象依赖关系,无需在Java文件和配置文件中切换,提高了开发效率。
3.IoC的常用注解(如下图)

注解是标在类上面使用的

spring page 实现类_构造方法_10

(1)注解的使用:示例@Component :

spring page 实现类_spring page 实现类_11

(2)使用注解,导入aop包

spring page 实现类_spring page 实现类_12

(3)使用注解的xml文件如何写?

在Spring的Spring\docs\spring-framework-reference目录下,找到并打开index.html,选择core–>1.9. Annotation-based Container Configuration–>复制红色方框中的内容,粘贴到xml文件即可。

spring page 实现类_spring_13


spring page 实现类_java_14

(4)示例

spring page 实现类_Java_15


spring page 实现类_spring_16

5、学习中遇到的报错
1.报错–导包不齐

“ nested exception is java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource”

spring page 实现类_构造方法_17


spring page 实现类_java_18


spring page 实现类_构造方法_19

6、小结

spring page 实现类_构造方法_20


spring page 实现类_spring page 实现类_21


spring page 实现类_spring page 实现类_22

7、本课知识问答
提问(需要掌握的基础):

1.bean是什么
2.bean的生命周期的意义
3.Bean有哪几种作用域
4.说一说Singleton作用域的应用场景
5.Prototype作用域的特点和应用场景
6.Bean有哪几种装配方式
7.你喜欢基于XML的装配方式还是基于注解的装配方式呢?
8.说一说使用注解有什么好处。
9.XML和注解的装配方式的异同