Spring IoC容器与Bean管理
Spring快速入门
IoC控制反转
- IoC控制反转, 全称Inversion of Control, 是一种设计理念
- 由代理人来创建与管理对象, 消费者通过代理人来获取对象
- IoC的目的是降低对象之间的直接耦合
- 加入IoC容器将对象统一管理, 让对象关联变为弱耦合
DI依赖注入
- IoC是设计理念, 是现代程序设计遵循的标准, 是宏观目标
- DI(Dependency Injection) 是具体技术实现, 是微观实现
- DI在Java中利用反射技术实现对象注入(Injection)
传统开发方式
- 对象之间存在彼此直接引用导致对象硬性关联, 程序难以扩展维护
- 比如Service调用Dao是直接new的话, 如果这个Dao不在适合当前应用, 要换其他Dao类的话, 就要修改Service类的源代码, 来new其他Dao类, 而修改源代码后, 就要重新编译、测试、发布、上线, 这个过程是非常繁琐的.
Spring IoC容器
- IoC容器是Spring生态的地基, 用于统一创建与管理对象依赖
Spring IoC容器职责
- 对象的控制权交由第三方统一管理(IoC控制反转)
- 利用Java反射技术实现运行时对象创建与关联(DI依赖注入)
- 基于配置提高应用程序的可维护性与扩展性
Spring XML配置管理对象(Bean)
三种配置方式
- 基于XML配置Bean
- 基于构造方法实例化(常用)
- 基于静态工厂实例化(了解)
- 基于工厂实例方法实例化(了解)
- 基于注解配置Bean
- 基于Java代码配置Bean
基于XML配置Bean
核心配置文件名(约定俗成): applicationContext.xml
<bean id="sweetApple" class="com.zk.spring.ioc.entity.Apple">
<property name="title" value="红富士"/>
<property name="origin" value="欧洲"/>
<property name="color" value="红色"/>
</bean>
XML方式创建IoC容器(加载xml配置文件)
// 创建Spring IoC容器, 并根据配置文件在容器中实例化对象
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
从IoC容器获取Bean
bean 标签 id 与 name属性相同点
- bean id 与 name 都是设置对象在IoC容器中唯一标识
- 两者在同一个配置文件中都不允许出现重复
- 两者允许在多个配置文件中出现重复, 新对象覆盖旧对象
bean 标签 id 与 name属性区别
- id要求更为严格, 一次只能定义一个对象标识(推荐)
- name更为宽松, 一次允许定义多个对象标识
- tips: id与name的命名要求有意义, 按小驼峰命名书写
路径匹配表达式
加载单个配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
classpath:applicationContext.xml
路径表达式是指:
从类路径中寻找applicationContext.xml文件, Maven工程加载的时候的类路径是target/classes这一级目录
加载多配置文件
String[] configLocations = new String[]{
"classpath:applicationContext.xml", "classpath:applicationContext-1.xml"};
ApplicationContext context = new ClassPathXmlApplicationContext(configLocations);
路径表达式
表达式实例 | 说明 |
---|---|
classpath:config.xml | 扫描classpath根路径(不包含jar)的config.xml |
classpath:com/zk/config.xml | 扫描classpath下(不包含jar)com.zk包中的config.xml |
classpath*:com/zk/config.xml | 扫描classpath下(包含jar)com.zk包中的config.xml |
classpath:config-*.xml | 扫描classpath根路径下所有的以config-开头的XML文件 |
classpath:com/**/config.xml | 扫描com包下(包含任何子包)的config.xml(了解) |
file:/linux/home/config.xml | 扫描/linux/home根路径config.xml(了解) |
对象依赖注入
- 依赖注入是指运行时将容器内对象利用反射赋给其他对象的操作
- 基于setter方法注入对象(常用)
- 基于构造方法注入对象
利用setter实现对象依赖注入
<bean id="bookDao" class="com.zk.spring.ioc.bookshop.dao.BookDaoOracleImpl">
</bean>
<bean id="bookService" class="com.zk.spring.ioc.bookshop.service.BookService">
<property name="bookDao" ref="bookDao"/>
</bean>
利用构造方法实现对象依赖注入
<bean id="sweetApple" class="com.zk.spring.ioc.entity.Apple">
<!-- IoC容器自动利用反射机制在运行时调用setXXX方法为属性赋值 -->
<property name="title" value="红富士"/>
<property name="origin" value="欧洲"/>
<property name="color" value="红色"/>
</bean>
<bean id="andy" class="com.zk.spring.ioc.entity.Child">
<constructor-arg name="name" value="andy"/>
<constructor-arg name="apple" ref="sweetApple"/>
</bean>