一、IOC的相关概念
1.1 IOC
-
ioc(容器): 控制反转
-
- 作用:解代码的耦合并创建管理对象
-
- 直接问ioc容器要对象即可
- 直接问ioc容器要对象即可
-
ioc是spring的核心技术之一。
1.2 Spring框架
- 是封层的轻量级开源框架,以IOC(控制反转) 和 AOP(面向切面编程) 为内核。提供了展现层 SpringMVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术。还可以整合第三方框架和类库。
二、Spring的IOC操作
2.1 搭建环境
- 导入 ioc 的坐标。
- 配置xml文件
- java代码实现
2.2 IOC属性
-
Bean标签: 指定要创建的对象
-
- id属性:代表唯一标识
-
- class属性:代表要创建对象的类的全限定名
-
-
- scope属性:范围
取值:singleton 单例(默认)
特点:对象会随着容器的创建而创建 对象会随着容器的销毁而销毁
- scope属性:范围
-
-
prototype 多例
-
- 特点:对象的创建和销毁和容器无关,会随着调用getbean方法的时候 才创建对象 调用一次 创建一次新的对象
-
- 销毁是跟着垃圾回收机制走的
-
- 应用场景:根据当前类的线程安全来决定的
-
线程安全的类: singleton
-
线程不安全的类: prototype
-
- 例如:sqlSessionFactory(线程安全)singleton
sqlSession(线程不安全)prototype
- 例如:sqlSessionFactory(线程安全)singleton
-
了解属性:
-
- init-method:配置初始化方法
-
-
- 特点:对象只要一创建出来 就会立即执行配置好的初始化方法
-
-
- destory-method:配置销毁方法的
-
-
- 特点:对象只要一销毁 之前就会立即执行配置好的销毁方法
-
<bean id="accountService" class="com.serviceimpl.AccountServiceImpl" scope="prototype"
init-method="aaa" destroy-method="bbb"></bean>
2.3 spring的ioc创建对象的三种方式
2.3.1 通过无参构造器反射的方式
- 格式: < bean id =“唯一值” class=“类的全限定名”>
2.3.2 静态工厂模式
- 特点: 工厂的方法都是静态的,可以 类名.方法名()
<bean id="accountService" class="com.serviceimpl.AccountServiceImpl"></bean>
2.3.3 实例工厂模式
- 特点: 工厂的方法都是非静态的,得先有工厂的实例,才能调用工厂的方法
<bean id="factory" class="com.utils.BeanFactory2"></bean>
<bean id="accountService" factory-bean="factory" factory-method="getBean"></bean>
2.4 Spring 中的依赖注入
- 给当前类的属性进行赋值
- spring给你提供了赋值的技术—依赖注入(DI)
- 依赖注入:对存在的依赖关系的属性或者对象自动赋值
- 都会给哪些类型的属性赋值:
-
- 简单属性:int String 包装类型
-
- 复杂属性:数组,list set map
-
- 对象属性:自定义的对象
构造器给该类的属性赋值(DI)
属性
- index:根据参数的角标位置来定位参数
- name:根据参数的名称来定位
type:根据参数的全限定名来定位
-
- 以上三个属性时用来定位参数的
value:给简单属性赋值
ref:给对象属性赋值
在二级结构中,可以使用标签给复杂类型属性赋值
- 以上三个属性时用来定位参数的
-
- 以上两个属性是用来赋值的
<constructor-arg name="arr" >
<array>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</array>
</constructor-arg>
set属性的方式
属性:
- name属性:用来定位参数 定位的是set方法后面的那个名称 首字母小写
-
- 底层:gameName将首字母变成大写GameName加上set==去类中匹配该方法
- value属性:给简单属性赋值
- ref属性:给对象属性赋值
<property name="arr">
<array>
<value>aaa</value>
<value>ccc</value>
<value>bbb</value>
</array>
</property>
在二级结构中可以使用标签给复杂属性赋值
复杂类型属性 要使用二级结构标签
数组:list set
- 使用组合任意搭配:
-
- array=value
-
- list=value
-
- set = value
- 键值对:map properties
-
- 使用组合任意搭配:
map = value
properties = value
- 使用组合任意搭配:
<property name="map">
<!-- <props>
<prop key="1">aaaaaa</prop>
<prop key="2">bbbbbb</prop>
<prop key="3">cccccc</prop>
</props>-->
<!--给map键值对赋值可以有两种方式-->
<map>
<entry key="1" value="a"></entry>
<entry key="2" value="b"></entry>
</map>
</property>
对象 属性的注入
- ref:指向的是被spring容器管理的对象的id()
<bean id="accountService4" class="com.serviceimpl.AccountServiceImpl4">
<!--
需要一个dao
ref:指向的是被spring容器管理的对象的id()
<constructor-arg name="accountDao" ref="accountDao"></constructor-arg>
-->
<property name="accountDao" ref="accountDao"></property>
</bean>
<!--dao层
此处的id为property中 ref 指向。
-->
<bean id="accountDao" class="com.daoimpl.AccountDaoImpl"></bean>
测试层
此处才accountService4与上面的 bean对应。
/ioc的方式
//创建容器
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
//问容器要对象
AccountService accountService4 = (AccountService)applicationContext.getBean("accountService4");
//根据获取的对象,执行方法
accountService4.save();
三、总结
-
IOC:解代码的耦合,创建管理对象
-
使用:1 导入ioc坐标 2 设置配置文件 3 编写ioc的api问容器要对象
-
配置文件的标签介绍:
-
- bean标签:指定创建对象
-
- id属性:代表唯一
-
- Class属性:代表类的全限定名 (反射方式创建对象)
-
- Scope属性:代表使用单例对象还是多例对象
-
- Singleton:默认就是单例对象 特点:对象随着容器的创建而创建 随着容器的销毁而销毁
-
- Prototype: 代表就是多例对象 特点:对象的创建和销毁和容器没有关系 getbean的时候才创建对象 调用一次创建一次
-
应用场景:线程安全用Singleton 线程不安全用Prototype
-
Spring的ioc创建对象的三种方式:无参构造器反射方式 静态工厂 实例工厂
-
ioc的api介绍:
-
ApplicationConext接口:
-
- ClassPathXmlApplication:加载配置文件的 (今天xml配置ioc)
-
- AnnotationConfigApplicationContext: 加载配置类的(注解配置ioc)
-
- 方法:getBean(id属性值) 问容器要对象
-
DI:依赖注入
-
- 作用:可以给该类中有关系的属性进行赋值
-
- 属性分了三种: 简单属性 复杂属性 对象属性
-
- 依赖注入提供了2种方式给属性注入:构造器方式 set属性方式
-
-
- 构造器:< constructor-arg>
-
-
-
- Set属性方式:< property>
-
-
属性介绍:针对构造器方式
属性介绍:针对set属性方式
-
复杂类型的注入:
-
- 数组 list set array=value list=value set=value
-
- 键值对:map properties map=entry props=prop
-
对象类型的注入:
1 该对象要给ioc容器创建管理
2 使用ref属性进行注入 ref=ioc容器中管理对象的id标识 -
ioc是spring核心功能之一:用来给java程序解耦合并且创建管理对象