AOP(Aspect Oriented programming)的意思是面向方面编程。利用AOP+OOP,可以实现更为有效的编程。我们知道,像日志输出,如果在每一个操作里面都有这个方法,那么将产生大量的冗余代码。在Spring中的AOP是建立在Java代理机制上的。
下面我们举一个例子,用于添加用户的例子。
package org.jnotnull;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class AddUser{
private Logger logger = Logger.getLogger(this.getClass().getName());
public void add(User user){
logger.log(Level.INFO,user.getName+"开始添加");
..
logger.log(Level.INFO,user.getName+"数据添加成功");
}
}
下面我们编写测试类:
package org.jnotnull;
public class Test{
public static void main(String [] args){
User user = new User();
user.setName = "JNotNull";
user.setSex ="man";
AddUser adduser = new AddUser();
adduser.add(user);
}
}
这样在运行的时候就会在Console中输出日志信息了。现在问题的关键是如果在每一个方法中,都这样去跟踪日志的话,会产生大量的冗余。
下面我们用面向接口的方法实现输出。
我们看一下代码。首先我们创建一个添加用户的接口。
package org.jnotnull;
public interface AddUserInterface{
public void addUser(User user);
}
再看一下它的实现类
package org.jnotnull;
public AddUser implements AddUserInterface{
public void addUser(User user){
..
}
}
下面再编写一个代理类:
package org.jnotnull;
public class AddUserProxy{
private Logger logger = Logger.getlogger(this.getClass().getName());
private AddUserInterface adduserinterface;
public AddUserProxy(AddUserInterface adduserinterface){
this.adduserinterface = adduserinterface;
}
public void addUser(User user){
logger.log(Level.INFO,user.getName+"开始添加");
adduserinterface.addUser(user);
logger.log(Level.INFO,user.getName+"数据添加成功");
}
}
下面编写测试类:
package org.jnotnull;
public class Test{
public static void main(String [] args){
User user = new User();
user.setName = "JNotNull";
user.setSex ="man";
AddUserProxy adduserproxy = new AddUserProxy(new AddUser());
adduser.add(user);
}
}
这样是不是很好的把日志输出这个面给分离开来了呢。使用面向接口编程确实不错。
下面我们运用Java的代理机制进行输出。
首先看一下日志信息的代理类。
package org.jnotnull;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.apache.logrj.Level;
import org.apache.logrj.Logger;
private class LogProxy implements InvocationHandler{
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object delegate;
public Object bind(Object delegate){
this.delegate=delegate;
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),delegate.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy,Method method,Object []args)throws Thorwable{
Object result = null;
try{
logger.log(Level.INFO,user.getName+"开始添加");
result = method.invoke(delegate,args);
logger.log(Level.INFO,user.getName+"数据添加成功");
}catch(Exception e){
logger.log(Level.INFO,e.toString());
}
return result;
}
}
我们创建一个添加用户的接口。
package org.jnotnull;
public interface AddUserInterface{
public void addUser(User user);
}
再看一下它的实现类
package org.jnotnull;
public AddUser implements AddUserInterface{
public void addUser(User user){
..
}
}
下面编写测试类:
package org.jnotnull;
public class Test{
public static void main(String [] args){
LogProxy logproxy = new LogProxy();
User user = new User();
user.setName = "JNotNull";
user.setSex ="man";
AddUserInterface adduserinterface = (AdduserInterface)logProxy.bind(new AddUser());
adduserinterface.add(user);
}
}
分享到:
相关推荐
Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结
Spring IOC AOP学习示例代码,包含Spring常用操作示例和所有所需jar文件。参考博客:http://blog.csdn.net/daijin888888/article/details/51735291
NULL 博文链接:https://microjava.iteye.com/blog/525796
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。
Spring之AOP配置文件详解.txt Spring之AOP配置文件详解.txt 帮助你更快张握Java的学习!
自己学习spring课程的笔记。笔记都是根据尚硅谷的课程(spring ioc,spring aop,spring mvc,spring boot等)写的。 主要内容:spring ioc,spring aop,spring mvc,spring boot
Spring中的AOP可以控制权限,在我们做项目的时候,用Struts的过滤方法也可以实现。 当然这个文件只是提供测试,我们主要是学习这个AOP的思想。大家下载后可以再摸索......
SpringAOP学习笔记以及四个可运行的Demo,涵盖经典代理模式、基于注解、基于xml配置这3方面的Demo
这个是上文描述的那个项目资料,spring -aop
很好的学习SpringAOP的资料,对于初学者和中级开发者都有很大帮助
Spring Aop 学习笔记
spring aop经典例子的源代码,这个是学习spring aop特性的第一步
这是一个学习spring框架aop技术的一个很好的实例。
spring框架aop使用的jar包,需要链接到博客里,因为学习spring经常对所用 jar包迷糊,需要做整理。还望不要误删了....
spring的aop使用实例,对于深入学习spring这有很大的作用
NULL 博文链接:https://linres.iteye.com/blog/281221
基于xml代码的SpringAOP实例详解,适合初步学习springAOP的开发人员了解该功能的使用。
spring aop简单例子,入门学习的好资料
帮助初学者深入理解Spring的好资料