大家好,今天继续为大家分享我今日所学的SpringSSM的内容,接着上次的DI入门案例开始,希望对大家有帮助
1.7 bean配置
- bean基础配置 --> <bean>标签
- bean别名配置 --> name属性
在配置依赖注入的<property>标签中,ref属性的值可以用name属性中的值来替换id属性的值,但不建议使用。了解就行
- bean作用范围配置 --> scope属性
bean作用范围实质上就是控制bean创建的实例的数量。
实例:
1.当<bean>标签中没有设置scope属性或者scope属性是默认的singleton时,输出结果如下:
通过一个bean创建出来的对象都是相同的
2.当<bean>标签中scope属性是prototype时,输出结果如下:
通过一个bean创建出来的对象不相同
- bean作用范围说明
表现层对象:servlet
业务层对象:service
数据层对象:dao
工具对象:util
造一次就OK了,这个对象可以反复调用。这种对象适合交给容器进行管理
有状态的,里面会记录一些成员变量的属性值的对象不适合交给容器进行管理
1.8 bean实例化 (三种方式)
- 构造方法 (实例见D:\JavaSSM阶段源代码\spring_03_bean_instance)
- bean本质上就是对象,创建bean使用构造方法完成
BeanCreationException:bean创造异常
- 静态工厂 (了解) (实例见D:\JavaSSM阶段源代码\spring_03_bean_instance)
注意:
- 在配置时,class配置的是工厂类名,如果光配置一个class,而不去配置factory-method属性,则将来造出来的是工厂类的对象,而不是我们需要的orderDao类的对象。还要配置factory-method属性,用来指定将来真正造对象的方法名
- 实例工厂 (了解) (实例见D:\JavaSSM阶段源代码\spring_03_bean_instance)
注意:
- 在使用实例工厂造对象时,与其他两种方式不同的地方在于在配置时要写两个<bean>标签
- 要先配置一个工厂的bean,在第二个<bean>中要通过factory-bean属性指向工厂名(工厂id)
- (*)FactoryBean (实际上是第三种方式的简化) (实例见D:\JavaSSM阶段源代码\spring_03_bean_instance)
FactoryBean里面的方法详解:
注意:
- 虽然在配置时没有使用factory-method属性属性指定使用的方法,但是它造出来的对象不是FactoryBean的对象,而是FactoryBean接口中getObject方法造出来的对象
1.9 bean生命周期
使用这种方式需要在实体类中创建两个自定义的方法分别表示初始化时的操作和销毁前的操作
注意:
- 在配置文件的<bean>标签中需要使用init-method属性绑定初始化方法,destroy-method属性绑定销毁方法
小结:
1.10 依赖注入方式
- setter注入 —— 引用类型 (实例见D:\JavaSSM阶段源代码\spring_05_di_set)
setter注入里面的name属性指的是在impl类中创建的对象名
- setter注入 —— 简单类型 (实例见D:\JavaSSM阶段源代码\spring_05_di_set)
注意:
- 配置文件中设置的value属性值就是为类中定义的基本类型对象设置值
- value后面跟的是简单数据类型,对于参数类型,Spring在注入的时候会自动转换成对应的类型
BookDao接口代码:
BookDaoImpl实现类代码:
AppForDISet类代码:
配置文件:
运行结果:
- 构造器注入 —— 引用类型 (实例见D:\JavaSSM阶段源代码\spring_06_di_constructor)
构造器注入里面的name属性指的是在impl类中的构造方法的形参名
注意:
- name属性指向的是impl类中BookServiceImpl这个构造方法的形参名(暴露出来耦合度高的问题)
- 构造器注入 —— 简单类型 (了解) (实例见D:\JavaSSM阶段源代码\spring_06_di_constructor)
- 构造器注入 —— 参数适配 (了解) (实例见D:\JavaSSM阶段源代码\spring_06_di_constructor)
- 依赖注入方式选择
小结:
1.11 依赖自动装配
- IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
- 自动装配方式:
-
- 按类型(常用)
- 按名称
- 按构造方法
- 不启用自动装配
依赖自动装配特征: (实例见D:\JavaSSM阶段源代码\spring_07_di_autoware)
- 自动装配用于引用类型依赖注入,不能对简单类型进行操作
- 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一(就是要保证每个bean标签中的class属性唯一),推荐使用
- 使用按名称装配时(byName)必须保障容器中具有指定名称的bean(就是要保证每个bean标签有一个id属性与那个类里面的成员变量名称相同),因变量名和配置耦合,不推荐使用
- 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失败
1.12 集合注入
- 注入数组对象
- 注入List对象(重点)
- 注入Set对象
注意:
- 注入Set对象时,<value>中的值写重了,会自动过滤,只留下一个
- 注入Map对象(重点)
- 注入Properties对象
案例:数据源对象管理
(实例见D:\JavaSSM阶段源代码\spring_09_datasource)
1.13 加载properties配置信息
(实例见D:\JavaSSM阶段源代码\spring_09_datasource)
1.14 容器
(实例见D:\JavaSSM阶段源代码\spring_10_container)
- 创建容器 (两种方式)
推荐方式一
- 获取bean(三种方式)
注意:
- 当使用方式三按类型查找时,容器中这个类型的bean只能有一个。有多个的话会报错
- 容器类层次结构图
- BeanFactory初始化 (已经过时,了解即可)
注意:
- BeanFactory是所有容器类的顶层接口
- BeanFactory创建完毕后,所有的bean均为延迟加载
- ApplicationContext创建完后,所有的bean默认是立即加载
- 但当我们给bean加了一个lazy-init属性后,输入true,ApplicationContext就会延时加载bean
核心容器总结 ---------------------
在核心容器这一章中,我们分别学了以下三个内容:
- 容器相关
- bean相关
- 依赖注入相关