pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.et</groupId>
<artifactId>SpringAopPrinciple</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- JUnit Java语言的单元测试框架 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Cglib 提供强大的动态代理 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 指定JDK版本和编码的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
package cn.et.dao;
public interface UserDao {
public void addUser();
}
package cn.et.dao.impl;
import cn.et.dao.UserDao;
public class UserDaoImpl implements UserDao {
public void addUser(){
System.out.println("添加用户");
}
}
package cn.et.dao.impl;
public class StudentDao {
public void addStudent(){
System.out.println("添加学生");
}
}
package cn.et.utils;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler{
private Object targetObj;
public MyInvocationHandler(Object targetObj){
this.targetObj = targetObj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("权限验证");
Object resultObj = method.invoke(targetObj, args);
System.out.println("日志记录");
return resultObj;
}
}
package cn.et.utils;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术动态创建子类实例
return enhancer.create();
}
//实现MethodInterceptor接口方法
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("权限验证");
Object result = proxy.invokeSuper(obj, args);
System.out.println("日志记录");
return result;
}
}
package cn.et.utils;
import java.lang.reflect.Proxy;
import org.junit.Test;
import cn.et.dao.UserDao;
import cn.et.dao.impl.StudentDao;
import cn.et.dao.impl.UserDaoImpl;
public class Checkout {
@Test
public void Testing(){
UserDao userDao = new UserDaoImpl();
/*
Spring AOP(面向切面编程),扩展功能不修改源代码实现,采用横向抽取机制,取代了传统纵向继承体系重复性代码
横向抽取机制,底层使用动态代理方式实现
针对有接口的情况时使用JDK中的java.lang.reflect类库提供的动态代理
针对没有接口的情况时,使用Cglib框架提供的动态代理
*/
MyInvocationHandler handler = new MyInvocationHandler(userDao);
UserDao proxyUserDao = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),handler);
proxyUserDao.addUser();
System.out.println("。。。。。。。。。。。。。");
CglibProxy proxy = new CglibProxy();
StudentDao proxyImp = (StudentDao)proxy.getProxy(StudentDao.class);
proxyImp.addStudent();
}
}