Spring AOP(基于代理类的AOP实现)
Posted 贰零一八
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring AOP(基于代理类的AOP实现)相关的知识,希望对你有一定的参考价值。
#基于代理类的AOP实现:
step1:
1 package com.sjl.factorybean; 2 /**切面类*/ 3 import org.aopalliance.intercept.MethodInterceptor; 4 import org.aopalliance.intercept.MethodInvocation; 5 6 public class MyAspect implements MethodInterceptor {
7 @Override 8 public Object invoke(MethodInvocation mi) throws Throwable { 9 check_Permission();
//用proceed方法来执行当前对象 10 Object obj=mi.proceed(); 11 log(); 12 return obj; 13 }
//目标方法执行前执行check_Permission方法 14 public void check_Permission(){ 15 System.out.println("模拟检查权限日志"); 16 }
//目标方法执行后执行log()方法 17 public void log(){ 18 System.out.println("模拟记录日志"); 19 } 20 }
#目标类:
1 package com.sjl.jdk; 2 3 /** 4 * UserDaoImpl是目标类,对其中的方法进行增强处理; 5 */ 6 public class UserDaoImpl implements UserDao{ 7 8 @Override 9 public void addUser() { 10 System.out.println("添加用户"); 11 } 12 13 @Override 14 public void deleteUser() { 15 System.out.println("删除用户"); 16 } 17 }
#step2:创建配置文件,并指定代理对象:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> 6 7 <!-- 1 目标类 id为"userDao" class="目标类的全限定名" --> 8 <bean id="userDao" class="com.sjl.jdk.UserDaoImpl"></bean> 9 10 <!-- 2 切面类 id为"myAspect" class="切面类的全限定名"--> 11 <bean id="myAspect" class="com.sjl.factorybean.MyAspect"></bean> 12 13 14 <!-- 3 使用Spring代理工厂定义一个名称为userDaoProxy的代理对象,而aop 15 实现的就是代理工厂 bean id全限定名为如上图--> 16 <bean id="userDaoProxy" 17 class="org.springframework.aop.framework.ProxyFactoryBean"> 18 19 <!-- 3.1 指定代理实现的接口proxyInterfaces value为com.sjl.jdk.UserDao--> 20 <property name="proxyInterfaces" value="com.sjl.jdk.UserDao" /> 21 22 <!-- 3.2 指定目标对象名为target 目标类的对象属性ref为目标类的id--> 23 <property name="target" ref="userDao" /> 24 25 <!-- 3.3 指定切面名interceptorNames,织入环绕通知myAspect --> 26 <property name="interceptorNames" value="myAspect" /> 27 28 <!-- 3.4 指定代理方式,true:使用cglib,false(默认):使用jdk动态代理 --> 29 <property name="proxyTargetClass" value="true" /> 30 31 </bean> 32 </beans> 33 34 <!--用配置文件指定代理对象,包括目标类、切面类,并指定Spring代理工厂定义一个名称为 35 userDaoProxy的代理对象,其中包含接口的id 代理工厂的类,从aop的包中找,指定接口,再 36 指定属性,接口,目标对象,切面和代理方式等-->
#step3:测试类
1 package com.sjl.factorybean; 2 import org.springframework.context.ApplicationContext; 3 import 4 org.springframework.context.support.ClassPathXmlApplicationContext; 5 import com.sjl.jdk.UserDao; 6 // 测试类 7 public class ProxyFactoryBeanTest { 8 public static void main(String args[]) { 9 String xmlPath = "applicationContext.xml"; 10 ApplicationContext applicationContext =new ClassPathXmlApplicationContext(xmlPath); 11 // 从Spring容器获得内容 12 UserDao userDao = (UserDao) applicationContext.getBean("userDaoProxy"); 13 // 执行方法 14 userDao.addUser(); 15 userDao.deleteUser(); 16 } 17 }
说明:动态代理的本质是反射,动态代理分为实现有两种:jdk代理(实现接口的实例,拦截接口定义的目标方法)、cglib代理(生成代理类的子类的实例,可以拦截任意一共有方法,
无论目标方法是否定义在接口中),而动态代理是AOP的本质。
以上是关于Spring AOP(基于代理类的AOP实现)的主要内容,如果未能解决你的问题,请参考以下文章