如何理解spring中的IOC和AOP 怎么说才会让面试官觉得你很牛

wycaigfl 2010-12-28 08:26:35
妖快点回答哦 在线等
...全文
72055 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
leewin27 2011-05-04
  • 打赏
  • 举报
回复
这玩意这像是小三,本来过的挺好的两口子,她非得从中间插一脚,如果她能转正就叫IOC, 没法转正只能是AOP了。
yingzhuo2011 2011-05-04
  • 打赏
  • 举报
回复


这个东西背不会有太大用处,顶多让面试官觉得你挺认真的。别的不会的。
zhang2009 2011-05-04
  • 打赏
  • 举报
回复
fanpeng613 2011-05-04
  • 打赏
  • 举报
回复
我也不懂,我只会用!
不知-道人 2011-05-04
  • 打赏
  • 举报
回复
12# 受教了
ijse 2011-01-04
  • 打赏
  • 举报
回复 1
[Quote=引用 12 楼 li_tengfei 的回复:]

IOC,依赖倒置的意思,
所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。
所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂、Locator等等),然后你就可以调……
[/Quote]

讲得很细致,很明白~!谢谢!
yihw2011 2011-01-04
  • 打赏
  • 举报
回复
找个项目练练手,做过了就知道怎么说了
assdust110 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bao110908 的回复:]
引用 7 楼 hushengwei1986 的回复:
IoC其实是遵循了软件设计理念的依赖倒转原则,面向对象的设计就是为了实现软件的更好的复用行和扩展性,我们就必须降低我们每个pojo的依赖关系,也就是解耦,耦合度低了,我们才能更好的重用和扩展。
Spring AOP是其实是通过动态代理来实现业务逻辑的插入,是开发者在开发是不用关注其他与业务无关的点,通过代理的方式做到了插拔式操作。

这样说的话,感觉挺像是背下来的,而不是自己理解的。

说到:Spring AOP是其实是通过动态代理来实现业务逻辑的插入

试问:AOP 能在业务逻辑方法中间插入?

[/Quote]
这个貌似不行哦,jdk的代理没得这么先进的。。。但是cglib不知道。。没研究过源码,羞愧
YJCK 2010-12-30
  • 打赏
  • 举报
回复 2
IOC,依赖倒置的意思,
所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。
所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂、Locator等等),然后你就可以调用b对象了。
所以,不倒置,意味着A要主动获取B,才能使用B;到了这里,你就应该明白了倒置的意思了。倒置就是A要调用B的话,A并不需要主动获取B,而是由其它人自动将B送上门来。

形象的举例就是:

通常情况下,假如你有一天在家里口渴了,要喝水,那么你可以到你小区的小卖部去,告诉他们,你需要一瓶水,然后小卖部给你一瓶水!

这本来没有太大问题,关键是如果小卖部很远,那么你必须知道:从你家如何到小卖部;小卖部里是否有你需要的水;你还要考虑是否开着车去;等等等等,也许有太多的问题要考虑了。也就是说,为了一瓶水,你还可能需要依赖于车等等这些交通工具或别的工具,问题是不是变得复杂了?那么如何解决这个问题呢?

解决这个问题的方法很简单:小卖部提供送货上门服务,凡是小卖部的会员,你只要告知小卖部你需要什么,小卖部将主动把货物给你送上门来!这样一来,你只需要做两件事情,你就可以活得更加轻松自在:
第一:向小卖部注册为会员
第二:告诉小卖部你需要什么

是不是和Spring的做法很类似呢?Spring就是小卖部,你就是A对象,水就是B对象
第一:在Spring中声明一个类:A
第二:告诉Spring,A需要B

假设A是UserAction类,而B是UserService类
<bean id="userService" class="org.leadfar.service.UserService"/>
<bean id="documentService" class="org.leadfar.service.DocumentService"/>
<bean id="orgService" class="org.leadfar.service.OrgService"/>

<bean id="userAction" class="org.leadfar.web.UserAction">
<property name="userService" ref="userService"/>
</bean>

在Spring这个商店(工厂)中,有很多对象/服务:userService,documentService,orgService,也有很多会员:userAction等等,声明userAction需要userService即可,Spring将通过你给它提供的通道主动把userService送上门来,因此UserAction的代码示例类似如下所示:

package org.leadfar.web;
public class UserAction{
private UserService userService;
public String login(){
userService.valifyUser(xxx);
}
public void setUserService(UserService userService){
this.userService = userService;
}
}

在这段代码里面,你无需自己创建UserService对象(Spring作为背后无形的手,把UserService对象通过你定义的setUserService()方法把它主动送给了你,这就叫依赖注入!)

Spring依赖注入的实现技术是:动态代理

---------------------------------------------------
再说说AOP,即面向切面编程,面向切面编程的目标就是分离关注点。什么是关注点呢,就是你要做的事,就是关注点。假如你是个公子哥,没啥人生目标,天天就是衣来伸手,饭来张口,整天只知道玩一件事!那么,每天你一睁眼,就光想着吃完饭就去玩(你必须要做的事),但是在玩之前,你还需要穿衣服、穿鞋子、叠好被子、做饭等等等等事情,这些事情就是你的关注点,但是你只想吃饭然后玩,那么怎么办呢?这些事情通通交给别人去干。在你走到饭桌之前,有一个专门的仆人A帮你穿衣服,仆人B帮你穿鞋子,仆人C帮你叠好被子,仆人C帮你做饭,然后你就开始吃饭、去玩(这就是你一天的正事),你干完你的正事之后,回来,然后一系列仆人又开始帮你干这个干那个,然后一天就结束了!

