动态代理,静态代理,装饰者

 

package com.igeekhome.c30.spring_aop;

public interface Calculator {
	public int add(int x ,int y);
	public int mis(int x ,int y);
	public int mul(int x ,int y);
	public int div(int x ,int y);
}

 

package com.igeekhome.c30.spring_aop;

import org.springframework.stereotype.Component;

@Component
public class CalculatorImpl implements Calculator {

	@Override
	public int add(int x, int y) {
		int result = x + y;
		return result;
	}

	@Override
	public int mis(int x, int y) {
		int result = x - y;
		return result;
	}

	@Override
	public int mul(int x, int y) {
		int result = x * y;
		return result;
	}

	@Override
	public int div(int x, int y) {
		int result = x / y;
		return result;
	}
	
	public int mol(int x ,int y){
		return x % y;
	}

}

 装饰者:

装饰者只能单个方法进行装饰:

package com.igeekhome.c30.spring_aop;

public class Display {
	private Calculator calculator = null;
	
	public Display(Calculator calculator) {
		super();
		this.calculator = calculator;
	}

	public int calculate(int x ,int y){
		System.out.println("开始调用add方法");
		int result = calculator.add(x, y);
		System.out.println("add方法调用结束");
		return result;
	}
}

 静态代理:

与装饰者对比是静态代理需要实现原主题的接口拥有原主题的方法;

package com.igeekhome.c30.spring_aop;

public class CalculatorImplProxy implements Calculator{
	private Calculator calculator;
	
	public CalculatorImplProxy(Calculator calculator) {
		super();
		this.calculator = calculator;
	}

	@Override
	public int add(int x, int y) {
		System.out.println("开始");
		int result = calculator.add(x, y);
		System.out.println("结束");
		return result;
	}

	@Override
	public int mis(int x, int y) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int mul(int x, int y) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int div(int x, int y) {
		// TODO Auto-generated method stub
		return 0;
	}

}

动态代理: 

package com.igeekhome.c30.spring_aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class CalculatorProxyFactoryBean {
	private Calculator calculator;

	public CalculatorProxyFactoryBean(Calculator calculator) {
		super();
		this.calculator = calculator;
	}
	
	public Calculator getCalculatorProxy(){
		//Proxy是jdk提供的产生代理对象的一个类
		//需要三个参数:ClassLoader,是一个类加载器,实现的接口,InvocationHandler处理器
		InvocationHandler handler = new InvocationHandler() {
			
			//Object proxy就是产生的代理对象,一般进行任何处理
			//Method method,调用的方法
			//Object[] args,调用方法时传递的参数
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				System.out.println(method.getName()+" method begin with "+Arrays.toString(args));
				Object result = method.invoke(calculator, args);
				System.out.println(method.getName()+" method end with "+result);
				return result;
			}
		};
		
		Calculator proxyInstance = (Calculator) Proxy.newProxyInstance(calculator.getClass().getClassLoader(), calculator.getClass().getInterfaces(), handler);
		return proxyInstance;
	}
}

测试:

package com.igeekhome.c30.spring_aop;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.igeekhome.c30.aop.Calculator;

public class AppTest {
	
//静态代理	
@Test
	public void TestCalculator(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		Calculator calculator = ac.getBean(Calculator.class);
		Calculator calculator2 = new CalculatorImplProxy(calculator);
		int result = calculator2.add(10, 20);
		System.out.println(result);
	}
	//动态代理
	@Test
	public void TestProxy(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		Calculator calculator = ac.getBean(Calculator.class);
		
		Calculator proxy = new CalculatorProxyFactoryBean(calculator).getCalculatorProxy();
		
		System.out.println(proxy.add(10, 20));
		System.out.println(proxy. mis(40, 20));
		System.out.println(proxy.mul(10, 20));
		System.out.println(proxy.div(40, 20));
	}
	
	

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值