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实现)的主要内容,如果未能解决你的问题,请参考以下文章

基于代理类的AOP的实现

Spring------AOP

Spring框架的AOP实现(JDK+CGLIB)

Spring的AOP

Spring之AOP

Spring aop 基于JDK动态代理和CGLIB代理的原理以及为什么JDK代理需要基于接口