美文网首页
String AOP——基于代理类的AOP的实现

String AOP——基于代理类的AOP的实现

作者: 飞鹩 | 来源:发表于2019-03-13 10:10 被阅读0次

    AOP的全称是Aspect-Oriented Programming.即面向切面编程,也称为面向方面编程,它是面向对象编程(OOP)的一种补充。

    1.string的通知类型

    >>org.aopalliance.intercept.MethodInterceptor(环绕通知):在目标方法执行前后实施增强,可以应用于日志、事务管理等功能。

    >>org.springframework.aop.MethodBeforeAdvice(前置通知):在目标方法执行前实施增强,可以应用于权限管理等功能

    >>org.springframework.aop.AfterReturningAdvice(后置通知):在目标方法执行后实施增强,可以应用于关闭流、上传文件、删除临时文件等功能。

    >>org.springframework.aop.ThrowsAdvice (异常通知):在方法抛出后实施增强,可以应用于处理异常记录日志等功能

    >>org.springframework.aop.IntroductionInterceptor(引介通知):在目标类添加一些新的方法和属性,可以应用修改老版本程序(增强类)。

    2.ProxyFactoryBean

        ProxyFactoryBean是FactoryBean接口的实现类,FactoryBean负责实例化一个Bean,而ProxyFactoryBean负责为其它Bean创建代理实例。

    ProxyFactoryBean类中常用的配置属性如下:

    target:代理的目标对象

    proxyinterfaces:代理要实现的接口,如果有多个接口,可以使用<list></list>赋值

    proxyTargetClass:是否对类代理而不是接口,设置true时,使用的是cglib代理。

    interceptorNames:需要织入目标的Advice

    singleton:返回代理是否为但实例,默认为true ,即默认为返回单实例

    optimize:当设置为true时。强制使用GGLIB。

    3.练习(环绕通知)

    (1)jar包,出了需要的核心jar包,还需要spring-aop-4.3.6.RELEASE.jar和aopalliance-1.0.jar。

    (2)在src下创建一个包com.items.proxyfactorybean。并创建接口,接口实现类,切面类: 

    接口:

    package com.items.proxyfactorybean;

    public interface UserDao {

    public void hello();

    public void hello2();

    }

    实现类:

    package com.items.proxyfactorybean;

    public class UserDaoIml implements UserDao{

    @Override

    public void hello() {

    System.out.println("hello factoryBean");

    }

    @Override

    public void hello2() {

    System.out.println("hello factoryBean two");

    }

    }

    切面类:

    package com.items.proxyfactorybean;

    import org.aopalliance.intercept.MethodInterceptor;

    import org.aopalliance.intercept.MethodInvocation;

    public class MyAspect implements MethodInterceptor{

    @Override

    public Object invoke(MethodInvocation mi) throws Throwable {

    //执行目标方法

    check();

    Object obj = mi.proceed();

    log();

    return obj;

    }

    public void check(){

    System.out.println("**模拟检查权限");

    }

    public void log() {

    System.out.println("***模拟检查日志");

    }

    }

    (2)创建aplicationContext.xml文件,并指定代理对象。

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:p="http://www.springframework.org/schema/p"

        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.xsd">

    <!-- 目标类 -->

    <bean id = "userDao" class = "com.items.proxyfactorybean.UserDaoIml"></bean>

    <!-- 切理类 -->

    <bean id = "myAspect" class = "com.items.proxyfactorybean.MyAspect"></bean>

    <!-- 使用spring代理工厂定义一个名称为userDaoProxy的代理对象 -->

    <bean id = "userDaoProxy" class = "org.springframework.aop.framework.ProxyFactoryBean">

    <!-- 指定代理实现的接口 -->

    <property name="proxyInterfaces" value="com.items.proxyfactorybean.UserDao"></property>

    <!-- 指定目标对象 -->

    <property name="target" ref="userDao" ></property>

    <!-- 指定切面,植入环绕通知 -->

    <property name="interceptorNames" value="myAspect"></property>

    <!-- 指定代理方式 ,true:使用cglib,false:使用默认的jdk代理方式 -->

    <property name="proxyTargetClass" value="true"></property>

    </bean>

    </beans>

    (4)创建测试类ProxyFactoryTexst

    package com.items.proxyfactorybean;

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class ProxyFactoryTexst {

    public static void main(String [] args){

    String xmlPath = "com/items/proxyfactorybean/aplicationContext.xml" ;

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);

    UserDao userDao = (UserDao) applicationContext.getBean("userDaoProxy");

    userDao.hello();

    userDao.hello2();

    }

    }


                                                                                 学习书籍:《javaEE企业级开发程序》

    相关文章

      网友评论

          本文标题:String AOP——基于代理类的AOP的实现

          本文链接:https://www.haomeiwen.com/subject/cpkopqtx.html