1.ioc定义
IoC就是Inversion of Control,控制反转。
IoC 的概念是Michael Mattson在1996年一篇讨论面向对象框架(Object Oriented Frameworks)的文章中提出的。面向对象设计及编程(OOD/OOP)的基本思想简单地说就是把复杂软件系统分解成通过接口相互合作的对象。这些对象类的内部实现之间并不互相牵扯,因而降低了问题的复杂性,且可独立灵活地被重用和扩展。经典面向对象的编程语言(如C++,Java)的侧重点就是提供语言机制来方便并简化这种基于对象类的分解,重用和扩展。
在基于模块化软件组装部署配置框架设计中,Michael Mattson提出了基于IOC容器的IoC设计原则。依照该原则,业务逻辑模块并不需知道更不必调用组件框架的服务,例如不用关心和调用其factory或lookup其directory或context等。软件的组装部署和配置完全是由Ioc容器反过来主动控制业务逻辑模块来安排。Michael Mattson用所谓的好莱坞原则(Hollywood Principle)“别来找我,到时候,我会去找你”(don't call me, I will call you)形象地比喻了这一设计思想。这个比喻中的“我”指的是Ioc容器,“你”则是被其调遣配置的一个组件。
在Java开发中,IoC地实现通过工厂模式,由工厂新建所需要的类。在j2ee轻量级框架中,则由ioc容器来控制。ioc容器的一个著名实现是Spring.另外一个Guice,google名下的产物.这两种实现代表了ioc技术的两个发展方向。他们之间的最根本的区别在于,spring采用XML文件的形式来配置依赖注入关系;而Guice完全通过Java 5注解实现类型安全的注入。
2.spring的ioc容器实现
使用spring的方式,创建一个由spring ioc容器控制的ioc的应用程序。
1)定义用于接口,打印“hello,world”消息
- public interface MessageProvider {
-
public String getMessage();
- }
public interface MessageProvider {
public String getMessage();
}
2)实现这个接口
- public class MessageHello implements MessageProvider {
-
public String getMessage() {
-
String message = "hello,world";
-
return message;
- }
- }
public class MessageHello implements MessageProvider {
public String getMessage() {
String message = "hello,world";
return message;
}
}
3)setter injection
- public class HelloWorld {
-
private MessageProvider provider;
-
-
public void setProvider(MessageProvider provider) {
-
this.provider = provider;
- }
-
-
public void showMessage() {
- System.out.println(provider.getMessage());
- }
- }
public class HelloWorld {
private MessageProvider provider;
public void setProvider(MessageProvider provider) {
this.provider = provider;
}
public void showMessage() {
System.out.println(provider.getMessage());
}
}
4)配置依赖注入关系
在applicationContext.xml中配置:
- <?xml version="1.0" encoding="UTF-8"?>
-
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
-
- <beans>
-
<bean id="helloBean" class="test.spring.HelloWorld">
-
<property name="provider">
-
<ref local="helloProvider"/>
- </property>
- </bean>
-
<bean id="helloProvider" class="test.spring.MessageHello"></bean>
- </beans>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloBean" class="test.spring.HelloWorld">
<property name="provider">
<ref local="helloProvider"/>
</property>
</bean>
<bean id="helloProvider" class="test.spring.MessageHello"></bean>
</beans>
5)创建测试类
- public class ShowHello {
-
public static void main(String[] args){
-
try{
-
XmlBeanFactory factory =new XmlBeanFactory(new FileSystemResource("src/applicationContext.xml"));
-
HelloWorld messageReader = (HelloWorld)factory.getBean("helloBean");
- messageReader.showMessage();
-
}catch(Exception ex){
- System.out.println(ex.toString());
- }
- }
- }
public class ShowHello {
public static void main(String[] args){
try{
XmlBeanFactory factory =new XmlBeanFactory(new FileSystemResource("src/applicationContext.xml"));
HelloWorld messageReader = (HelloWorld)factory.getBean("helloBean");
messageReader.showMessage();
}catch(Exception ex){
System.out.println(ex.toString());
}
}
}
运行测试类,控制台输出:Hello,World!
3.Guice的ioc容器实现
Guice下载链接(http://code.google.com/p/google-guice/downloads/list)
1)定义接口
- public interface MessageProvider{
-
void myMethod();
- }
public interface MessageProvider{
void myMethod();
}
2)定义实现类
- public class MessageHello implements MessageProvider{
-
public void myMethod(){
-
System.out.println("Hello,World!");
- }
- }
public class MessageHello implements MessageProvider{
public void myMethod(){
System.out.println("Hello,World!");
}
}
3)Guice进行注入类
- public class Client{
- MessageProvider service;
-
@Inject
-
void injectMessageProvider(MessageProvider service){
-
this.service = service;
- }
-
public void myMethod(){
- service.myMethod();
- }
- }
public class Client{
MessageProvider service;
@Inject //告诉容器,这里的service对象的引用,需要进行注入
void injectMessageProvider(MessageProvider service){ //这里的方法名字可以任意定义
this.service = service;
}
public void myMethod(){
service.myMethod();
}
}
4)定义Guice的Module文件告诉容器如何进行注入
- import com.google.inject.Binder;
-
import com.google.inject.Module;
-
import com.google.inject.Scopes;
-
public class MyModule implements Module{
-
public void configure(Binder binder){
-
binder.bind(MessageProvider.class).to(MessageHello.class).in(Scopes.SINGLETON);
-
- }
- }
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.Scopes;
public class MyModule implements Module{
public void configure(Binder binder){
binder.bind(MessageProvider.class).to(MessageHello.class).in(Scopes.SINGLETON);
// 这句代码的意思是说:运行时动态的将MessageHello对象赋给MessageProvider定义的对象,而且这个对象是单例的。
}
}
5)创建测试类
- import com.google.inject.Guice;
-
import com.google.inject.Injector;
-
-
public class Test{
-
public static void main(String[] args){
-
MyModule module = new MyModule();
-
- Injector injector = Guice.createInjector(module);
-
-
Client client = new Client();
- injector.injectMembers(client);
-
- client.myMethod();
- }
- }
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Test{
public static void main(String[] args){
MyModule module = new MyModule();
// 定义注射规则
Injector injector = Guice.createInjector(module);
// 根据注射规则,生成注射者
Client client = new Client();
injector.injectMembers(client);
// 注射者将需要注射的bean,按照规则,把client这个客户端进行注射
client.myMethod();
}
}
运行测试类,控制台输出:Hello,World!
分享到:
相关推荐
传统成本管理模式,以标准成本为核心,基于直接材料、直接人工和制造费用的分摊,已无法满足现代企业的战略决策需求。1992年,John K. Shank 和 Vijay Govindarejin 提出的战略成本管理定义,强调了从战略角度全面...
小议和谐社会背景下公民教育.pdf
小议新会计制度下企业的负债观.doc
【文章摘要】本文主要探讨了在新的形势下大额现金管理的重要性,特别是在反洗钱方面的挑战。通过对河南省近年来现金收支情况的分析,发现现金流量逐年增加,储蓄性收支占比大且呈上升趋势,同时现金交易在经济活动中...
基于信息化手段的设计说明教学小议.docx
【小议哲学视野下的创新】 本文探讨了创新的哲学内涵,以及在认识创新时常见的误区,并提出了用唯物辩证法的三大规律来理解和推动创新。创新是社会进步的关键驱动力,它体现在人类的创造性活动中,表现为对既有事物...
小议新形势下农信社创新发展思索.doc
小议光造型下的雕塑视象.doc
小议传媒暴力下越轨行为的对策.doc
在电子商务专业教学中,基于商务平台的实训模式已经成为一种创新且必要的教学手段,尤其是在当前的教育环境下,这种模式能够弥补传统教学方式的不足,更好地培养学生的实际操作能力和职业素养。本文将探讨电子商务...
小议转型社会下的社保规则入宪.doc
小议新经济下反垄断法的困境.doc
【小议低碳经济下运输业发展对策】 低碳经济作为一种新型的经济发展模式,强调在可持续发展的前提下,通过技术创新、制度创新和产业转型等方式,降低经济活动对环境的影响,实现资源的高效利用和循环利用。在运输业...
### 抖动算法小议——深入探讨多媒体技术中图像的抖动算法 #### 引言 在多媒体领域,尤其是在图像处理技术中,抖动算法扮演着至关重要的角色。本文旨在通过对抖动算法的深入解析,帮助读者理解其原理及其在灰度...
综上所述,在互联网时代下打造智慧校园,需要全面整合互联网、移动通信技术、大数据和物联网等多种现代信息技术,通过智能化的信息管理平台,实现校园内部资源和信息的高度集成,优化教学和管理流程,提高教学质量,...
小议网络环境下计算机数据安全问题的探讨.docx
在数字化和网络化的背景下,学报面临新的机遇与挑战。数字化为学报提供了更广泛的传播途径,使得读者可以通过关键词搜索快速获取所需信息,但这并不意味着学报可以忽视自身的专业化建设。 首先,高校学报的专业化...
**小议MVC模式开发** MVC(Model-View-Controller)模式是一种广泛应用于Web应用程序设计的架构模式,它的核心思想是将业务逻辑、数据处理和用户界面进行分离,以提高代码的可维护性和可扩展性。在本文中,我们将...
VB与VC_环境下基于MapX的二次开发比较.pdf VC++环境下快速可重组测控实验系统的开发.pdf VC6_0与MATLAB7_x混合编程方法研究.pdf VC_6_0和Matlab编程矩阵电路程序.pdf VC_6_0实现客户端与服务器端通讯.pdf VC_6_0实现...
本管理为积极的战略成本管理,以实现企业价值的最大化。战略成本管理强调的是从全局视角出发,关注成本与价值的最佳组合,而非单纯地降低生产成本。在市场经济体制下,企业面临更加复杂多变的环境,传统的成本管理...