我们知道Spring的动态代理,本文就讲动态代理运用到AOP的小案例。
效果:
准备工作:
新建一个项目(我这里取名为chapter03),向WebContent的WEB-INF下的lib中,导入Spring框架所需要的jar包和第三方依赖包,另外还需要导入包aopalliance-1.0.jar,如果你用的Spring版本不兼容,可以找找别的版本。导入包完成后右键build path到项目路径中去。
1、在包com.itheima.jdk下创建UserDao接口
package com.itheima.jdk;
public interface UserDao {
public void addUser();
public void deleteUser();
}
2、在包com.itheima.jdk下创建UserDao接口的实现类UserDaoImpl
package com.itheima.jdk;
import org.springframework.stereotype.Repository;
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println("添加用户");
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
}
3、新建包com.itheima.factorybean下创建切面类MyAspect,并实现接口MethodInterceptor及编写其方法invoke()
package com.itheima.factorybean;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation mi) throws Throwable {
check_Permissions();
//执行目标方法
Object obj = mi.proceed();
log();
return obj;
}
public void check_Permissions() {
System.out.println("权限检查、、、、");
}
public void log() {
System.out.println("记录日志、、、、");
}
}
4、在包com.itheima.factorybean下创建配置文件applicationContext.xml
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<!-- 目标类-->
<bean id="userDao" class="com.itheima.jdk.UserDaoImpl"></bean>
<!--切面类-->
<bean id="myAspect" class="com.itheima.factorybean.MyAspect"></bean>
<!--代理类-->
<bean id="userDaoProxy"class="org.springframework.aop.framework.ProxyFactoryBean">
<!--配置代理类的相关属性-->
<!--指定代理实现的接口-->
<property name="proxyInterfaces" value="com.itheima.jdk.UserDao" />
<property name="target" ref="userDao" />
<!--指定切面,植入环绕通知-->
<property name="interceptorNames" value="myAspect" />
<property name="proxyTargetClass" value="true"/><!--true使用cglib代理,否则jdk代理-->
</bean>
</beans>
3、在包com.itheima.factorybean下创建测试类FactoryBeanTest
package com.itheima.factorybean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.itheima.jdk.UserDao;
//测试类
public class ProxyFactoryBeanTest {
public static void main(String[] args) {
//配置文件路径
String xmlPath = "com/itheima/factorybean/applicationContext.xml";
// 创建Spring容器的路径
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext(xmlPath);
UserDao userDao = (UserDao) applicationContext.getBean("userDaoProxy");
//执行方法
userDao.addUser();
userDao.deleteUser();
}
}