首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 面向切面有什么好处? [已结贴,结贴人:zspsys]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zspsys
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-06-23 21:06:48 楼主
    某同胞提出“面向接口有什么好处”  嘿嘿  本人问下面向切面有什么好处!
    150  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • java2000_net_test
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-23 21:06:511楼 得分:0
    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【zspsys】截止到2008-06-23 21:06:39的历史汇总数据(不包括此帖):
    发帖数:4                  发帖分:161               
    结贴数:4                  结贴分:161               
    未结数:0                  未结分:0                 
    结贴率:100.00%            结分率:100.00%           
    敬礼!http://p.blog.csdn.net/images/p_blog_csdn_net/java2000_net/381633/o_medal1.gif
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • java2000_net
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      2

      8

    发表于:2008-06-23 21:10:362楼 得分:0
    可以在不修改源代码的情况下,做一些猥琐的事情。

    拿刀切啊!多疼啊!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • TRMeister
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-23 21:12:093楼 得分:0
    可以剥离一些很繁琐,重复性高的逻辑。解耦和,提高复用性。
    比如日志和权限。
    这样就可以安心实现的业务逻辑,等搞定了以后。做个切面统一做这些逻辑就可以了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • laorer
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-23 21:52:384楼 得分:0
    引用 2 楼 java2000_net 的回复:

    拿刀切啊!多疼啊!!!


    spring不是有句话, 你只管做你的,我来负责其他的事,

    比如你想监控 testXX()方法, 一般的情况下,你需要在testXX()里面加入代码,
    用AOP的话, testXX()方法不需要动, 由AOP监控到test就记录下相关的日志

    应该是这样的,不错,是这样的.......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jdlsfl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-23 22:05:295楼 得分:0
    就是以前要在各个模块写的东西,现在放在一个地方处理
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zabaglione
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 10:09:366楼 得分:2
    正在学习spring.对AOP正在研究中。
    不过有一个问题
    如果什么都是用xml来控制,扩展,那么debug是不是很困难,比如bean的变量名写错了
    大小写错了,路径错了。这些都不能debug
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gongyali2005
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 10:19:247楼 得分:0
    引用 3 楼 TRMeister 的回复:
    可以剥离一些很繁琐,重复性高的逻辑。解耦和,提高复用性。
    比如日志和权限。
    这样就可以安心实现的业务逻辑,等搞定了以后。做个切面统一做这些逻辑就可以了。


    日志和权限。

    SPRING是个好东西!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hmsuccess
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 10:23:098楼 得分:0
    面向切面?什么意思,我还真不知道
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Landor2004
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-06-24 10:47:029楼 得分:0
    引用 4 楼 laorer 的回复:
    引用 2 楼 java2000_net 的回复:

    拿刀切啊!多疼啊!!!


    spring不是有句话, 你只管做你的,我来负责其他的事,

    比如你想监控 testXX()方法, 一般的情况下,你需要在testXX()里面加入代码,
    用AOP的话, testXX()方法不需要动, 由AOP监控到test就记录下相关的日志

    应该是这样的,不错,是这样的.......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuppy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 11:10:3110楼 得分:0
    引用 8 楼 hmsuccess 的回复:
    面向切面?什么意思,我还真不知道
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Transient1984
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 11:11:5611楼 得分:2
    从某一角度观察系统的快照,以了解系统某时的状况。可以是静态的可以是动态的。UML MODEING!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sagezk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 11:24:0412楼 得分:2
    无厘头一下:切面,刀切面?好处是一见就饿!英文原叫法谁能提供一下?实在不敢恭维一些定义和术语的翻译。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • aunty_flybird
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 11:29:3213楼 得分:2
    引用 12 楼 sagezk 的回复:
    无厘头一下:切面,刀切面?好处是一见就饿!英文原叫法谁能提供一下?实在不敢恭维一些定义和术语的翻译。


    AOP, Aspect-Oriented Programming
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oogamiyiqilou
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 11:57:5714楼 得分:2
    学习了 不过还是不太懂
    可不可以举一些例子
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • waitgod
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 15:53:1615楼 得分:2
    引用 14 楼 oogamiyiqilou 的回复:
    学习了 不过还是不太懂
    可不可以举一些例子

    =========
    同感
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lord_is_layuping
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 16:20:5016楼 得分:3
    AOP是一个概念,并没有设定具体语言的实现;

    它能克服那些只有单继承特性语言的缺点(如Java)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bao110908
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-06-24 17:45:0017楼 得分:25
    AOP 可以把一些方法中共有的东西给提取出来,用不着每一个方法都去写一遍。

    下面这个是使用 JDK 动态代理实现的 AOP,呵呵,一个小小的示例,我想具体的代码可能更
    能说明问题。方便起见全写在 AopTest.java 文件里了。

    JDK 的动态代理有个缺点,就是代理的类的必需有一个接口,如果没有接口的类是不能做的。
    因此我们不能对类实现标注 @Enhancement,呵呵,相当遗憾。

    Cglib 也能使用动态代理,功能比 JDK 内置的强大,而且并不需要接口。不过他们各有优缺点。

    Java code
    import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class AopTest { public static void main(String[] args) { Before before = new Before() { public void before() { System.out.println("...before..."); } }; After after = new After() { public void after() { System.out.println("...after..."); } }; Hello hello = null; // 普通方法执行 System.out.println("-------------普通执行-------------"); hello = new HelloEnglish(); hello.sayHello("bao110908"); hello.sayHi("bao110908"); System.out.println(); // 切入方法执行前(前置增强) System.out.println("-------------前置增强-------------"); hello = HelloAopManager.getHelloProxy(new HelloEnglish(), before); hello.sayHello("bao110908"); hello.sayHi("bao110908"); // sayHi 方法没有标注 @Enhancement 所以不会进行代码切入 System.out.println(); // 切入方法执行后(后置增强) System.out.println("-------------后置增强-------------"); hello = HelloAopManager.getHelloProxy(new HelloEnglish(), after); hello.sayHello("bao110908"); hello.sayHi("bao110908"); System.out.println(); // 切入方法执行前和执行后(环绕增强) System.out.println("-------------环绕增强-------------"); hello = HelloAopManager.getHelloProxy(new HelloEnglish(), before, after); hello.sayHello("bao110908"); hello.sayHi("bao110908"); System.out.println(); } } @Retention(RetentionPolicy.RUNTIME) @interface Enhancement { } interface Hello { @Enhancement public void sayHello(String name); public void sayHi(String name); } class HelloChinese implements Hello { public void sayHello(String name) { System.out.println(name + ",您好"); } public void sayHi(String name) { System.out.println("哈啰," + name); } } class HelloEnglish implements Hello { public void sayHello(String name) { System.out.println("Hello, " + name); } public void sayHi(String name) { System.out.println("hi, " + name); } } class HelloAopManager { private HelloAopManager(){ } public static Hello getHelloProxy(Hello hello, Before before) { return getHelloProxy(hello, before, null); } public static Hello getHelloProxy(Hello hello, After after) { return getHelloProxy(hello, null, after); } public static Hello getHelloProxy(Hello hello, Before before, After after) { HelloHandler handler = new HelloHandler(); if(before != null) { handler.setBefore(before); } if(after != null) { handler.setAfter(after); } return handler.bind(hello); } } /** * 前置增强接口 */ interface Before { public void before(); } /** * 后置增强接口 */ interface After { public void after(); } class HelloHandler implements InvocationHandler { /** * 需要进行代理的实例 */ private Hello hello = null; /** * 前置增强 */ private Before before = null; /** * 后置增强 */ private After after = null; /** * InvocationHandler 接口的实现方法,进行动态代理 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 看看接口中方法是否标注了需要 Enhancement boolean b = method.isAnnotationPresent(Enhancement.class); if(!b){ // 没有标注的话,按原方法执行 return method.invoke(hello, args); } // 有标注的话,进行方法的前置和后置增强 if(before != null) { before.before(); } Object obj = method.invoke(hello, args); if(after != null) { after.after(); } return obj; } /** * 将传入的 Hello 与 InvocationHandler 进行绑定,以获得代理类的实例 * @param hello * @return */ public Hello bind(Hello hello) { this.hello = hello; Hello helloProxy = (Hello)Proxy.newProxyInstance( hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), this ); return helloProxy; } public void setAfter(After after) { this.after = after; } public void setBefore(Before before) { this.before = before; } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bao110908
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

    发表于:2008-06-24 17:48:4418楼 得分:2
    上面这个是我所理解的 AOP
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hanfengbeyond
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 18:12:4919楼 得分:2
    引用 9 楼 Landor2004 的回复:
    引用 4 楼 laorer 的回复:
    引用 2 楼 java2000_net 的回复:

    拿刀切啊!多疼啊!!!


    spring不是有句话, 你只管做你的,我来负责其他的事,

    比如你想监控 testXX()方法, 一般的情况下,你需要在testXX()里面加入代码,
    用AOP的话, testXX()方法不需要动, 由AOP监控到test就记录下相关的日志

    应该是这样的,不错,是这样的.......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hanfengbeyond
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 18:16:1120楼 得分:2
    引用 17 楼 bao110908 的回复:
    AOP 可以把一些方法中共有的东西给提取出来,用不着每一个方法都去写一遍。

    下面这个是使用 JDK 动态代理实现的 AOP,呵呵,一个小小的示例,我想具体的代码可能更
    能说明问题。方便起见全写在 AopTest.java 文件里了。

    JDK 的动态代理有个缺点,就是代理的类的必需有一个接口,如果没有接口的类是不能做的。
    因此我们不能对类实现标注 @Enhancement,呵呵,相当遗憾。

    Cglib 也能使用动态代理,功能比 JDK 内置…


    哥们太强了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • JJTwo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 18:18:3221楼 得分:2
    學習!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zxlyx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 20:54:2722楼 得分:2
    bao110908 ,您好,

    您让我多了解了些知识,谢谢哦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • caoyinghui1986
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-24 21:06:1623楼 得分:10
    分散在系统中的业务逻辑。集中处理。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zspsys
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-27 10:53:5524楼 得分:0
    谢谢各位的指导~~最近比较忙  好几天没来CSDN了 
    修改 删除 举报 引用 回复