美丽涵涵童装店--说我博客名字,给你们打折!
随笔 - 82  文章 - 266  trackbacks - 0
<2007年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456


点击这里给杨爱友发消息
美丽涵涵童装店
说我博客名字,给你们打折!

常用链接

留言簿(6)

随笔分类

随笔档案

文章档案

好友的BLOG

搜索

  •  

最新评论

阅读排行榜

评论排行榜

里面有些概念描述或观点可能不正确,欢迎批评指正。

1. 使用代理对象将日志等与业务逻辑无关的东西或任务提取出来,设计为一个服务对象,这样的对象称之为 切面。
2. 将日志、安全检查等这类的动作或服务设计为通用的、不介入特定业务对象的个职责清楚的Aspect对象,这就是所谓的面向切面编程(AOP)。
3. 在这种编程模式之下,Aspect可以独立于应用程序之外,在必要的时候,可以介入应用呈现之中提供服务,在不需要相关服务的时候,又可以将这些Aspect直接从应用程序中脱离出来,而应用程序本身不需要修改任何一行程序代码。
4. AOP术语:书中提到了9个关键术语,分别是Cross-cutting concern、Apect、Advice、Joipoint、Pointcut、Target、Introduction、Proxy、Weave
    像日志、安全检查这类动作在AOP中称之为Cross-cutting concern;将散落于各个义务逻辑之中的Cross-cutting  concern收集起来,设计成一个独立可重用的对象,这个对象称为Aspect。Cross-cutting concern的具体实现称之为Advice,包括Cross-cutting concern的行为或要提供的服务;Joipoint、Pointcut这两个术语分不清,暂时都当作切入点来说吧,就是要执行Advice的时机或叫地方;Target很明白,就是一个Advice被应用的目标对象;Introduction可以对一个以编写或编译完的类,在执行时动态增加一些方法或行为,而不用修改这个类的码在JS中太常见;Weave织入,Advice被应用至目标对象的过程。
5. Advice实现了Aspect的真正逻辑,具体来说在Java中就是一个类或一个方法。一个类可以有多个Advice。由于织入Targets的时机不同,Spring 提供了不同的Advices接口,如Before Advice、After Advice、Around Advice、Throw Advice,见其名知其意,如Before Advice,是在目标对象或方法执行前执行Advice。
6. PointCut与Advisor:上面说的各种Advice都是直接织入至代理的接口执行前后,织入实际只定义到对象级别。而利用pointCut和Advisor可以将织入目标定位到具体的方法前后。PointCutAdvisor接口提供PointCut实例,用语定义更细粒度的织入实际,他的第一个实现类是NameMatchMethodPointCutAdvisor,用一个表示式去匹配方法名称,匹配成功的方法都会织入指定的Advice。
7. 仔细体会:Spring AOP是通过代理机制来实现的,因而需要建立代理对象。
    Adivice可以理解为想日志、权限判断之类的动作,通过某些方法将这些动作插入到被代理对象,生成一个新的对象,这个新的对象就是代理对象,这种方式就叫代理机制。
    在Spring中,将多个Adivce放到一个对象中,成为一个通用的服务对象,这叫Aspect,将这个Aspect插入到一组对象或方法中,这个过程就是用的代理机制。
8. Introduction类似JS中的混合的构造函数/原型方法来构造对象,先定义一个对象,然后再想对象Introduction方法。好象没什么用途。
9. 以上实现AOP的代理模式都为静态代理,它为每一个目标对象都定义一个代理Bean,当项目庞大时这显然是行不通的。解决方案就是使用动态代理,在AutoProxing中,我们可以通过Bean名称和PointCut对比,自动为符合条件的目标对象建立代理对象。在我看来,静态代理确实没什么用武之地,动态代理能很好的工作。
10. 以上都是Spring1.0就有的东西,在2.0以后对于AOP功能的实现新增了两种方式:一种是基于XML Schema的设置;一种 是基于Annotation的支持。看到这里才发现前面的其实没啥用了,以后就直接用XML Schema方式就是了。
11. ???Spring的核心是AOP、DI、IOC,他主要是用来管理后台,当然做为一个MVC框架,自然不得不提供controller功能,而其他的如<spring:bind>之类的标签很多余,这岂不是在页面上也偶合进了spring 的东西。
12. 最后用BeforeAdvice来说明的Spring AOP的用法及原理。
其他类型的Advice如After Advice、Around Advice、Throw Advice用法都是类似的。
首先定义目标对象必须实现的接口:
1 public interface IHello {
2     public void hello(String name);
3 }

