本文共 2268 字,大约阅读时间需要 7 分钟。
package cn.edu.hpu.dao.Impl;import cn.edu.hpu.dao.UserDao;import cn.edu.hpu.model.User;public class UserDaoImpl implements UserDao{ public void save(User u) { System.out.println("save start...."); System.out.println("add success!!"); System.out.println("save end...."); }}方法2:(继承模式) 写一个UserDaoImpl2继承UserDaoImpl
package cn.edu.hpu.dao.Impl;import cn.edu.hpu.model.User;public class UserDaoImpl2 extends UserDaoImpl{ @Override public void save(User u) { System.out.println("save start...."); super.save(u); System.out.println("save end...."); } }在beans.xml初始化UserDaoImpl2 方法3:(组合模式) 写一个UserDaoImpl2实现UserDao接口
package cn.edu.hpu.dao.Impl;import cn.edu.hpu.dao.UserDao;import cn.edu.hpu.model.User;public class UserDaoImpl3 implements UserDao{ private UserDao userDao=new UserDaoImpl(); public void save(User u) { System.out.println("save start...."); userDao.save(u); System.out.println("save end...."); }}好处:可以互相之间来回的组合(可以换成new UserDaoImpl2();) 对于上面的方法3,如果逻辑bean非常多,那么需要引入非常多的bean,这时候每一个bean都要加上日志代码,工作量非常大。 解决办法: 写了一个LogIntercept的类,定义所有的日志代码:
package cn.edu.hpu.aop;//日志的拦截器public class LogIntercept { public void beforeMethod(){ System.out.println("save start..."); } public void afterMethod(){ System.out.println("save end..."); }}在业务逻辑的实现里这样使用:
package cn.edu.hpu.dao.Impl;import cn.edu.hpu.aop.LogIntercept;import cn.edu.hpu.dao.UserDao;import cn.edu.hpu.model.User;public class UserDaoImpl4 implements UserDao{ private UserDao userDao=new UserDaoImpl(); public void save(User u) { new LogIntercept().beforeMethod(); userDao.save(u); new LogIntercept().afterMethod(); }}但是这样做还是有问题: 使用组合模式的时候,虽然这个LogIntercept可以加到任何bean上面,还是没有解决一个问题,就是我要加到某个bean上面去的时候,必须得做一个新的类(如UserImpl5),把原来的那个bean组合进来。 解决方法:你要让我加到哪个bean上面,你干脆给我写个配置文件,我就动态的把逻辑加到那个bean上面。这就是AOP。 你在XML初始化bean的时候,加一个标签,告诉程序我要加一个逻辑。例如:
这里就可以将日志逻辑注入了。 但是你写<Log method="beforeMethod"/>等标签程序会帮你产生一个组合的类吗?很显然不能,所以这个时候你想要动态的产生我们想要的那个类,就要使用"动态代理"了。 JDK中可以实现动态代理: 利用proxy和invocationhandler 具体细节详见动态代理的文章:
下一篇总结我会利用动态代理实现AOP,并解释AOP:
转载请注明出处: