
前面介绍了spring环境的搭建,在搭建spring环境的时候分为java环境和javaWeb环境,在javaWeb环境下通常会结合springMVC使用,在java项目中只需要把spring的包导入工程中,一般初学者会把所有的包全部导入,然后就可以通过获得applicationContext,把类的实例化交给spring管理,然后从spring容器中获得类的实例。
spring中有控制反转(Ioc)和依赖注入(DI)两个概念,Ioc和DI是spring的核心概念,同时也是一种新的编程思想。
控制反转(Ioc)
控制反转,顾名思义就是控制权的改变,在没有接触spring之前,我们要使用一个类的实例,必须使用new的方式生成一个对象,这个过程的主动权掌握在程序员亦自己写的程序中,但是使用了spring之后,实例的创建不再由程序员手动实现,而是由spring容器来完成,实现了控制的反转,即主动权交给了spring的IOC容器。
依赖注入(DI)
一个类包括属性和方法,在创建了实例对象之后,或者在创建实例对象的同时,需要初始化成员变量(属性),在spring之前成员变量的初始化可以通过构造方法或setXXX方法;在spring出现之后,由于实例的创建交给了spring的IOC容器,那么成员变量的初始化也依赖于IOC容器,由容器去注入成员变量的值。
上面介绍了IOC和DI两个概念,可以得出IOC和DI其实是在做一件事,就是spring的IOC容器创建实例对象,一切对象的实例化都交给了spring容器,在程序中不必手动使用new的方式实例化变量。
spring提供两种不同的方式来配置spring,一种是配置文件(XML),另一种是基于注解(Annotation)。下面针对IOC和DI使用两种方式一一做介绍
在介绍之前必须了解如何在java项目中获得spring容器,也即ApplicationContext。
获取ApplicationContext的方式有三种,这里使用的ClassPathXmlApplicationContext,ClassPathApplicationContext是ApplicationContext的子类,这里的cpac就是spring的IOC容器,通过它的getBean()方法可以获得容器中已经初始化的实例。
配置文件(XML)
假如我们有下面的学生类(student)
此类有三个属性id、name、age,下面通过配置文件的方式,在spring的配置文件中配置,
在spring的配置文件中配置 标签,id属性在配置文件中必须唯一,class属性指定类的权限类名,下面有 标签,指定Student的三个属性,且指定了属性值,测试结果如下,
这里可以看到输出了配置的值,这种方式是使用属性注入的方式,要求必须有setXXX方法,还有另外一种方式,通过构造方法的方式注入,
既然是通过构造方法的方式注入,那么在Student类中必须要有这个构造方法,在上面的Student类中已经有了有参的构造方法,我们知道在自定义了有参的构造方法之后,系统不会再默认的提供无参构造,我们还必须添加无参构造,下面看测试结果,
由于我们只注入了id、name两个属性,这里可以打印出,age由于未赋值且其类型为String,则默认为null。
上面是通过配置文件的方式,配置了根据属性、构造方法注入的方式,这个例子是比较简单的,下面看一个复杂的例子,在程序中经常会采用分层、面向接口编程的思绪,
DAO接口
service接口
DAO实现类
service实现类
在service的实现类中有一个DAO层的接口对象,我们下面看这种是如何根据属性注入的,
首先,配置DAO层的bean,这里的class属性必须配置其实现类,然后配置service的实现类,在ServiceImpl中有一个dbDAO类型的属性,使用ref属性引用上面的bean。测试结果如下,
ref属性可以引用spring配置文件中的bean,使用id的值。
通过上面的介绍,可以知道使用配置文件这种方式可以很方便的配置,但是当需要配置的类很多,且依赖很多的情况下,这种方式会很繁琐,那么另外一种方式便派上了用场。
注解(Annotation)
spring提供@Component、@Repository、@Controller、@Service四种注解,其实,只使用@Component一个便可以做到,@Repository、@Controller、@Service只是针对不同的层设置的,可以更加明显,@Repository对应DAO层,@Controller对应控制层,@Service对应服务层,使用这三个注解可以明显的分层,使系统容易理解,也可以只使用@Component。
使用了注解需要开启组件自动扫描机制,在spring的配置文件中开启组件自动扫描机制,需要context命名空间的支持,下面是一个配置文件的例子,
在spring配置文件的头部添加context命名空间的支持,然后使用 标签开启组件扫描,base-package属性指定扫描的基包,此包及此包下的子包都会进行扫描。开启了组件扫描之后,还需要自动注入,网上有说需要: ,其实前面的组件扫描已经包含了此标签的作用,为此不需要配置此标签了,自动注入默认根据类型(byType)进行注入,还有根据名字注入(byName)即bean中id的值,还有根据构造方法注入(constructor)。自动注入需要@Aotuwired注解,此注解可以放在属性上,也可以放在setXXX方法上,放在属性上则可以省略setXXX方法,下面是具体的例子
在类上使用@Component注解,且指定了实例的名为su,如果不指定则默认为类名称首字母小写,即studentAnnotation。
下面是一个自动扫描和自动注入的例子,
类上使用了@Service注解,属性上使用了@Autowired注解,这时setDbDAO()方法可以不要。@Autowired注解就是为了省略setXXX方法的,@Autowired注解默认使用的按照类型注入,如果存在多个相同类型的实例,这里自动注入会失败,为了可以正确注入,引入另外一个注解@Qualifier(value=""),此注解的value属性可以指定一个bean的id值,做到自动注入。
@Qualifier可以用在属性或者setXXX方法上。
综上,通过配置文件和注解两种方式介绍了依赖注入。
1 IoC,(Inverse of Control)控制反转,其包含两个内容:其一是控制,其二是反转。在程序中,被调用类的选择控制权从调用它的类中移除,转交给第三方裁决。这个第三方指的就是Spring的容器。IoC另解,依赖注入(Dependency Injection),调用类对被调用类的依赖关系由第三方注入,以移除调用类对被调用类的引用。
2 aop,面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
3 AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
4 主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改 变这些行为的时候不影响业务逻辑的代码。
扩展资料:
IoC是一个很大的概念,可以用不同的方式实现。其主要形式有两种:
依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源。
依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)
实现数据访问层
数据访问层有两个目标。第一是将数据库引擎从应用中抽象出来,这样就可以随时改变数据库—比方说,从微软SQL变成Oracle。不过在实践上很少会这么做,也没有足够的理由未来使用实现数据访问层而进行重构现有应用的努力。
第二个目标是将数据模型从数据库实现中抽象出来。这使得数据库或代码开源根据需要改变,同时只会影响主应用的一小部分——数据访问层。这一目标是值得的,为了在现有系统中实现它进行必要的重构。
模块与接口重构
依赖注入背后的一个核心思想是单一功能原则(single responsibility principle)。该原则指出,每一个对象应该有一个特定的目的,而应用需要利用这一目的的不同部分应当使用合适的对象。这意味着这些对象在系统的任何地方都可以重用。但在现有系统里面很多时候都不是这样的。
随时增加单元测试
把功能封装到整个对象里面会导致自动测试困难或者不可能。将模块和接口与特定对象隔离,以这种方式重构可以执行更先进的单元测试。按照后面再增加测试的想法继续重构模块是诱惑力的,但这是错误的。
使用服务定位器而不是构造注入
实现控制反转不止一种方法。最常见的办法是使用构造注入,这需要在对象首次被创建是提供所有的软件依赖。然而,构造注入要假设整个系统都使用这一模式,这意味着整个系统必须同时进行重构。这很困难、有风险,且耗时。
AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。
上面的陈述可能过于理论化,举个简单的例子,对于“雇员”这样一个业务实体进行封装,自然是OOP/OOD的任务,我们可以为其建立一个“Employee”类,并将“雇员”相关的属性和行为封装其中。而用AOP设计思想对“雇员”进行封装将无从谈起。
同样,对于“权限检查”这一动作片断进行划分,则是AOP的目标领域。而通过OOD/OOP对一个动作进行封装,则有点不伦不类。
换而言之,OOD/OOP面向名词领域,AOP面向动词领域。
面向过程编程离我们已经有些遥远,面向对象编程正主宰着软件世界。当每个新的软件设计师都被要求掌握如何将需求功能转化成一个个类,并且定义它们的数据成员、行为,以及它们之间复杂的关系的时候,面向切面编程(Aspect-Oriented Programming,AOP)为我们带来了新的想法、新的思想、新的模式。
如果说面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的话;那么面向切面编程则是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即可。
面向切面编程是一个令人兴奋不已的新模式。就开发软件系统而言,它的影响力必将会和有着数十年应用历史的面向对象编程一样巨大。面向切面编程和面向对象编程不但不是互相竞争的技术而且彼此还是很好的互补。
面向对象编程主要用于为同一对象层次的公用行为建模。它的弱点是将公共行为应用于多个无关对象模型之间。而这恰恰是面向切面编程适合的地方。有了 AOP,我们可以定义交叉的关系,并将这些关系应用于跨模块的、彼此不同的对象模型。AOP 同时还可以让我们层次化功能性而不是嵌入功能性,从而使得代码有更好的可读性和易于维护。它会和面向对象编程合作得很好。
参考资料:
IOC(Inverse of Control):控制反转。
1、本来程序使用哪一个bean是在程序中指定(由程序员具体指定),而使用Spring以后我们将具体的配置写在xml中,由xml来控制;
2、本来类的实例化需要通过new XX() 来实例化一个对象,现在通过spring容器来帮忙实例化类的对象
icon sushi 118 Beta 1
Icon sushi 精致小巧的图标编辑程序,能将 bmp 档案转成 ico 的图示编辑工具,此外它更可以处理 Windows XP 用的图示文件,让你的桌面更加多采多姿。
>
IOC这个缩写有多种意思,比如:控制反转、国际奥林匹克委员会、初始作战能力、政府间海洋学委员会、IBM智慧城市智能运行中心等。
控制反转(InversionofControl,缩写为IoC)
是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(DependencyInjection,简称DI),还有一种方式叫“依赖查找”(DependencyLookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
国际奥林匹克委员会
简称为国际奥委会,是一个国际性的、非政府的、非赢利的组织。是奥林匹克运动的领导机构,它于1981年9月17日得到瑞士联邦议会的承认,确认其为无限期存在的具有法人资格的国际机构。总部位于瑞士洛桑。由法国人皮埃尔·德·顾拜旦建立,首任主席是泽麦特里乌斯·维凯拉斯。
初始作战能力
一般指武器装备服役并初步具备作战能力。例如,一般认为F-22A2002年服役,并于2005年形成初始作战能力。
政府间海洋学委员会
是为通过科学调查增加人类关于海洋自然现象及资源的知识而建立的机构。政府间海洋学委员会于1960年成立,是联合国教科文组织的下属的一个促进各国开展海洋科学调查研究和合作活动的国际性政府间组织。
IBM智慧城市智能运行中心
IBMIntelligentOperationsCenter可监视并管理城市服务。它通过集中化的智能,提供了对日常城市运营的洞察。现在,城市、政府机构和企业可以优化运营效率并改进规划。ioc是指IBM智慧城市智能运行中心(IOC)。
以上就是关于什么是AOP、IOC他们的作用是什么全部的内容,包括:什么是AOP、IOC他们的作用是什么、Spring IOC核心功能快速入门、不懂控制反转么大白话讲清楚spring中这些晦涩的概念等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)