- 什么是IOC?
在传统的开发中,我们通过new关键字创建对象,这种方式创建对象不利于我们在需求变更后的修改操作,例如:原来的需求是使用Orcle数据库存储数据,后来需求修改为使用Mysql数据库存储数据,此时我们就要去源码中找到创建orcle数据库对象的语句,重新创建Mysql对象并调用对象的相关方法。这显然不是我们希望看到的,我们希望的是只要修改配置文件,源码尽量保持不动,达到我们的修改目的。
于是强大的SpringIOC登场,IOC全称为Inversion Of Control,也就是控制反转,意思是我们不自己创建对象,将对象的创建权交给Spring管理,我们直接使用创建好的对象即可。
下面举例传统开发方式与Spring开发方式的区别
- 传统开发方式
- 编写UserDao接口
public interface UserDao {
public void save();
public void delete();
}
2、编写UserDaoOrcleImpl 实现类
public class UserDaoOrcleImpl implements UserDao{
@Override
public void save() {
System.out.println("orcle-save");
}
@Override
public void delete() {
System.out.println("orcle-delete");
}
}
3、编写UserDaoMysqlImpl 实现类
public class UserDaoMysqlImpl implements UserDao{
@Override
public void save() {
System.out.println("mysql-save");
}
@Override
public void delete() {
System.out.println("mysql-delete");
}
}
4、编写测试类
public class test {
public static void main(String[] args){
UserDaoOrcleImpl userDaoOrcle = new UserDaoOrcleImpl();
userDaoOrcle.save();
userDaoOrcle.delete();
}
}
5、修改数据库为mysql
public class test {
public static void main(String[] args){
UserDaoMysqlImpl userDaoMysql = new UserDaoMysqlImpl();
userDaoMysql.save();
userDaoMysql.delete();
}
}
在这里我们看到,当我们需求变动时,要去源码中重新创建对象,使得维护变得非常的不方便,在这个例子中,可能大家觉得不是很麻烦,但是往往项目中的类系是非常庞大的,那么维护起来的难度对开发人员来说可以说是一场”灾难”,也许只有经历过的人才能明白这种心情,Spring解救来了。
- Spring开发方式
- 将类交给Spring管理,即添加配置文件ApplicationContext.xml,在配置文件中加入bean,其中id为自己起的名称,class为交给Spring管理的类的全路径。
<?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">
<!--<bean id="userDao" class="com.ph.demo1.UserDaoMysqlImpl" />-->
<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl" />
</beans>
2.通过ClassPathXmlApplicationContext加载配置文件
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
3.通过getBean(id)方式获取对象并强制转化类型
UserDao userDao =(UserDao)applicationContext.getBean("userDao");
4.编写测试类
public class test {
public static void main(String[] args){
// 1、加载配置文件(加载文件系统下的配置文件)
// ApplicationContext applicationContext= new FileSystemXmlApplicationContext("B:\\SpringPro1\\src\\applicationContext.xml");
// 1、加载配置文件(加载类路径下的配置文件)
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
// 2、 参数为配置文件中bean的id
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
//3、调用UserDaoOrcleImpl类中的save方法
userDao .save();
userDao .delete();
}
}
5.修改数据库为mysql
只需要修改配置文件,将
<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl" 换成
<bean id="userDao" class="com.ph.demo1.UserDaoMysqlImpl" 即可
<?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">
<bean id="userDao" class="com.ph.demo1.UserDaoMysqlImpl" />
<!--<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl" />-->
</beans>
使用SpringIOC可以在尽量不修改源码的,对程序进行扩充,只需要修改配置文件即可,而使用接口就是为了统一格式要求,如果没有遵循同一个接口,那么可能导致修改配置文件后还要对源码进行修改。
- SpringDI依赖注入
依赖注入的前提必须要有IOC环境,同时Spring管理类的时候才能将类的依赖的属性值注入(设置)进去。
依赖注入是通过配置文件对Spring管理类中依赖的属性进行赋值的过程。
依赖注入实质上就是对象属性赋值的过程
- 传统方式
A a =new class();//创建对象
name=”张三”;//依赖注入即属性赋值
2.DI方式
(1)实现类中的属性要提供set方法
public class UserDaoMysqlImpl implements UserDao{
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("mysql-save"+name);
}
@Override
public void delete() {
System.out.println("mysql-delete");
}
}
(2)在配置文件中配置依赖注入
<?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">
<bean id="userDao" class="com.ph.demo1.UserDaoMysqlImpl" >
<property name="name" value="李四"/>
</bean>
<!--<bean id="userDao" class="com.ph.demo1.UserDaoOrcleImpl" />-->
</beans>
(3)测试
public class test {
public static void main(String[] args){
// 1、加载配置文件(加载类路径下的配置文件)
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
// 2、 参数为配置文件中bean的id
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
//3、调用UserDaoMysqlImpl类中的save方法
userDao.save();
}
}
(4)运行结果
mysql-save李四