- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
SpringAOP讲解
面向切(方)面编程
AOP概念
AOP:Aspect Oriented Programming(面向切面编程或面向方面编程),是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP)。
AOP为开发者提供一种进行横切关注点(比如日志关注点横切了支付关注点)分离并织入的机制,把横切关注点分离,然后通过某种技术织入到系统中,从而无耦合的完成了我们的功能。
面向切面的编程和面向对象并不矛盾,是对面向对象的思维方式的有效补充。主要将程序中涉及公共问题集中解决,可以解决面向对象和过程化方法中不能很好解决的横切问题如:事务,安全,日志,异常处理等横切关注。
利用动态代理实现面向切面编程
代理:
代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。按照代理类的创建时期,代理类可分为两种。 静态代理类: 由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态创建而成。
定义追求班花的方法:
/**
* 定义的接口
*
* @author Administrator
*
*/
public interface IGiveSomething {
void giveMoney();
// void giveCar();
void giveSeaHouse();
}
实现接口的方法:
/**
* SuperMan 符合大家口味 追求者
*
* @author Administrator
*
*/
public class SuperMan implements IGiveSomething {
private ClassFlower cf;
public ClassFlower getCf() {
return cf;
}
public void setCf(ClassFlower cf) {
this.cf = cf;
}
public SuperMan(ClassFlower cf) {
this.cf = cf;
}
@Override
public void giveSeaHouse() {
System.out.println(华哥 送给女生 + cf.getName() + 一栋海景房~~~);
}
@Override
public void giveMoney() {
System.out.println(华哥 送给女生 + cf.getName() + 100亿~~~);
}
}
代理类的具体实现:
public class Proxy implements IGiveSomething {
private SuperMan superman;
public SuperMan getSuperman() {
return superman;
}
public void setSuperman(SuperMan superman) {
this.superman = superman;
}
// 我们做华哥的代理
public Proxy(SuperMan sm) {
this.superman = sm;
}
@Override
public void giveSeaHouse() {
System.out.println(这是在调用华哥的方法之前完成的事情);
// 此处虽然实现 giveSeaHouse这个方法 实际上市帮华哥做这件事情
// 要调用的是 华哥对象的方法
superman.giveSeaHouse();
System.out.println(这是在调用华哥的方法之后完成的事情);
}
@Override
public void giveMoney() {
superman.giveMoney();
}
}
测试类:
/**
* 测试类
* @author Admi
文档评论(0)