Spring api如何手动创建代理对象ProxyFactory

这篇文章跟大家分析一下“Spring api如何手动创建代理对象ProxyFactory”。内容详细易懂,对“Spring api如何手动创建代理对象ProxyFactory”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“Spring api如何手动创建代理对象ProxyFactory”的知识吧。

可以通过注解的方式来自定义代理对象的创建,同时也可以通过 SpringAPI,手动编程的方式来创建代理对象。

几个重要的API:

ProxyFactory

MethodInterceptor

Advice

AfterReturningAdvice

MethodBeforeAdvice

import java.lang.reflect.Method;

import org.aopalliance.intercept.Interceptor; 

import org.aopalliance.intercept.MethodInterceptor; 

import org.aopalliance.intercept.MethodInvocation; 

import org.junit.Test; 

import org.springframework.aop.AfterAdvice; 

import org.springframework.aop.AfterReturningAdvice; 

import org.springframework.aop.MethodBeforeAdvice; 

import org.springframework.aop.framework.ProxyFactory;

import cn.hessian.service.HelloWorldService; 

import cn.hessian.service.impl.HelloWorldServiceImpl2;

/** 

* @author beijing 

* 2013-4-2 

*/ 

public class SpringProgramicProxyDemo {

    @Test 

    public void test(){ 

        //代理对象需要的实现的接口 

        Class[] interfaces=new Class[]{HelloWorldService.class}; 

        //利用spring的API,创建代理工厂 

        ProxyFactory proxyFactory=new ProxyFactory(interfaces); 

        //设置目标对象 

        proxyFactory.setTarget(new HelloWorldServiceImpl()); 

        /** 

         * Set whether proxies created by this configuration should be prevented from being cast to Advised to query proxy status. 

            Default is "false", meaning that any AOP proxy can be cast to Advised. 

         * */ 

        proxyFactory.setOpaque(true); 

       //添加方法前置通知 

        proxyFactory.addAdvice(new MethodBeforeAdvice() { 

            @Override 

            public void before(Method method, Object[] args, Object target) 

                    throws Throwable { 

                System.out.println("1---在方法调用之前拦截"); 

            } 

        }); 

        //可以添加多个方法前置或者后置通知 

    proxyFactory.addAdvice(new MethodBeforeAdvice() { 

            @Override 

            public void before(Method method, Object[] args, Object target) 

                    throws Throwable { 

                System.out.println("2---在方法调用之前拦截"); 

            } 

        }); 

   //可以添加多个方法前置或者后置通知 

        proxyFactory.addAdvice(new AfterReturningAdvice() { 

            @Override 

            public void afterReturning(Object returnValue, Method method, 

                    Object[] args, Object target) throws Throwable { 

                System.out.println("方法完成之后调用的方法---1"); 

            } 

        }); 

       //可以添加多个方法前置或者后置通知 

        proxyFactory.addAdvice(new AfterReturningAdvice() { 

            @Override 

            public void afterReturning(Object returnValue, Method method, 

                    Object[] args, Object target) throws Throwable { 

                System.out.println("方法完成之后调用的方法---2"); 

            } 

        }); 

  //对于环绕通知只能添加一个,多添加也是没有用的,spring会选第一个advice,请看结果

        proxyFactory.addAdvice(new MethodInterceptor() { 

            @Override 

            public Object invoke(MethodInvocation invocation) throws Throwable { 

                System.out.println("1---环绕通知"); 

                Object[] params=invocation.getArguments(); 

                Method method=invocation.getMethod(); 

                Object target=invocation.getThis(); 

                Object bytes=method.invoke(target, params); 

                byte[] result=(byte[]) bytes; 

                System.out.println("1---环绕通知生成的结果:"+new String(result)); 

                return "北京生活圈".getBytes(); 

            } 

        }); 

       //对于环绕通知只能添加一个,多添加也是没有用的,spring会选第一个advice,请看结果 

proxyFactory.addAdvice(new MethodInterceptor() { 

            @Override 

            public Object invoke(MethodInvocation invocation) throws Throwable { 

                System.out.println("2---环绕通知"); 

                Object[] params=invocation.getArguments(); 

                Method method=invocation.getMethod(); 

                Object target=invocation.getThis(); 

                Object bytes=method.invoke(target, params); 

                byte[] result=(byte[]) bytes; 

                System.out.println("2---环绕通知生成的结果:"+new String(result)); 

                return bytes; 

            } 

        }); 

        Object proxy=proxyFactory.getProxy(proxyFactory.getClass().getClassLoader()); 

        Class[] inters=proxy.getClass().getInterfaces(); 

        for(Class str: inters ){ 

            System.out.println(str.getSimpleName()); 

        } 

        HelloWorldService helloWorldService=(HelloWorldService)proxy; 

        System.out.println(new String(helloWorldService.sayHelloWorld("北京"))); 

    } 

}

关于Spring api如何手动创建代理对象ProxyFactory就分享到这里啦,希望上述内容能够让大家有所提升。如果想要学习更多知识,请大家多多留意小编的更新。谢谢大家关注一下编程之家网站!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原理介绍,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。传统事务中回滚点的使...
今天小编给大家分享的是一文解析spring中事务的传播机制,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区别,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Spring Cloud Netfli...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。第一步:整合pom文件,在S...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。List 坑列表 = new ArrayList(2);...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇...
本篇内容主要讲解“Spring中的@Autowired和@Resource注解怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学...
今天小编给大家分享一下SpringSecurity怎么定义多个过滤器链的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“Spring的@Conditional注解怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring的@Con...
这篇文章主要介绍了SpringCloudGateway的熔断限流怎么配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud&nb...
今天小编给大家分享一下怎么使用Spring解决循环依赖问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考
这篇文章主要介绍“Spring事务及传播机制的原理及应用方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Sp...
这篇“SpringCloudAlibaba框架实例应用分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价
本篇内容主要讲解“SpringBoot中怎么使用SpringMVC”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习...
这篇文章主要介绍“SpringMVC适配器模式作用范围是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringMVC
这篇“导入SpringCloud依赖失败如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要讲解了“SpringMVC核心DispatcherServlet处理流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来
今天小编给大家分享一下SpringMVCHttpMessageConverter消息转换器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以...
这篇文章主要介绍“Spring框架实现依赖注入的原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring框架...
本篇内容介绍了“Spring单元测试控制Bean注入的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下