内容

java基础巩固笔记 - 实现AOP功能的封装与配置的小框架

设计(目录):

XXX = java.util.ArrayList中

代码

Advice接口

MyAdvice类

BeanFactory类

ProxyFactoryBean类

AopFrameWorkTest类

输出

本文通过是动态代理实现的AOP功能的封装与配置的小框架.加深对动态代理和AOP编程的理解

获取源码,学习交流,那就加入小编的学习交流群吧!616 959 444

设计

根据配置文件的键xxx对应的值(类全名)创建相应类的对象。

当且仅当xxx对应的值为com.iot.proxy.aopframework.ProxyFactoryBean时,则生成相应的动态代理类对象。代理对象的目标类和通知实现类分别由xxx.target和xxx.advice配置

配置文件

了解更多Java知识,获取原视频,源码,学习交流,那就加入小编的学习交流群吧!616 959 444

config.propertiest位于aopframework包下

xxx代表要加载的类

xxx.advice代表通知接口的某个实现类

xxx.target代表委托类

#xxx=java.util.ArrayList

xxx=com.iot.proxy.aopframework.ProxyFactoryBean

xxx.advice=com.iot.proxy.MyAdvice

xxx.target=java.util.ArrayList

包:com.iot.proxy.aopframework,有如下几个类/接口:

BeanFactory,用于读取配置文件,根据配置创建相应的对象

ProxyFactoryBean,用于生成代理对象,含有两个私有属性:目标和通知

Advice,通知接口,用于把切面的代码以对象的形式传递给InvocationHandler的的invoke方法

MyAdvice,Advice接口的一个实现类,打印执行方法前的时间及执行耗时

AopFrameWorkTest,测试效果

代码

Advice接口

package com.iot.proxy.aopframework;

import java.lang.reflect.Method;

/**

* Created by brian on 2016/2/2.

*/

public interface Advice {

void beforeMethod(Method method);

void aftereMethod(Method method);

}

MyAdvice类

package com.iot.proxy.aopframework;

import java.lang.reflect.Method;

/**

* Created by brian on 2016/2/2.

*/

public class MyAdvice implements Advice{

long beginTime = 0 ;

@Override

public void beforeMethod(Method method) {

System.out.println(method.getName()+" before at "+beginTime);

beginTime = System.currentTimeMillis();

}

@Override

public void aftereMethod(Method method) {

long endTime = System.currentTimeMillis();

System.out.println(method.getName()+" cost total "+ (endTime-beginTime));

}

}

获取源码,学习交流,那就加入小编的学习交流群吧!

616

959

444

BeanFactory类

package com.iot.proxy.aopframework;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

/**

* Created by brian on 2016/2/2.

*/

public class BeanFactory {

Properties properties = new Properties();

public BeanFactory(InputStream inputStream){

try {

properties.load(inputStream);

} catch (IOException e) {

e.printStackTrace();

}

}

public Object getBean(String name){

String className = properties.getProperty(name);

Object bean = null;

try {

Class clazz = Class.forName(className);

bean = clazz.newInstance();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

if (bean instanceof ProxyFactoryBean){

ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;

Advice advice = null;

Object target = null;

try {

advice = (Advice) Class.forName(properties.getProperty(name+".advice")).newInstance();

target = Class.forName(properties.getProperty(name+".target")).newInstance();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

proxyFactoryBean.setAdvice(advice);

proxyFactoryBean.setTarget(target);

Object proxy = ((ProxyFactoryBean) bean).getProxy();

return proxy;

}

return bean;

}

}

ProxyFactoryBean类

package com.iot.proxy.aopframework;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

/**

* Created by brian on 2016/2/3.

*/

public class ProxyFactoryBean {

private Object target;

private Advice advice;

public Object getProxy(){

Object proxy = Proxy.newProxyInstance(

target.getClass().getClassLoader(),

target.getClass().getInterfaces(),

new InvocationHandler() {

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

advice.beforeMethod(method);

Object retVal = method.invoke(target,args);

advice.aftereMethod(method);

return retVal;

}

}

);

return proxy;

}

public Object getTarget() {

return target;

}

public void setTarget(Object target) {

this.target = target;

}

public Advice getAdvice() {

return advice;

}

public void setAdvice(Advice advice) {

this.advice = advice;

}

}

AopFrameWorkTest类

package com.iot.proxy.aopframework;

import java.io.InputStream;

import java.util.Collection;

/**

* Created by brian on 2016/2/3.

*/

public class AopFrameWorkTest {

public static void main(String[] args) {

InputStream inputStream = AopFrameWorkTest.class.getResourceAsStream("config.properties");

Object bean = new BeanFactory(inputStream).getBean("xxx");

System.out.println(bean.getClass().getName());

((Collection) bean).clear();

}

}

获取源码,学习交流,那就加入小编的学习交流群吧!616 959 444

输出

