基于代理类的AOP实现

Posted 花式编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于代理类的AOP实现相关的知识,希望对你有一定的参考价值。

前言


通过前面的两篇文章,相信大家对Spring中两种模式已经有了一定的了解。实际上,Spring中的AOP代理默认就是使用JDK动态代理的方式来实现的。在Spring中,使用ProxyFactoryBean是创建AOP代理的最基本方法,接下来我会对Spring中基于代理类的AOP实现的相关进行详细详解。

Spring的通知类型

1.org.aopalliance.intercept.Methodinterceptor(环绕通知)  
在目标方法执行前后实施增强,可以应用于日志,事务管理等功能  
2.org.aopalliance.intercept.MethodBeforeAdvice(前置通知)  
在目标方法执行前实施增强,可以应用于权限管理等功能
3.org.aopalliance.intercept.AfterReturingAdvice(后置通知)  
在目标方法执行后实施增强,可以应用于关闭流,上传文件,删除临时文件等功能
4.org.aopalliance.intercept.ThrowsAdvice(异常通知)    
在方法抛出异常后实施增强,可以应用于处理异常记录日志等功能
5.org.aopalliance.intercept.IntroductionInterceptor(引介通知)  
在目标方法添加一些新的方法和属性,可以应用于修改老版本程序(增强类)

ProxyFactoryBean类中的常用可配置属性

实战

1.引入依赖

 <dependency>
      <groupId>aopalliance</groupId>
      <artifactId>aopalliance</artifactId>
      <version>1.0</version>
    </dependency>
    此处aop的依赖省略

1.创建接口UserDao类  

package com.aop.jdk;

public interface UseDao {
    public void addUser();
    public void deleteUser();
}

2.创建目标类UserDaoImpl实现UserDao接口

package com.aop.jdk;
import com.ioc.UserDao;

//目标类
public class UserDaoImpl implements UseDao {
    @Override
    public void addUser() {
        System.out.println("添加用户");
    }

    @Override
    public void deleteUser() {
        System.out.println("删除用户");
    }
}

3.创建切面类  

public class MyAspect implements MethodInterceptor{
    @Override
    public Object invoke(MethodInvocation mi) throws Throwable {
        check_Permission();
        //执行目标方法
        Object obj = mi.proceed();
        log();
        return obj;
    }
    public void check_Permission(){
        System.out.println("模拟检查权限。。。");
    }
    public void log(){
        System.out.println("模拟记录日志。。。");
    }

}

4.factorybean.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-3.0.xsd
                       "

       default-lazy-init="false">

    <!--目标类-->
    <bean id="userDao" class="com.aop.factorybean.UserDaoImpl"></bean>
    <!--切面类-->
    <bean id="myAspect" class="com.aop.factorybean.MyAspect"></bean>
    <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!--指定代理实现的接口-->
        <property name="proxyInterfaces" value="com.aop.factorybean.UseDao"></property>
        <!--指定目标对象-->
        <property name="target" ref="userDao"></property>
        <!--指定切面,植入环绕通知-->
        <property name="interceptorNames" value="myAspect"></property>
        <!--指定代理方式,rtue:使用cglib,false(默认):使用jdk动态代理-->
        <property name="proxyTargetClass" value="true"></property>
    </bean>
</beans>


5.创建测试类

public class ProxyFactoryBeanTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("factorybean.xml");
        UserDaoImpl userDao = (UserDaoImpl) applicationContext.getBean("userDaoProxy");
        userDao.addUser();
        userDao.deleteUser();
    }
}

运行结果

基于代理类的AOP实现

推荐阅读:




如果看了有所帮助,转发点赞分享给那些还在迷茫的人吧。


基于代理类的AOP实现

 喜欢记得来个赞

也可点击后台来撩我添加小编微信

以上是关于基于代理类的AOP实现的主要内容,如果未能解决你的问题,请参考以下文章

基于代理类的AOP的实现

Spring------AOP

JAVA之AOP

spring aop中this和target区别

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

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