class Comic{} //漫画类
class Novel{} //小说类
class Reader{
void read() {
Comic comic=new Comic();
book.show();
}
}
控制反转
交给其他人来管理,再使用
依赖注入
,只把Comic实例注入到Reader对象中
依赖倒置
让程序要依赖于抽象接口,不要依赖于具体实现,所以将Comic 和 Novel 抽象出一个Book类来传入
class Book{} //书籍抽象类
class Comic extends Book{} //漫画类
class Novel extends Book{} //小说类
class Reader{
Book book;
Reader(Book book){this.book=book;}
void read() {
book.show();
}
}
class Container{
ClassName ProduceClass(String classname){
//反射等等技术
return classname;
}
}
这时候Reader很开心
Reader reader=new Reader();
reader.read(Container.ProduceClass("Comic")); //读漫画
reader.read(Container.ProduceClass("Novel")); //读小说
控制反转
,依赖注入
是相辅相成的,你用了控制反转
把new
的控制权交出去,你就需要依赖注入
将实例
注入进去,而使用依赖倒置
是为了程序的可扩展性。public class Reader{
private Book book;
Reader(Book book){this.book=book;}
public void read() {
book.show();
}
}
public class Reader{
private Book book;
public void setBook(Book book){
this.book=book;
}
public void read() {
book.show();
}
}
public interface IRead{
void injectBook(Book book);
}
public class Reader implements IRead{
private Book book;
public void injectBook(Book book) {
this.book= book;
}
public void read() {
book.show();
}
}
如上图所示,SpringIoC是一个成熟的IoC容器,其实主要通过两个概念来实现IoC,通过Spring-config.xml配置文件,将对象和依赖对象都配置到XML文件中,然后通过架构中的上下文(context)类,来自动实现Ioc
public class Book {
public void Show(){}
}
public class Comic extends Book
{
public void Show()
{
System.out.println("Comic");
}
}
public class Novel extends Book{
public void Show()
{
System.out.println("Novel");
}
} //小说类
public class Reader{
Book book;
public void setBook(Book book){
this.book=book;
}
public void read() {
book.Show();
}
}
<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="Book" class="Book">bean>
<bean id="Comic" class="Comic">bean>
<bean id="Novel" class="Novel">bean>
<bean id="Reader" class="Reader">
<property name="Book" >
<ref bean="Book">ref>
property>
bean>
beans>
// Spring体验
System.out.println("Spring");
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
Reader reader=(Reader) context.getBean("Reader");
reader.setBook((Comic) context.getBean("Comic"));
reader.read();
reader.setBook((Novel) context.getBean("Novel"));
reader.read();