声明:内容并非原创,主要来自《Spring2.0技术手册》一书
Spring 的主要优点:
1 对Bean 的管理
2 不依赖于底层实现,而依赖于抽象,依赖于接口,依赖于注入
前提:
1 当组件出现重用时,再考虑使用Spring IoC
2 当组件用到外部资源时,使用Spring IoC
3 不要为IoC而IoC
1 IoC
Inversion of Control,常译为控制反转。
简单的说,高层不依赖于底层实现,而是依赖于接口。
举个简单的例子,比如电视机,最基本的条件是有电才能开机。
用Spring的思想来解释就是不关心底层电是如何产生的,并不需要拿一个发电机来才能看电视,给我一个(电的)接口也就是插座就行。
借用一句英文来概括:Don't call me,I'll call you
IOC: 依赖注入
这里主要通过举简单的例子,来试图解释IOC的复杂原理。
没有IOC的代码:
高层应用调用底层,应用依赖底层模块。
改进1
1> 引入接口
public interface IDeviceWrite {
public void saveToDevice();
}
2>接口实现类
public class FloppyImpl implements IDeviceWrite {
public void saveToDevice() {
// TODO Auto-generated method stub
System.out.println("Save to Floppy...");
}
}
3>上层应用
public class Business {
public void save(IDeviceWrite write){
write.saveToDevice();
}
public static void main(String[] args){
Business business = new Business();
IDeviceWrite floppy = new FloppyImpl();
business.save(floppy);
}
}
可以看到通过引入接口上层与底层的依赖解耦了,不依赖于底层实现,面向接口更灵活了。
改进2:
在改进1的基础上增加了配置文件,通过修改配置文件就可以改变上层应用引用底层的实例,更加灵活。
public class BusinessFactory {
private IDeviceWrite write;
private static BusinessFactory instance = null;
private BusinessFactory(){
this.setWrite();
}
public IDeviceWrite getWrite() {
return write;
}
public void setWrite() {
Properties prop = new Properties();
try{
prop.load(new FileInputStream("./conf.properties"));
String deviceClass = prop.getProperty("writer.class");
write = (IDeviceWrite)Class.forName(deviceClass).newInstance();
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}catch (IllegalAccessException e) {
e.printStackTrace();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (InstantiationException e) {
e.printStackTrace();
}
}
public static synchronized BusinessFactory getInstance(){
if(null == instance)
return new BusinessFactory();
return instance;
}
public static void main(String[] args){
BusinessFactory business = getInstance();
IDeviceWrite write = business.getWrite();
write.saveToDevice();
}
}
4>几个主要的类
org.springframework.context.ApplicationContext
org.springframework.context.support.ClassPathXmlApplicationContext
org.springframework.context.support.FileSystemXmlApplicationContext
Instantiating a container
// create and configure beans
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});
// retrieve configured instance
PetStoreServiceImpl service = context.getBean("petStore", PetStoreServiceImpl.class);
// use configured instance
List userList service.getUsernameList();
5> The following example shows the basic structure of XML-based configuration metadata
<?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-3.0.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
【编者按】
1 IOC (inversion of Control 控制反转)
在reference中IOC这部分主要讲的是DI(dependece Inject)
DI (Dependency Injection 依赖注入)又主要讲的是
构造函数注入 与 Set 注入
推荐Set注入