对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="cn.Mr.Neng.service.UserService"/>
<bean id="documentService" class="cn.Mr.Neng.service.DocumentService"/>
<bean id="orgService" class="cn.Mr.Neng.service.OrgService"/>
<bean id="userAction" class="cn.Mr.Neng.web.UserAction">
<property name="userService" ref="userService"/>
</bean>
在Spring这个商店(工厂)中,有很多对象/服务:userService,documentService,orgService,也有很多会员:userAction等等,声明userAction需要userService即可,Spring将通过你给它提供的通道主动把userService送上门来,因此UserAction的代码示例类似如下所示:
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叠被子、仆人D做饭。我就只要做正事(吃饭玩耍)!我干完正事之后,回来,然后一系列仆人为我干这干那,然后一天就结束了!
AOP的好处就是我只需要干你的正事,其他事情别人帮你干。也许有一天,你想裸奔,不想穿衣服,那么你就把仆人A解雇了就行了,如果有一天,在出门之前你需要带点钱,那么你就可以再雇佣一个仆人F帮你干取钱的活。
这就是AOP,每个人各司其职,灵活组合,达到一种可配置的、可插拔的程序结构。
从spring来看,AOP最大的用途就是提供了事务管理的能力,事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管理实务(太烦),所以,仆人spring就在你访问数据库之前,自动开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务。
注意:其中有些内容我也是参考网上,觉得对理解很有帮助。