• 代理的四种实现方式



    1、jdk动态代理 实现

    核心:Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this); 

    package org.sh.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    import org.sh.HellowImpl;
    import org.sh.HellowInf;
    
    public class JDKProxyFactory implements InvocationHandler {
    	private Object target = null;
    	public Object getProxyBean(Object target){
    		this.target = target;
    		return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this);		 
    	}
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args)
    			throws Throwable {
    		System.out.println("i am proxy");
    		Object result = null;
    		if(((HellowInf)this.target).getName() != null){
    			System.out.println("i am not null");
    			try{
    				//前置
    				result = method.invoke(this.target, args); //注意 this.target 而不是proxy
    				//后置
    			}catch(Exception e){
    				//例外
    			}finally{
    				//最终
    			}
    			 
    		}
    	
    		return null;
    	}
    	
    	public static void main(String[] args) {
    		
    		Object obj = new JDKProxyFactory().getProxyBean(new HellowImpl("wch"));
    		HellowInf hellow = (HellowInf) obj;
    		hellow.sayHellow();
    	}
    }
    
     

    2、cglib 代理(导入相应的包,spring会包含 cglib-nodep.jar)

    核心:Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(target.getClass()); //父类 
    enhancer.setCallback(this);  //回调
    return enhancer.create();

    package org.sh.proxy;
    
    import java.lang.reflect.Method;
    
    import org.sh.HellowImpl;
    import org.sh.HellowInf;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class CGLIBProxyFactory  implements MethodInterceptor{
    	private Object target;
    	public Object createProxyBean(Object target){
    		this.target = target;
    		Enhancer enhancer = new Enhancer();
    		enhancer.setSuperclass(target.getClass()); //父类 
    		enhancer.setCallback(this);  //回调
    		return enhancer.create();
    	}
    	@Override
    	public Object intercept(Object target, Method method, Object[] arg2,
    			MethodProxy methodProxy) throws Throwable {
    		HellowInf hellow = (HellowInf) this.target;
    		if (hellow.getName()!= null) {
    			System.out.println("cglib");
    			return methodProxy.invoke(this.target, arg2);
    		}
    		return null;
    	}
    	public static void main(String[] args) {
    		Object obj = new CGLIBProxyFactory().createProxyBean(new HellowImpl("wch"));
    		HellowInf hellow = (HellowInf) obj;
    		hellow.sayHellow();
    	}
    	
    }
    


    3、aspect 注解方式

    package org.sh.aop;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    @Aspect
    public class Myinterceptor {
    	@Pointcut("execution(* org.sh.aop.PersonBean.*(..))")
    	public void anyMethod(){
    		
    	}
    	@Before("anyMethod() && args(param)")
    	public void before(String param){
    		//只有一个String类型的参数的方法才会被拦截
    		System.out.println("before");
    	}
    	@AfterReturning(pointcut="anyMethod()",returning="result")
    	public void afterReturn(String result){
    		//返回stirng类型的result才会被拦截
    	}
    	@AfterThrowing(pointcut="anyMethod()",throwing="e")
    	public void afterThrow(Exception e){
    		//e就是方法抛出的异常
    	}
    	@After("anyMethod()")
    	public void after(){
    		//最终通知
    	}
    	@Around("anyMethod()")
    	public Object around(ProceedingJoinPoint pjp){
    		try {
    			//之前
    			return pjp.proceed(); //执行方法
    			//之后
    		} catch (Throwable e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	public static void main(String[] args) {
    		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    		((PersonBean)ac.getBean("personbean")).save();
    	}
    }
    

    4、配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
    	xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:aop="http://www.springframework.org/schema/aop"
    	xmlns:p="http://www.springframework.org/schema/p"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
    	<aop:aspectj-autoproxy/> <!-- 打开注解方式 -->
    	<bean id="myinter" class="org.sh.aop.Myinterceptor"></bean>
    	<bean id="personbean" class="org.sh.aop.PersonBean"></bean>
    	<aop:config>
    		<aop:aspect id="myaspect" ref="myinter">
    			<aop:pointcut expression="execution(* *(..))" id="pointcut"/>
    			<aop:before method="before" arg-names="p" pointcut-ref="pointcut"/>
    			<aop:after method=""/>
    			<aop:after-returning method=""/>
    		</aop:aspect>
    	</aop:config>
    </beans>


  • 相关阅读:
    React Native移动框架功能研究
    移动app框架inoic功能研究
    使用Ivy管理项目中的依赖
    使用Ant自动化我们的java项目生成
    Java构建工具Ant小记(一)
    打造Ubuntu下Java开发环境
    解决系统系统管理员不允许使用保存的凭据登录远程计算机
    Ubuntu全新安装firefox最新版本
    jQuery Ready 与 Window onload 的区别(转)
    程序员的素养
  • 原文地址:https://www.cnblogs.com/vvch/p/4027593.html
Copyright © 2020-2023  润新知