一、IoC控制反转
- IoC控制反转,全称Inverse of Control,是一种设计理念
- 由代理人来创建与管理对象,消费者通过代理人来获取对象
- IoC的目的是降低程序与程序之间直接耦合
- 加入IoC容器将对象统一管理,让对象关联变为弱耦合
二、DI依赖注入
- IoC是设计理念,是现代程序设计遵循的标准,是宏观目标
- DI(Dependency Injection)是具体技术实现,是微观实现
- DI在Java中利用反射技术实现对象注入(Injection)
三、Spring的含义
- Spring可从狭义与广义两个角度看待
- 狭义的Spring是指Spring框架(Spring Fremework)
1. Spring框架是企业开发复杂性的一站式解决方案
2. Spring框架的核心是IoC容器与AOP面向切面编程
3. Spring IoC负责创建与管理系统对象,并在此基础上扩展功能
- 广义的Spring是指Spring生态体系
四、Spring IoC容器职责
- 对象的控制权交由第三方统一管理(IoC控制翻转)
- 利用Java反射技术实现运行时对象创建与关联(DI依赖注入)
- 基于配置提高应用程序的可维护性与扩展性
五、XML管理对象(Bean)
- 三种配置方式
a. 基于注解配置Bean
b.基于Java代码配置Bean
c. 基于XML配置Bean
c1.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean标签默认通过默认构造方法创建对象-->
<bean id="apple1" class="com.imooc.spring.ioc.entity.Apple">
</bean>
<!--使用带参构造方法实例化对象-->
<bean name="apple2" class="com.imooc.spring.ioc.entity.Apple">
<constructor-arg name="title" value="红富士"/>
<constructor-arg name="color" value="红色"/>
<constructor-arg name="origin" value="欧洲"/>
<constructor-arg name="price" value="19.8"/>
</bean>
<bean id="apple3" class="com.imooc.spring.ioc.entity.Apple">
<constructor-arg index="0" value="红富士"/>
<constructor-arg index="1" value="欧洲"/>
<constructor-arg index="2" value="红色"/>
<constructor-arg index="3" value="19.8"/>
</bean>
<!--利用静态工厂获取对象-->
<bean id="apple4" class="com.imooc.spring.ioc.factory.AppleStaticFactory"
factory-method="createSweetApple"/>
<!--利用工厂实例方法获取对象-->
<bean id="factoryInstance" class="com.imooc.spring.ioc.factory.AppleFactoryInstance"/>
<bean id="apple5" factory-bean="factoryInstance" factory-method="createSweetApple"/>
</beans>
c2. XML方式创建IoC容器
//创建IoC容器并根据配置文件创建对象
ApplicationContext context = newClassPathXmlApplicationContext("classpath:applicationContext.xml");
- 实例化Bean的三种方式
基于构造方法对象实例化
利用构造方法参数名实例化
<bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple">
<!-- 没有constructor-arg则代表调用默认构造方法实例化 -->
<constructor-arg name="title" value="红富士"/>
<constructor-arg name="origin" value="欧洲"/>
<constructor-arg name="color" value="红色"/>
</bean>
基于静态工厂实例化
<!--利用静态工厂获取对象-->
<bean id="apple4" class="com.imooc.spring.ioc.factory.AppleStaticFactory"
factory-method="createSweetApple"/>
/**
* 静态工厂通过静态方法创建对象,隐藏创建对象的细节
*/
public class AppleStaticFactory {
public static Apple createSweetApple(){
//logger.info("")
Apple apple = new Apple();
apple.setTitle("红富士");
apple.setOrigin("欧洲");
apple.setColor("红色");
return apple;
}
}
基于工厂实例方法实例化
<!--利用工厂实例方法获取对象-->
<bean id="factoryInstance" class="com.imooc.spring.ioc.factory.AppleFactoryInstance"/>
<bean id="apple5" factory-bean="factoryInstance" factory-method="createSweetApple"/>
/**
* 工厂实例方法创建对象是指IoC容器对工厂类进行实例化并调用对应的实例方法创建对象的过程
*/
public class AppleFactoryInstance {
public Apple createSweetApple(){
Apple apple = new Apple();
apple.setTitle("红富士");
apple.setOrigin("欧洲");
apple.setColor("红色");
return apple;
}
}
六、从IoC容器获取bean
Apple sweetApple = context.getBean("sweetApple" , Apple.class);
或者
Apple sweetApple = (Apple)context.getBean("sweetApple");
---------------------------------------------------------------------- System.out.println(sweetApple.getTitle());
七、id与name区别
-
id与name属性相同点
bean id与name都是设置对象在IoC容器中唯一标识
两者在同一个配置文件中都不允许出现重复
两者允许在多个配置文件中出现重复,新对象覆盖旧对象 -
id与name属性区别
id要求更为严格,一次只能定义一个对象标识(推荐)
name更为宽松,一次允许定义多个对象标识
tips: id与name的命名要求有意义,按驼峰命名书写
八、路径匹配表达式
1.加载单个配置文件
//创建IoC容器并根据配置文件创建对象
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
2.加载多配置文件
String[] configLocations = new String[{"classpath:applicationContext.xml","classpath:applicationContext-1.xml"};
ApplicationContext context = newClassPathXmlApplicationContext(configLocations);
3.路径表达式
九、对象依赖注入
- 对象依赖注入
依赖注入是指运行时将容器内对象利用反射赋给其他对象的操作
基于setter方法注入对象
<bean id="sweetApple" class="com.imooc.spring.ioc.entity.Apple">
<!-- IoC容器自动利用反射机制运行时调用setXXX方法为属性赋值 -->
<property name="title" value="红富士"/>
<property name="color" value="红色"/>
<property name="origin" value="欧洲"/>
<property name="price" value="19.8"/>
</bean>
利用setter实现对象注入
<bean id="lily" class="com.imooc.spring.ioc.entity.Child">
<property name="name" value="莉莉"/>
<!-- 利用ref注入依赖对象 -->
<property name="apple" ref="sweetApple"/>
</bean>
基于构造方法注入对象
注入集合对象
十、bean scope属性详解
- bean scope属性
bean scope属性用于决定对象何时被创建与作用范围
bean scope配置将影响容器内对象的数量
默认情况下bean会在IoC容器创建后自动实例化,全局唯一
2.scope用法
<bean id="bookDao"
class="com.imooc.spring.ioc.bookshop.dao.BookDaoOracleImpl"
scope="prototype" />
十一、基于注解配置IoC容器
1.基于注解的优势
摆脱繁琐的XML形式的bean与依赖注入配置
基于"声明式"的原则,更适合轻量级的现代企业应用
让代码可读性变得更好,研发人员拥有更好的开发体验
2.三类注解
组件类型注解-声明当前类的功能与职责
自动装配注解-根据属性特征自动注入对象
元数据注解-更细化的辅助IoC容器管理对象的注解
3.四种组件类型注解
@Component 组件注解,通用注解,被该注解描述的类将被IoC容器管理并实例化
@Controller 语义注解,说明当前类是MVC应用中的控制器类
@Service 语义注解,说明当前类是Service业务服务类
@Repository 语义注解,说明当前类用于业务持久层,通常描述对应Dao类
4.开启组件扫描
<!--XML配置开启组件扫描,才能使用注解-->
<context:component-scan base-package="com.imooc">
<context:exclude-filter type="regx" expression="com.imooc.exl.*/>
</context:component-scan>
十二、两类自动装配注解
按类型装配
@Autowired 按容器内对象类型动态注入属性,由Spring机构提供
@Inject 基于JSR-330(Dependency Injection for Java)标准, 其他同@Autowired,但不支持required属性
按名称装配
@Named 与@Inject配合使用,JSR-330规范,按属性名自动装配属性
@Resource 基于JSR-250规范,优先按名称、再按类型智能匹配
十三、元数据注解
@Primary 按类型装配时出现多个相同类型对象,拥有此注解对象优先被注入
@PostConstruct 描述方法,相当于XML中init-method配置的注解版本
@PreDestroy 描述方法,相当于XML中destroy-method配置的注解版本
@Scope 设置对象的scope属性
@Value 为属性注入静态数据
<!--通知Spring IoC容器初始化时加载属性文件-->
<context:property-placeholder location="classpath:config.properties"/>