Spring的IOC
一、Spring的概述
1.Spring是什么?
Spring是分层的 Java SE/EE应用全栈轻量级开源框架;
2.Spring的两大核心
1) IOC(Inverse Of Control: 反转控制)
2) AOP(Aspect Oriented Programming:面向切面编程)
3.Spring优势
1)方便解耦,简化开发
通过 Spring提供的 IoC容器,可以将对象间的依赖关系交由 Spring进行控制;
2) AOP编程的支持
通过 Spring的 AOP 功能,方便进行面向切面的编程
3)声明式事务的支持
4)方便程序的测试
4.Spring的体系结构(官方)
5.程序耦合
耦合: 程序之间的依赖
包括:
类之间的依赖
方法之间的依赖
解耦:
降低程序间的依赖关系
实际开中应该做到:编译期不依赖,运行时才依赖
解耦思路:
第一步:使用反射来创建对象,避免使用new关键字
第二步:通过读取配置文件来获取要创建的对象的全限定类名
二、SpringIOC
1.概念:
控制反转(IOC):把创建对象的权力交给框架,是框架的重要特性,并非面向对象编程的专业术语,包括:依赖注入(DI)和依赖查找;
2.IOC作用:削减计算机程序之间的耦合(解除我们代码中的依赖关系)
3.环境搭建
1)导入spring的依赖
2)创建配置文件:
导入约束:
<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 http://www.springframework.org/schema/beans/spring-beans.xsd">
把对象的创建交给spring管理:
<!--把对象的创建交给spring管理--> <bean id="accountService" class="com.li.Service.impl.AccountServiceImpl"/>
3)获取springIOC的核心容器,根据id获取对象:
public static void main(String[] args) { ApplicationContext ac =new ClassPathXmlApplicationContext("Bean.xml"); IAccountService accountService = ac.getBean("accountService", IAccountService.class); }
ApplicationContext三个常用的类:
ClassPathXmlApplicationContext:他可以加载类路径下的配置文件,要求配置文件必须在类路劲下,不在则不能加载
FileSystemXmlApplicationContext:它可以加载磁盘任意路劲的配置文件(必须有访问权限)
AnnotationConfigApplicationContext:读取注解创建容器
核心容器的两个接口引发的问题:
ApplicationContext: 单例对象适用(实际开发中用)
它在构建核心容器时,创建对象采取的策略是采用立即加载方式,使用读取完配置文件就马上创建配置文件中的配置对象
BeanFactory:多例对象
它在构建核心容器时,创建对象采取的策略是采用延迟加载方式,什么时候根据id获取对象了,什么时候才真正的创建对象
4.Spring 创建Bean的三种方式
1)使用默认的构造函数创建
在spring的配置文件中使用Bean标签,配以id和class属性即可;
注意: 如果该类中无默认的构造函数则创建失败;
<!--使用默认的构造函数创建-->
<bean id="accountService" class="com.li.service.impl.AccountServiceImpl"></bean>
2) 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
/** * 模拟一个工厂类 */ public class InstanceFactory { public IAccountService getAccountService(){ return new AccountServiceImpl(); } }
<!--xml文件的配置-->
<Bean id="intanceFactory" class="com.li.factory.InstanceFactory"/> <bean id="accountService" factory-bean="intanceFactory" factory-method="getAccountService"/>
3)使用工厂中静态方法创建对象(使用某个类中的静态方法创建随想,并存入spring)
/** *模拟一个工厂类 */ public class StaticFactory { public static IAccountService getAccountService(){ return new AccountServiceImpl(); } }
<Bean id="accountService" factory-bean="com.li.factory.Staticfactory" factory-method="getAccountService"/>
5.Spring中Bean的作用范围
1.spring中bean标签的调整:
* 使用bean标签中的scope属性:
取值:
1)singleton:单例(默认值)
2)prototype:多例
3)request:作用于web的请求范围
4)session:作用于web的会话范围
5)globla-session:作用于集群的会话范围(全局会话范围),当不是集群环境时,它就是session
6.Bean对象的生命周期
1)单例对象:
出生:容器创建时(解析配置文件)对象产生
活着:只要容器在,对象就在
死亡:容器不在,对象就不在
单例对象的生命周期和容器相同
2)多例对象:
出生:当使用对象时spring框架为我们创建
活着:对象在使用过程中就一着在
死亡:当对象长时间不用,且没有其他对象引用,java垃圾回收机器进行回收