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的本质。

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/10354091.html
Copyright © 2011-2022 走看看