Spring IoC和AOP的理解

来源:互联网 发布:数据迁移整体解决方案 编辑:程序博客网 时间:2024/05/01 14:46

spring 的优点?
1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 
2.可以使用容易提供的众多服务,如事务管理,消息服务等 
3.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 
4.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 

什么是DI机制? 
依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 因此也称为依赖入。 
spring以动态灵活的方式来管理对象, 注入的两种方式,接口注入、设置注入和构造注入。主要有两个重要的接口类:BeanFactory和appliaction 
设置注入的优点:直观,自然 
构造注入的优点:可以在构造器中决定依赖关系的顺序。 
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()方法把它主动送给了你,这就叫依赖注入!

什么是AOP? 

再说说AOP,即面向切面编程,Spring集成了AspectJ作为AOP的一个特定实现实现技术是:动态代理,而且这种动态代理技术实际上是JDK的一个特性,通过jdk的动态代理特性,可以为任意java对象创建代理对象,通过java反射实现。在ProxyFactoryBean中封装了代理对象的生成,在这个生成过程中,可以使用jdk的proxy和CGLIB类生成器两种生成方式。
面向切面编程的目标就是分离关注点。什么是关注点呢,就是你要做的事,就是关注点。
从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力。事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务!
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面 
1.面向切面编程提供声明式事务管理 
2.spring支持用户自定义的切面 

面向切面编程(aop)是对面向对象编程(oop)的补充, 
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。 
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象, 
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。 


ApplicationContext和BeanFactory的区别

BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。 ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能。ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继.

1.从ApplicationContext中取bean  

   ApplicationContext ac = new ClassPathXmlApplicationContext("/com/bean.xml"); 

   当我们实例化bean.xml时,该文件中配置的bean都会被实例化。(该bean scope是singleton)

 

 2. 从BeanFactory中取bean

  BeanFactory factory= new XmlBeanFactory(new ClassPathResource("/com/bean.xml"));

  factory.getBean("student");   //取bean的时候才会实例化

  当使用beanfactory去获取bean,当你只是实例化该容器,那么容器内的bean不会被实例化,只有当使用某个bean(getBean)时,才会实时去实例化该bean。

 

总结

1.如果使用ApplicationContext,则配置的bean如果是singleton不管你用还是不用,都被实例化。好处是可以预先加载,坏处是浪费内存。

2.BeanFactory,当使用BeanFactory实例化对象时,配置的bean不会马上被实例化。当你使用该bean时才会被实例化(getBean)。好处是节约内存,缺点是速度比较慢。多用于移动设备的开发上。

3.一般没有特殊要求,应当使用ApplicationContext完成。

 

三种获取ApplicationContext对象引用的方法

1.ClassPathXmlApplicationContext 通过类路径。

2.FileSystemXmlApplicationContext 通过文件路径。

    ApplicationContext ac = FileSystemXmlApplicationContext("d:\\com\\bean.xml");

 3.XmlWebApplicationContext:从web系统中加载。

 

0 0
原创粉丝点击