什么是IOC?
IOC: Inversion of Control(控制反转)
控制反转:将对象的创建权反转给(交给)Spring管理
为什么要使用IOC?
传统开发模式中,业务和实现类过于紧密,底层业务要修改源代码。
可以通过工厂实现接口与实现业务分离,但是当需要切换的时候,还是有修改工厂,只是尽量在不修改源码的基础上,对程序进行扩充。
如果在工厂内部使用配置文件加载,在变化时就不需要修改源码,只需要修改配置文件即可。
什么是DI?
DI: Dependency Injection(依赖注入)
依赖注入:给Spring管理类当中依赖的属性,通过配置文件进行赋值的过程
前提必须有IOC的环境,Spring管理这个类的时候才能将类的依赖的属性值注入(设置)进来。
IOC与DI的使用
1.添加相关Jar包
2.创建Spring核心配置文件,通常起名为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
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
3.添加Bean配置IOC与DI
<!-- IOC配置,userDao为接口,Impl为实现类 -->
<bean id="userDao" class="pers.liuchengyin.demo1.UserDaoOracleImpel">
<!--
name:要注入属性的名称
value:要注入的值
属性:要提供set方法
-->
<property name="name" value="柳成荫" />
</bean>
4.创建IOC容器测试
public void test1(){
// 依赖注入:给Spring管理类当中依赖的属性,通过配置文件进行赋值的过程
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDaoOracleImpel userDao = (UserDaoOracleImpel)applicationContext.getBean("userDao");
System.out.println(userDao.getName());
}
Spring的工厂类
①BeanFactory
老版本使用方式,当调用getBean的时候才会创建实例对象
②ApplicationContext
新版本使用方式,当加载配置文件的时候就会创建实例对象
ApplicationContext实现类
1.ClassPathXmlApplicationContext
加载类路径下的配置文件
2.FileSystemXmlApplicationContext
加载文件系统下的配置文件
Bean相关配置
1.bean中的属性
id:使用了约束中的唯一约束,里面不能出现特殊字符
class:类的绝对路径,即包名+类名
init-method:bean被初始化的时候执行的方法
destroy-method:bean被销毁时执行的方法(bean是单例创建,工厂关闭)
public void test(){
// 加载核心配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 创建对象
Person person = (Person) applicationContext.getBean("person");
System.out.println(person.name);
// 销毁
applicationContext.close();
}
Bean的作用范围的配置
①scope取值
singleton,默认取值,Spring会采用单例模式创建这个对象,工厂关闭所有对象就会销毁
prototype,多例模式
②request
应用在web项目中,Spring创建这个类一行,将这个对象存入到request范围中
③session
应用在web项目中,Spring创建这个类以后,将这个对象存入到session范围中
④globalsession
应用在web项目中,必须在porlet(基于Java的Web组件,子域名)环境下使用。如果没有这种环境,相对于session。
工厂实例化的方式
1.无参构造-默认
2.静态工厂实例化
<bean id="user" class="pers.liuchengyin.demo3.User" factory-method="creatUser"></bean>
public class User {
public User(){
System.out.println("默认构造方法!");
}
public static User creatUser(){
System.out.println("调用了creatUser");
return new User();
}
}
3.实例工厂实例化
<bean id="user" class="pers.liuchengyin.demo3.User" factory-method="creatUser"></bean>
<bean id="user2" class="pers.liuchengyin.demo3.User" factory-bean="user"></bean>