Spring之IOC
要理解IOC的作用和意义,首先需要理解没有IOC的代码开发有哪些问题 以下面的代码为例
//业务层
public class BookServiceImpl implements BookService{
private BookDao bookDao = new BookDaoImpl();
public void save(){
bookDao.save();
}
}
//数据层
public class BookDaoImpl implements BookDao{
public void save(){
System.out.println("book dao save ...");
}
}
业务层需要调用数据层的方法,所以在业务层new了一个数据层的对象。
假如此时我们需要进行代码更新,创建了新的数据层的实现类
//数据层
public class BookDaoImpl2 implements BookDao{
public void save(){
System.out.println("book dao save ...2");
}
}
那么此时,如果业务层的new方法不更改的话就会报错,因此我们就需要业务层更改new BookDaoImpl2()。从这里可以看出代码存在的问题是耦合度过高。
为了解决这类问题,spring的IOC提供了方案 IOC(Inversion of Control)控制反转:使用对象时,由主动new产生对象转换为由外部提供对象,对象的创建控制权由程序转移到外部。
案例演示
为了理解spring的IOC实现方式,用如下一个示例来进行说明。 创建业务层和数据层的接口和实现类
public interface BookDao {
public void save();
}
public class BookDaoImpl implements BookDao{
public void save(){
System.out.println("book dao save...");
}
}
public interface BookService{
public void save();
}
public class BookServiceImpl implements BookService{
private BookDao bookDao = new BookDaoImpl();
public void save(){
System.out.println("book service save...");
bookDao.save();
}
}
然后在配置文件中要注册bean,可以理解为注册bean就是要告诉spring,我们要将类的对象实例交给spring来管理。
..........
<bean id="bookDao" class="com.xxx.xxx.xxx.BookDaoImpl"/>
<bean id="bookService" class="com.xxx.xxx.xxx.BookServiceImpl"/>
..........
通过xml的配置,我们就告诉了springBookDaoImpl和BookServiceImpl这两个类由spring来进行管理。
完成相关配置之后,我们就可以直接调用了。
public class App{
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("XXXX.xml");//导入配置文件
BookDao booDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
测试结果 book dao save...
可以看出,通过注册spring的bean,实现了不使用new方法,spring自动为我们创建了实例。
到这里还没有完全解决我们上面提到的耦合问题,因为BookService依赖于BookDao类,所以仍然存在new方法,要完全解决这个问题就要用到另一个思想DI(依赖注入)。
未完待续。。。。
注:本人理解可能不够到位,代码内容也不完整,bean的实现是比较早期的方式,现在有注解的方式用来实现,不需要xml配置,本文的目的主要是为了自己记笔记。。。。