没有合适的资源?快使用搜索试试~ 我知道了~
Spring温故知新六AOP向切面程
需积分: 0 2 下载量 197 浏览量
2011-05-09
13:45:22
上传
评论
收藏 54KB DOCX 举报
温馨提示
试读
22页
SpringSpringSpring温故知新六AOP向切面程Spring温故知新六AOP向切面程
资源推荐
资源详情
资源评论
文章分类:Java 编程
这一章我们将开始剖析 Spring 框架最为重要的 AOP(Aspect Oriented
Programming)面向切面编程。可以说 Spring 的精华就在于 AOP 了。
所谓 AOP,就是相对于 OOP(Object Oriented Programming)面向对象编程
的说法,有些人喜欢叫面向切面编程,有些人喜欢叫做面向方面,事实上这两
个都是指同一个东西,只是叫法不同。
我们传统的编程都是面向对象,就是说每个类都有它实际的意义。而面向切面
略有不同,它在面向对象的基础上扩展了一下,它编程的时候不是先考虑的一
个具体对象(比如用户类),而是先考虑的对象的行为或者功能。这个不是编程
方法的不同,而是编程思维的转变。
理论性的东西还是放一边,我们用实际的机器人案例来慢慢理解这个概念。
为了突出重点我们这里重写了 ISpeak:
package com.iteye.bolide74.impl;
public interface ISpeaker {
public void say(String msg);
}
接着是实现这个接口的机器人类:
package com.iteye.bolide74.action;
import com.iteye.bolide74.impl.ISpeaker;
public class Robot implements ISpeaker {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Robot(String name) {
this.name = name;
}
@Override
public void say(String msg) {
System.out.println("到达邻居家,对邻居说:" + msg + ",
我是" + this.name);
}
}
那么现在我们要实现跟很多个不同的邻居(不同的应用代码)打招呼,只需要下
面的应用代码了:
package com.iteye.bolide74.tester;
import com.iteye.bolide74.action.Robot;
import com.iteye.bolide74.impl.ISpeaker;
public class Tester {
public static void main(String[] args) {
ISpeaker speaker = new Robot("Wall-E");
speaker.say("你好");
}
}
以上是实现最简单功能的方法。现在我们要慢慢增加功能了,假设 Wall-E 在出
发打招呼之前要先拿一个礼物,然后打完招呼以后把礼物递给邻居,该怎么实
现呢?
public void getGift() {
System.out.println("获取了一个礼物");
}
public void giveGift(){
System.out.println("赠予一个礼物");
}
最傻的办法就是每次在应用代码里调用 speaker.say()方法的前后都调用
get/give 方法,小程序还好,要是大型程序的话人都要写傻掉。
那么能不能直接把 get/give 方法写在 Robot 类的 say()方法里呢?这样好处是
每次调用 say()的时候都能实现 get/give 功能,但是坏处也是这个:万一有个
别邻居是不需要给礼物的呢?怎么办?
那有没有更加灵活的办法呢?当然有!
代理模式:
我们先新建一个 SpeakerProxy 代理类:
package com.iteye.bolide74.action;
import com.iteye.bolide74.impl.ISpeaker;
public class SpeakerProxy implements ISpeaker {
ISpeaker speaker;
public SpeakerProxy(ISpeaker speaker) {
super();
this.speaker = speaker;
}
@Override
public void say(String msg) {
getGift();
speaker.say(msg);
giveGift();
}
public void getGift() {
System.out.println("获取了一个礼物");
}
public void giveGift(){
System.out.println("赠予一个礼物");
}
}
这个 SpeakerProxy 类实现了 ISpeaker 接口,然后又有一个靠构造函数传入
的 ISpeaker 类型的成员属性。
而这个 SpeakerProxy 类的 say()方法就有点意思了,它不是重写了自己的
say()方法,而是调用了 ISpeaker 类型的 speaker 成员属性的 say()方法,然
后再这个 say()方法前后嵌入 get/give 方法。
让我们看看这个 SpeakerProxy 类是怎么在应用代码使用:
package com.iteye.bolide74.tester;
import com.iteye.bolide74.action.Robot;
import com.iteye.bolide74.action.SpeakerProxy;
import com.iteye.bolide74.impl.ISpeaker;
public class SpeakerProxyTester {
public static void main(String[] arg0) {
// 没有带礼物的机器人:
ISpeaker noGiftSpeaker = new Robot("空手来的 Wall-
E");
noGiftSpeaker.say("你好");
剩余21页未读,继续阅读
资源评论
1234ag
- 粉丝: 6
- 资源: 58
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功