  • 配置

xxx=com.iot.proxy.aopframework.ProxyFactoryBean

输出为:

com.sun.proxy.$Proxy0clear before at 0clear cost total 0
  • 配置

xxx=java.util.ArrayList

输出为:

java.util.ArrayList

可以看出,只改变配置文件,就可改变代码的运行结果,从而达到灵活的效果

实现AOP功能的封装与配置的小框架的更多相关文章

  1. 自己封装的一个Ajax小框架

    在经历了Jsp实训的惨痛教训后,特意花了点时间学习Ajax,学完后自我感觉良好,于是写了如下一个小框架: /** * frameAjax * * 参数: * paramsObj: Json * req ...

  2. 实现类似AOP的封装和配置

    这是张孝祥老师Java进阶讲解中最后一个视频,就是实现类似spring中的AOP的封装和配置,特别特别小型的一个框架雏形,但是spring中的核心思想还是体现出来了,真的厉害,张老师!!! 一.重点知 ...

  3. Spring AOP功能和目标

    1.AOP的作用 在OOP中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增加.AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可 ...

  4. SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    目录 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 1.2 JDK实现LTW的原理 1.3 如何在Spring中实现LTW 2. Springboot中使用LTW实现A ...

  5. (转)使用CGLIB实现AOP功能与AOP概念解释

    http://blog.csdn.net/yerenyuan_pku/article/details/52864395 使用CGLIB实现AOP功能 在Java里面,我们要产生某个对象的代理对象,这个 ...

  6. Ioc 之 Unity的AOP功能

    前面我们介绍了Unity的依赖注入功能,现在来介绍下Unity的AOP功能.AOP是面向切面编程,它能够使我们在不改变现有代码结构的情况下额外的为其添加一些功能. 我们还是使用配置文件来对类型进行注入 ...

  7. C# Unity依赖注入利用Attribute实现AOP功能

    使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展 ...

  8. VSPackge插件系列:常用IDE功能的封装

    继上一篇VSPackge插件系列简单介绍如何正确的获取DTE之后,就一直没发VSPackge插件系列的文章了,最近同事也想了解如何在代码中与VS交互,特发一篇文章示例一些简单功能是如何调用,也以备以后 ...

  9. spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)

    1. 声明式事务管理分类 声明式事务管理也有两种常用的方式, 一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解. 显然基于注解的方式更简单易用,更清爽. ...

随机推荐

  1. Springboot基础篇

    Springboot可以说是当前最火的java框架了,非常适合于"微服务"思路的开发,大幅缩短软件开发周期. 概念 过去Spring充满了配置bean的xml文件,随着spring ...

  2. 精华【分布式、微服务、云架构、dubbo+zookeeper+springmvc+mybatis+shiro+redis】分布式大型互联网企业架构!

    平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis ...

  3. Servlet的优化.GenericServlet

    如何更好的使用servlet?GernericServlet可以由自己仿照一个出来,下面就是介绍了如何写这样的一个类 1.init方法 妥善的保存config对象 2.空参init方法,为了防止开发人 ...

  4. 张高兴的 Windows 10 IoT 开发笔记:使用 ADS1115 读取模拟信号

    考虑到 Raspberry Pi 读取模拟信号是很烦人的事情,更何况是在没人玩的 Windows 10 IoT 下,所以准备正儿八经的写点东西. 需求:使用 Raspberry Pi 读取输出模拟信号 ...

  5. Oracle 只导出某个用户下的表及数据

    今天某大牛问我要之前我参与的一个系统的代码及库,我捣鼓下,发给了他. 他很诧异的问:这个库有这么大么 我说 因为当时是专门新建了一个实例,用户也是系统用户,所以导出的时候是导出的整个数据库 他 ZZ ...

  6. Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

    IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...

  7. 探讨SQL Server并发处理队列数据不阻塞解决方案

    前言 之前对于并发这一块确实接触的比较少,自从遇到现在的老大,每写完一块老大都会过目一下然后给出意见,期间确实收获不少,接下来有几篇会来讲解SQL Server中关于并发这一块的内容,有的是总结,有的 ...

  8. C# 特性(Attribute)

    个人定义:不侵入对象的情况下,添加对象附注信息. 官方定义:将预定义的系统信息或用户定义的自定义信息与目标元素相关联.目标元素可以是程序集.类.构造函数.委托.枚举.事件.字段.接口.方法.可移植可执 ...

  9. React学习小结(二)

    一.组件的嵌套 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  10. css因Mime类型不匹配而被忽略,怎么解决

    问题:在火狐.谷歌都可以正常显示出来,在别人的IE浏览器上也可以正常显示出来,但是在自己的ie浏览器就完全不能加载的熬样式了 控制台报告 SEC7113: CSS 因 Mime 类型不匹配而被忽略 答 ...