网站设计费用明细,北京网页模板建站,湖南省造价管理站官网,做网站不要盲目跟风一、Spring的IoC(Inversion of Control)。这是Spring中得有特点的一部份。IoC又被翻译成“控制反转”#xff0c;也不知道是谁翻译得这么别扭#xff0c;感觉很深奥的词。其实#xff0c;原理很简单#xff0c;用一句通俗的话来说#xff1a;就是用XML来定义生成的对象。I…一、Spring的IoC(Inversion of Control)。这是Spring中得有特点的一部份。IoC又被翻译成“控制反转”也不知道是谁翻译得这么别扭感觉很深奥的词。其实原理很简单用一句通俗的话来说就是用XML来定义生成的对象。IoC其实是一种设计模式Spring只是实现了这种设计模式。这种设计模式是怎么来的呢是实践中逐渐形成的。第一阶段用普通的无模式来写Java程序。一般初学者都要经过这个阶段。第二阶段频繁的开始使用接口这时接口一般都会伴随着使用工厂模式。第三阶段使用IoC模式。工厂模式还不够好1因为的类的生成代码写死在程序里如果你要换一个子类就要修改工厂方法。2一个接口常常意味着一个生成工厂会多出很多工厂类。 可以把IoC模式看做是工厂模式的升华可以把IoC看作是一个大工厂只不过这个大工厂里要生成的对象都是在XML文件中给出定义的然后利用Java的“反射”编程根据XML中给出的类名生成相应的对象。从实现来看IoC是把以前在工厂方法里写死的对象生成代码改变为由XML文件来定义也就是把工厂和对象生成这两者独立分隔开来目的就是提高灵活性和可维护性。 IoC中最基本的Java技术就是“反射”编程。反射又是一个生涩的名词通俗的说反射就是根据给出的类名字符串来生成对象。这种编程方式可以让对象在生成时才决定要生成哪一种对象。我在最近的一个项目也用到了反射当时是给出一个.properties文本文件里面写了一些全类名包名类名然后要根据这些全类名在程序中生成它们的对象。反射的应用是很广泛的象Hibernate、String中都是用“反射”做为最基本的技术手段。 在过去反射编程方式相对于正常的对象生成方式要慢10几倍这也许也是当时为什么反射技术没有普通应用开来的原因。但经SUN改良优化后反射方式生成对象和通常对象生成方式速度已经相差不大了但依然有一倍以上的差距。 所以要理解IoC你必须先了解工厂模式和反射编程否则对它产生的前因后果和实现原理都是无法理解透彻的。只要你理解了这一点你自己也完全可以自己在程序中实现一个IoC框架只不是这还要涉及到XML解析等其他知识稍微麻烦一些。 IoC最大的好处是什么因为把对象生成放在了XML里定义所以当我们需要换一个实现子类将会变成很简单一般这样的对象都是现实于某种接口的只要修改XML就可以了这样我们甚至可以实现对象的热插拨有点象USB接口和SCIS硬盘了。 IoC最大的缺点是什么1生成一个对象的步骤变复杂了其实上操作上还是挺简单的对于不习惯这种方式的人会觉得有些别扭和不直观。2对象生成因为是使用反射编程在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说这点损耗是微不足道的除非某对象的生成对效率要求特别高。3缺少IDE重构操作的支持如果在Eclipse要对类改名那么你还需要去XML文件里手工去改了这似乎是所有XML方式的缺憾所在。 总的来说IoC无论原理和实现都还算是很简单的。一些人曾认为IoC没什么实际作用这种说法是可以理解的因为如果你在编程中很少使用接口或很少使用工厂模式那么你根本就没有使用IoC的强烈需要也不会体会到IoC可贵之处。有些人也说要消除工厂模式、单例模式但是都语焉不详、人云亦云。但如果你看到IoC模式和用上Spring那么工厂模式和单例模式的确基本上可以不用了。但它消失了吗没有Spring的IoC实现本身就是一个大工厂其中也包含了单例对象生成方式只要用一个设置就可以让对象生成由普通方式变单一实例方式非常之简单。 总结 1IoC原理很简单作用的针对性也很强不要把它看得很玄乎。 2要理解IoC首先要了解“工厂、接口、反射”这些概念。二、Spring中IOC的实现了解了IOC模式的思想以及其优点再来学习其实现。上面大致描述了PicoContainer以及Spring各自对IOC的实现这篇来详细看一下Spring中它的实现。Spring中IOC贯穿了其整个框架但正如martinflower所说“saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels”IOC已经称为框架设计中必不可少的部分。就实现上来讲Spring采取了配置文件的形式来实现依赖的注射并且支持Type2 IOCSetter Injection以及Type3 IOCConstructor Injection。Spring中IOC的实现的核心是其Core Bean Factory它将框架内部的组件以一定的耦合度组装起来并对使用它的应用提供一种面向服务的编程模式(SOPService-Orient Programming)比如Spring中的AOP、以及持久化Hibernate、ibatics的实现。 首先从最底层最基础的factory Bean开始先来看org.springframework.beans.factory.BeanFactory接口它是一个非常简单的接口getBean方法是其中最重要的方法Spring通常是使用xml来populate Bean所以比较常用的是XMLFactoryBean。用一个简单的示例看一下其用法。首先写下两个Bean类ExampleBean 类public class ExampleBean { private String psnNamenull; private RefBean refbeannull; private String addinfonull; public String getAddinfo() { return getRefbean().getAddress()getRefbean().getZipcode(); } public String getPsnName() { return psnName; } public void setPsnName(String psnName) { this.psnName psnName; } public void setRefbean(RefBean refbean) { this.refbean refbean; } public RefBean getRefbean() { return refbean; } public void setAddinfo(String addinfo) { this.addinfo addinfo; }}RefBean类public class RefBean { public String getAddress() { return address; } public void setAddress(String address) { this.address address; } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode zipcode; } private String zipcodenull; private String addressnull;}其xml配置文件 Bean.xml ?xml version1.0 encodingUTF-8?!DOCTYPE beans PUBLIC -//SPRING//DTD BEAN//ENhttp://www.springframework.org/dtd/spring-beans.dtdbeans bean idexampleBean classtest.ExampleBean property namepsnNamevaluexkf/value/property property namerefbean ref beanrefBean/ /property /bean bean idrefBean classtest.RefBean property nameaddressvalueBeiJing/value/property property namezipcodevalue100085/value/property /bean/beans然后可以写个测试类来测试当然需要Spring中的Spring-core.jar以及commons-logging.jar当然在elipse中可以通过安装spring-ide插件来轻松实现。public class Test { public static void main(String[] args){ try{ Resource input new ClassPathResource(test/Bean.xml); System.out.println(resource is:input); BeanFactory factory new XmlBeanFactory(input); ExampleBean eb (ExampleBean)factory.getBean(exampleBean); System.out.println(eb.getPsnName()); System.out.println(eb.getAddinfo()); } catch(Exception e){ e.printStackTrace(); }}这样通过BeanFactory的getBean方法以及xml配置文件避免了在test类中直接实例化ExampleBean消除了应用程序(Test)与服务(ExampleBean)之间的耦合实现了IOC控制反转或者说实现了依赖的注射Dependency Injection。refbean ref beanrefBean/ /property /bean bean idrefBean classtest.RefBean property nameaddressvalueBeiJing/value/property property namezipcodevalue100085/value/property /bean/beans然后可以写个测试类来测试当然需要Spring中的Spring-core.jar以及commons-logging.jar当然在elipse中可以通过安装spring-ide插件来轻松实现。public class Test { public static void main(String[] args){ try{ Resource input new ClassPathResource(test/Bean.xml); System.out.println(resource is:input); BeanFactory factory new XmlBeanFactory(input); ExampleBean eb (ExampleBean)factory.getBean(exampleBean); System.out.println(eb.getPsnName()); System.out.println(eb.getAddinfo()); } catch(Exception e){ e.printStackTrace(); }}这样通过BeanFactory的getBean方法以及xml配置文件避免了在test类中直接实例化ExampleBean消除了应用程序(Test)与服务(ExampleBean)之间的耦合实现了IOC控制反转或者说实现了依赖的注射Dependency Injection。转载于:https://www.cnblogs.com/gym_sky/archive/2011/04/21/2024103.html