IOC---控制反转(Inversion of Control),作为Spring核心思想,学习Spring时值得我们需要去关注的一些点大概有以下几点:
1. 什么是IOC?
简单来说,就是对象由容器创建的过程。所谓控制反转就是把对象(bean)和维护对象(bean)之间的关系的权利转移到Spring容器中去了(beans.xml)而程序本身不再维护了。
2. 那什么是Spring容器,Spring容器是做什么的?
Spring容器就是致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的"一站式"选择,并贯穿表现层、业务层及持久层。Spring可以降低各种框架的使用难度,他提供了对各种优秀框架(如Struts、Hibernate、Hessian、Quartz等)的直接支持。
3. IOC是怎么样实现的?
传统的J2SE程序设计,我们都是在程序内部通过new 来创建对象,也就是说主动去创建依赖对象。但是在IOC中,对象都是由IOC容器来给你创建的,那到底是通过怎么样的方式来实现的呢。
简单来说就是通过xml 或者注解这两种方式给IOC容器一个通知,然后通过java反射机制去创建bean。
4. IOC容器具体创建对象的方式有哪几种?
a). 通过构造方法实例化。这就需要在xml 中配置的元数据制定的class 需要提供一个默认的空构造方法。
<span style="font-size:14px;"><bean id="exampleBean" class="examples.ExampleBean"/></span>
b). 通过态工厂方法实例化。当然通过静态工厂方法实例化得到的是一个单例(singleton)的对象。
首先在beans.xml 中需配置:
<bean id="clientService"
class="examples.ClientService"
factory-method="createInstance"/>
静态工厂类:
public class ClientService {
private static ClientService clientService = new ClientService();
private ClientService() {}
public static ClientService createInstance() {
return clientService;
}
}
c). 通过实例工厂实例化。
xml配置:
<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
<!-- the bean to be created via the factory bean -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
实体工厂类:
public class DefaultServiceLocator {
private static ClientService clientService = new ClientServiceImpl();
private DefaultServiceLocator() {}
public ClientService createClientServiceInstance() {
return clientService;
}
}
实体工厂可以持有超过一个工厂方法:
xml配置:
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
<bean id="accountService"
factory-bean="serviceLocator"
factory-method="createAccountServiceInstance"/>
实体类:
public class DefaultServiceLocator {
private static ClientService clientService = new ClientServiceImpl();
private static AccountService accountService = new AccountServiceImpl();
private DefaultServiceLocator() {}
public ClientService createClientServiceInstance() {
return clientService;
}
public AccountService createAccountServiceInstance() {
return accountService;
}
}