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));
}
}