public static void main(String[] args) { // 1. 创建Spring 的IOC容器 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // 2. 从IOC容器中获取bean 的实例 ArithmeticCalculator arithmeticCalculator = ctx.getBean(ArithmeticCalculator.class); // 3.使用 bean int result = arithmeticCalculator.add(3, 6); System.out.println("result: " + result); result = arithmeticCalculator.div(12, 6); System.out.println("result: " + result); }
public ArithmeticCalculator getLoggingProxy() { ArithmeticCalculator proxy = null; // 代理对象由哪一个加载器进行加载 ClassLoader loader = target.getClass().getClassLoader(); // 代理对象的类型,即其中有哪些方法 Class[] interfaces = new Class[] {ArithmeticCalculator.class}; // 调用代理对象其中的方法时,实际执行的代码 InvocationHandler h = new InvocationHandler() { /** proxy:正在返回的那个代理对象,一般情况下不适用 method:正被调用的方法 args:调用方法的参数 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); // 日志 System.out.println( "The method " + methodName + " begins with " + Arrays.asList((args))); // 执行方法 Object result = null; try { // 前置通知 result = method.invoke(target, args); // 返回通知 } catch (IllegalAccessException e) { e.printStackTrace(); // 异常通知,可以访问方法出现的异常 } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } // 后置通知,方法可能异常,访问不到返回值 System.out.println("The method " + methodName + " ends with " + result); return result; } }; proxy = (ArithmeticCalculator) Proxy.newProxyInstance(loader, interfaces, h); return proxy; }