定义目标对象,让其实现IHello接口:
1 public class HelloSpeaker implements IHello{
2     public void hello(String name){
3         System.out.println("Hello, " + name);
4     }
5 }

定义一个Advice,它实现了MethodBeforeAdvice接口:
Before Advice会 在目标对象的方法执行之前被调用,你需要实现aop.MethodBeforeAdvice接口来定义Before Advice逻辑。该接口只有一个方法before(),就是在目标对象的方法执行前要自行的动作。
1 public class LogBeforeAdvice implements MethodBeforeAdvice{
2 private Logger logger = Logger.getLogger(this.getClass().getName());
3     public void before(Method method, Object[] arg1, Object arg2) throws Throwable {
4         logger.log(Level.INFO,"method starts" + method);
5     }
6 }

编写bean定义文件:
 1     <bean id="logBeforeAdvice" class="beforeAdvice.LogBeforeAdvice"/>
 2     <bean id="helloSpeaker" class="beforeAdvice.HelloSpeaker"/>
 3     
 4     <!-- 定义一个bean,它被用来生成代理对象,提供通用服务 -->
 5     <bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
 6         <property name="proxyInterfaces" value="beforeAdvice.IHello"/><!--定义代理时可使用的接口 -->
 7         <property name="target" ref="helloSpeaker"/><!-- 目标对象,如果不定义target,acvice将会用至实现IHello接口的所有类 -->
 8         <property name="interceptorNames"><!-- 设置Adivce实例,可设置一个或多个Advice -->
 9             <list>
10                 <value>logBeforeAdvice</value>
11             </list>
12         </property>
13     </bean>
14 <!--注意:在不定义目标方法时,Advice将会用于所有方法之前-->

最后编写一个测试程序:
1 public class SpringAOPDemo {

3     public static void main(String[] args) {
4         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
5         IHello helloProxy = (IHello)ctx.getBean("helloProxy");//根据bean定义文件定义的proxyInterfaces属性生成HelloSpeaker的代理对象
6         helloProxy.hello("yangay");
7     }
8 }
从这个例子中可以看到,对于HelloSpeaker来说,它并不知道LogBeforeAdvice的存在,而LogBeforeAdvice也可以运用至其他的对象之上,有效地提供对象的重用性。
posted on 2007-09-06 00:06 杨爱友 阅读(1444) 评论(4)  编辑  收藏 所属分类: java相关技术

FeedBack:
# re: spring 2.0使用手册学习笔记(二)  2007-09-06 15:22 睿不可当
老是看你的blog 不冒个泡 对不起你
呵呵  回复  更多评论
  
# re: spring 2.0使用手册学习笔记(二)  2007-09-06 23:54 杨爱友
冒泡,别憋着了,你的地址呢?我还不知道。  回复  更多评论
  
# re: spring 2.0使用手册学习笔记(二)  2007-09-07 22:03 zrq
以上实现AOP的代理模式都为静态代理,它为每一个目标对象都定义一个代理Bean,当项目庞大时这显然是行不通的。解决方案就是使用动态代理,在AutoProxing中,我们可以通过Bean名称和PointCut对比,自动为符合条件的目标对象建立代理对象。在我看来,静态代理确实没什么用武之地,动态代理能很好的工作。

项目越大,越应该使用静态代理,要不然,出措很难找.  回复  更多评论
  
# re: spring 2.0使用手册学习笔记(二)  2008-04-01 09:34 Aspectj
@zrq
但是动态代理的性能负载很大,在性能较为敏感的项目上,可能问题更多  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
美丽涵涵童装店
亲,说我博客名字,给你们打折!