“One of the key components of Spring is the AOP Framework.” –From Spring official documents.
近期在研究AOP的源代码和实现机制,以及Spring对于AOP的实现与AspectJ对AOP实现的区别.
Spring AOP的实现是基于JDK Dynamic Proxy 和CGLIB Proxy 两种方式.
今天先深入学习一下代理模式、 JDK Dynamic Proxy 机制,以及AOP简单思想:
代理模式:代理模式就是给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。
For Example:
针对一个接口UserManager(四个简单的方法声明,add,delete,modify,selectUserById),首先实现一个具体的业务实现类UserManagerImpl,For example:我这时候需要针对每一个方法,做一个日志打印输出System.out.println(“—-UserManagerImpl.Add()—-”),在为了不影响原有实现类UserManagerImpl的基础下, 需要生成一个代理类UserManagerImplProxy(该类也是实现了UserManager接口).
代码如下:
//UserManager interface
public interface UserManager
{
public void addUser(String userName,String userPwd);
public void deleteUser(String userID);
public void modifyUser(String userID,String userName,String userPWd);
public String findUser(String userID);
}
//UserManagerImpl 实现类
public class UserManagerImpl implements UserManager
{
public void addUser(String userName, String userPwd)
{
System.out.println(“—-UserManagerImpl.addUser()—-”);
}
public void deleteUser(String userID)
{
System.out.println(“—-UserManagerImpl.addUser()—-”);
}
public String findUser(String userID)
{
System.out.println(“—-UserManagerImpl.addUser()—-”);
return “—-UserManagerImpl.addUser()—-”;
}
public void modifyUser(String userID, String userName, String userPWd)
{
System.out.println(“—-UserManagerImpl.addUser()—-”);
}
}
//UserManagerImpl 代理类
public class UserManagerImplProxy implements UserManager
{
private UserManager userManager;
public UserManagerImplProxy(UserManager userManager)
{
this.userManager = userManager;
}
public void addUser(String userName, String userPwd)
{
userManager.addUser(userName, userPwd);
logging();
}
public void deleteUser(String userID)
{
userManager.deleteUser(userID);
}
public String findUser(String userID)
{
userManager.findUser(userID);
return null;
}
public void modifyUser(String userID, String userName, String userPWd)
{
this.userManager.modifyUser(userID, userName, userPWd);
logging();
}
private void logging()
{
System.out.println(“—-当前操作已被写入到数据库当中—-”);
}
}
//test类
public class ClientAction2
{
public static void main(String[] args)
{
UserManager userManager = new UserManagerImplProxy(new UserManagerImpl());
userManager.addUser(“heely”, “pwd”);
}
}
//Console 控制台输出的结果是:
—-UserManagerImpl.addUser()—-
—-当前操作已被写入到数据库当中—-
由以上的简单代码片段可以看出,代理模式最终的目的是想通过代理的方式为目标对象方法增加额外的功能,而不必修改目标对象的代码.
但是缺点也显而易见,类似”添加系统日志”这中”关注点”或者”横切”性的东西其实可以抽象出来一个独立的模块,而不是要针对每一个业务的实现类都要写一个代理类,而这样无非也是增加我们的代码的数量,当业务类很多时,会疯掉的.
JDK Dynamic Proxy:
动态代理的类是由java.lang.reflect.Proxy类在运行期时根据接口定义,采用java反射机制动态生成.帮助程序员减少编写代码行数,真正提高代码的可复用度.
Dynamic Proxy 需要用到java.lang.reflect 包中的两个类:interface InvocationHandler:该接口定义了一个方法 Object invoke(Object proxy,Method method,Object[] args).
Proxy类当中的 newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), new DebugProxy(obj)) 方法.生成一个代理类.
说到动态代理,又不能不提Java 反射机制…要想简单的描述出一个功能点,必将牵涉出众多个知识点。
Java Reflection 机制主要提供了以下功能(可以让程序员在运行期动态的控制某个类的属性和方法):
1.在运行期,判断任意一个对象所属的类.
2.在运行期,构造任意一个类的对象。
3.在运行期,判断任意一个类所具有的成员变量和方法。
4.在运行期,调用任意一个对象的方法。
下一章,将记录一下Java Reflection 常用方法.
–未完待续–


