`
zhukang0725
  • 浏览: 15353 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Spring中的AOP学习1

阅读更多
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);
}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics