zoukankan      html  css  js  c++  java
  • 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的本质。

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    case class inheritance
    [Akka]发送一条消息的内部流程
    Java 8 新特性
    大数据学习笔记
    磁盘结构
    AtomicReference 和 volatile 的区别
    How to support both ipv4 and ipv6 address for JAVA code.
    使用JProfiler分析定位java内存泄露memory leak
    redhat mount iso as one yum repository
    Linux Shell常用技巧
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/10354091.html
Copyright © 2011-2022 走看看