AOP的好处就是你只需要干你的正事,其它事情别人帮你干。也许有一天,你想裸奔,不想穿衣服,那么你把仆人A解雇就是了!也许有一天,出门之前你还想带点钱,那么你再雇一个仆人D专门帮你干取钱的活!这就是AOP。每个人各司其职,灵活组合,达到一种可配置的、可插拔的程序结构。

从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力。事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务!
暴躁哥 2010-12-30
  • 打赏
  • 举报
回复
对spring我理解的不是很深,但是项目做了不少。我想提醒一点的是,很多人在使用框架的时候,没有去搞清楚为什么要用框架?框架能为你在这个项目中带了什么方便?很多初学者感觉是为了框架而学习框架,认为现在流行SSH框架,那么就要去学,这能代表你有技术。我觉得这是一个不太正确的思路。很多时候我们去使用一种框架,一项技术,是要看这种框架能给你的业务处理带来什么方便,给你的开发带来什么方便,如果能提高效率那么就去使用它。并不是所有的场合都适用的。很多电信的项目,很复杂的业务,全部在jsp处理,性能非常好,完全是靠良好的设计。所以我觉得对付面试而去想一些对spring的理解,这是没用必要的,如果你没用深入的使用过spring,网上找来的东西,面试官随便一问就能看出破绽,反而降低好感。我建议你不如多从思路上,从你自身接触过的项目谈谈对技术的理解,这样会更有帮助
hijiankang 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 li_tengfei 的回复:]
IOC,依赖倒置的意思,
所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。
所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂、Locator等等),然后你就可以调用……
[/Quote]

受教
CherishZheng 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 goodsun00 的回复:]
IOC 就是一个杯子,我们配置依赖注入就比如鱼缸里的水倒到杯子里,使得浴缸里就剩下鱼。 正如model层,把逻辑业务都给 spring 了,剥离干净了model层。 你的鱼要活,必须用我杯子里的水,你用其他地方新的水,鱼就死了。 也就是 你需要操做model对象,必须用我初始化好的方法。你自己new 你一个,只能告诉你 null异常。
[/Quote]
这个说的很好,我再叙下我对AOP的理解,程序就像一个箭头一样一直向前冲,冲啊冲,但是有的时候是需要做一些其他事情的,那么比如说权限的验证,那么好,在这个时候用上AOP之后箭头在往前冲的时候,就会被拦截一下.不知道这样说你能不能懂,呼呼
zhxin183 2010-12-29
  • 打赏
  • 举报
回复
个人觉得,重要的是个人的理解与运用。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hushengwei1986 的回复:]
IoC其实是遵循了软件设计理念的依赖倒转原则,面向对象的设计就是为了实现软件的更好的复用行和扩展性,我们就必须降低我们每个pojo的依赖关系,也就是解耦,耦合度低了,我们才能更好的重用和扩展。
Spring AOP是其实是通过动态代理来实现业务逻辑的插入,是开发者在开发是不用关注其他与业务无关的点,通过代理的方式做到了插拔式操作。
[/Quote]

这样说的话,感觉挺像是背下来的,而不是自己理解的。

说到:Spring AOP是其实是通过动态代理来实现业务逻辑的插入

试问:AOP 能在业务逻辑方法中间插入?
wycaigfl 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hushengwei1986 的回复:]
IoC其实是遵循了软件设计理念的依赖倒转原则,面向对象的设计就是为了实现软件的更好的复用行和扩展性,我们就必须降低我们每个pojo的依赖关系,也就是解耦,耦合度低了,我们才能更好的重用和扩展。
Spring AOP是其实是通过动态代理来实现业务逻辑的插入,是开发者在开发是不用关注其他与业务无关的点,通过代理的方式做到了插拔式操作。
[/Quote]
谢谢啊 很有见地的说法
hushengwei1986 2010-12-28
  • 打赏
  • 举报
回复 3
IoC其实是遵循了软件设计理念的依赖倒转原则,面向对象的设计就是为了实现软件的更好的复用行和扩展性,我们就必须降低我们每个pojo的依赖关系,也就是解耦,耦合度低了,我们才能更好的重用和扩展。
Spring AOP是其实是通过动态代理来实现业务逻辑的插入,是开发者在开发是不用关注其他与业务无关的点,通过代理的方式做到了插拔式操作。
magicluo 2010-12-28
  • 打赏
  • 举报
回复
读过源码!

能列举其中的设计原理,结合设计模式谈一谈。。。

很有效,不信你试
goodsun00 2010-12-28
  • 打赏
  • 举报
回复
IOC 就是一个杯子,我们配置依赖注入就比如鱼缸里的水倒到杯子里,使得浴缸里就剩下鱼。 正如model层,把逻辑业务都给 spring 了,剥离干净了model层。 你的鱼要活,必须用我杯子里的水,你用其他地方新的水,鱼就死了。 也就是 你需要操做model对象,必须用我初始化好的方法。你自己new 你一个,只能告诉你 null异常。
fhhffchffy 2010-12-28
  • 打赏
  • 举报
回复
简单点吧。
最好能够给他画个图。
waq12 2010-12-28
  • 打赏
  • 举报
回复
如果计算机是个饭店,操作员就是顾客,那么业务程序与框架程序到底谁是服务员,谁是经理?
传统调用关系,业务程序肯定是服务员、框架程序是经理。因为业务程序要使用框架程序嘛,所以就得调用它。事实上这个框架程序应该只能算是基础函数库,而谈不太上是现代意义上的框架;
对于IoC,操作员直接打交道的应该是框架程序,而对于某些需要业务指明的情况则是通过框架映射业务程序得以解决。所以现在定位就变成了业务程序是经理,框架程序是服务员的情形了。这也就是所谓的IoC,其优点显而易见。让开发人员从关注复杂的底层实现事务中剥离出来,而只关心真对特殊情况的业务需求。
加载更多回复(2)

67,545

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