经典AOP-基于代理
来源:互联网 发布:程序员的数学2pdf 编辑:程序博客网 时间:2024/06/05 11:50
基于代理是一项非常经典的具有AOP思想的实现方法,从这也产生了代理模式。代理其实就是跟委托实现同一个的接口(这是弊端,想要代理就必须有接口),其实现方式有两种,静态代理和动态代理。在Java中,安全、日志、事务都是AOP应用的实际方面。
静态代理
静态代理的实现是指通过自己手动的生成一个代理对象,并调用代理对象的方法,静态代理思想也很好地体现了动态代理的思想精髓。下面是一个日志的静态代理。
首先声明一个接口,这个接口是委托和代理都需要实现的
public interface IDao<T extends Serializable> {/** * 将obj保存到数据库表 * @param obj,要保存到数据库的实体对象 */public void doSave(T obj);}
为了更好地模拟ORM,我们需要定义简单的实体类
实体类接口
public interface IEntity<T extends Serializable> extends Serializable {public T getId();}
实体类Book
public class Book implements IEntity<Integer>{private Integer id;public Integer getId() {// TODO Auto-generated method stubreturn id;}}
定义委托——BookDao
public class BookDao implements IDao<Book> {public void doSave(Book obj) {// TODO Auto-generated method stub//将对象保存到数据库表}}
定义代理
public class BookDaoProxy implements IDao<Book> {/** * 代理依赖于委托 */private BookDao dao;public BookDao getDao() {return dao;}/** * 注入委托 * @param dao,需要注入的委托实例 */public void setDao(BookDao dao) {this.dao = dao;}public void doSave(Book obj) {// TODO Auto-generated method stubSystem.out.println("开始记录日志");dao.doSave(obj);System.out.println("结束记录日志");}}
这样子,在实际调用的时候,调用BookDaoProxy类的doSave方法,就不仅能完成委托类的保存实体到数据库这以功能,还能够实现日志记录功能。
动态代理
动态代理的实现,是要与Java官方提供的接口InvocationHandler相关联。
这个接口里面有一个方法:
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubreturn null;}
其中,proxy参数是代理的实例,不要误当做是委托实例,而method是委托的方法实例,args是方法参数,学过java反射的都知道,通过反射来调用方法method.invoke(对象实例,参数),由于没有找到委托实例,所以在实现这个接口的时候,我们要在实现类中注入一个委托实例。
public class BookDaoProxy implements InvocationHandler {/** * 将要注入的委托实例 */private Object target;public Object bind(Object target){this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubSystem.out.println("开始记录日志");Object result = method.invoke(target, args);System.out.println("结束记录日志");return result;}}
bind方法可以根据委托来得到一个代理实例,而接口中的Invoke方法内部的实现还是主要依赖于java的反射。
BookDao bookDao = new BookDao();BookDaoProxy proxy = new BookDaoProxy();bookDao = (BookDao) proxy.bind(bookDao);bookDao.doSave(new Book());
这样,就将代理掩饰成为委托并调用,但实际上执行了代理的doSave方法。
0 0
- 经典AOP-基于代理
- 基于CGLIB代理的经典Spring Aop
- 基于JDK动态代理的经典Spring AOP
- spring经典的基于代理的AOP编程-方法
- Spring AOP 演化过程(二):基于代理的经典Spring AOP
- AOP实现方式1——经典的基于代理的AOP实现
- AOP实现方式1——经典的基于代理的AOP实现
- Spring, 基于代理的AOP
- spring经典的基于代理的AOP编程-[控制粒度-类]
- spring经典的基于代理的AOP编程-[控制粒度-类](beans.xml)
- Spring AOP之基于ProxyFactoryBean的代理
- Spring, 基于自动代理实现aop
- Spring基于代理的AOP实现
- 经典的基于ProxyBeanFactory的Spring AOP
- 基于Spring AOP的JDK动态代理和CGLIB代理
- spring aop学习6:jdk动态代理(基于接口代理)
- spring aop学习7:Cglib动态代理(基于继承代理)
- AOP代理
- Android--多线程之Handler
- JAVA必备——13个核心规范
- 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数
- OCP 1Z0 052 82
- VS中继承的属性和属性表(Inherited Properties and Property Sheets)
- 经典AOP-基于代理
- mongodb启动和关闭
- 写在前面
- Mysql 创建用户并授权
- Android Matrix的数学原理
- MySQL之慢查询-删除慢查询日志
- TRAINING ALGORITHMS FOR HIDDEN CONDITIONAL RANDOM FIELDS
- HTML <form> 标签的 enctype 属性
- sqlite数据库编程之C语言环境搭建