热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

实现AOP功能的封装与配置的小框架

内容java基础巩固笔记-实现AOP功能的封装与配置的小框架设计(目录):XXXjava.util.ArrayList中代码Advice接口MyAdvice类BeanFactory

内容

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

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

技术分享


推荐阅读
  • 学习kmp算法我最后是看的数据结构书上的一本教材学会的。。我觉得kmp相对于普通的BF算法就是避免了很多不必要的匹配,而kmp算法的精髓自然就在于next数组的运用。。。而next ... [详细]
  • 前言:拿到一个案例,去分析:它该是做分类还是做回归,哪部分该做分类,哪部分该做回归,哪部分该做优化,它们的目标值分别是什么。再挑影响因素,哪些和分类有关的影响因素,哪些和回归有关的 ... [详细]
  • Linux Shell脚步的格式
    Shell脚步等多个命令的组合,可以做成一个shell文件(1.sh)赋权执行执行命令的方式前两张新的进程中执行,对当前进程不产生影响(cdtmp;pwds ... [详细]
  • 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList优于LinkedList,因为Ar ... [详细]
  • 动手动脑,无法自拔(3)课时作业6
    1.动手动脑(五子棋棋盘排布)(1)源程序(2)实验截图2.动手动脑(数字转换成汉字)(1)源程序(2)实验截图3.动手动脑(大数计算)(1)源程序 ... [详细]
  • gitlab重置password
    ruby没怎么学,自己搭建的gitlab的rootpassword又忘了。幸好看见此帖子,试验okhttp:roland.kierkels.netgitreset-your-git ... [详细]
  • 第8章 使用外部和内部链接
    8.1使用web地址LearnAboutafricanelephants. ... [详细]
  • substring( ) 和 substr( ) 的区别
    1、里面的参数定义不一样substring(x,y)substr(x,y);substring里面的x,y是位置,相当于坐标,substr里的x是位置,y是长度length特殊备注 ... [详细]
  • 说到C语言的语句块,真是一堆血泪史。第一大坑就是优先级。刚工作那会儿,C的书没看几本,自信满满的认为C语言都会了,拿出搞ACM培养的豪情壮志,代码倒是写得爽,却到处留 ... [详细]
  • 今天我们开始学习下拉及多级弹出菜单,包含以下内容和知识点:带下拉子菜单的导航菜单绝对定位和浮动的区别和运用css自适应宽度滑动门菜单一、带下拉子菜单的导航菜单下拉菜单在一些 ... [详细]
  • 在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用java.util包中的Date类。这个类最主要的作用就是获取当前时间,我们来看下Date类的使用:使用Date类的 ... [详细]
  • java的流分两大类,字节流和字符流。一般在cc++中,一个字节是8位,java也是一样。但是,在cc++中一个字符,即char一般也是8位(可能机器不同会有所不同),但java为 ... [详细]
  • 前言:关于跨域CORS1.没有跨域时,ajax默认是带cookie的2.跨域时,两种解决方案:1)服务器端在filter中配置详情:http:blog.csdn.netwzl002 ... [详细]
  • 最近帮人用Apache+Tomcat在同一台IP的服务器上设置多域名指向不同网站站点,花费了不少的时间。尤其是配置信息的时候,从网上找的资料有很多是错误的,误认不浅。所以今天特意把 ... [详细]
  • 无处不在,详解iOS集成第三方登录(SSO授权登录<无需密码>)
    1.前言 不多说,第三登录无处不在!必备技能,今天以新浪微博为例。这是上次写的iOS第三方社交分享:http:www.cnblogs.comqingchep3727559.html ... [详细]
author-avatar
C3calm_daidai_649
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有