实现AOP功能的封装与配置的小框架
内容
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功能的封装与配置的小框架的更多相关文章
- 自己封装的一个Ajax小框架
在经历了Jsp实训的惨痛教训后,特意花了点时间学习Ajax,学完后自我感觉良好,于是写了如下一个小框架: /** * frameAjax * * 参数: * paramsObj: Json * req ...
- 实现类似AOP的封装和配置
这是张孝祥老师Java进阶讲解中最后一个视频,就是实现类似spring中的AOP的封装和配置,特别特别小型的一个框架雏形,但是spring中的核心思想还是体现出来了,真的厉害,张老师!!! 一.重点知 ...
- Spring AOP功能和目标
1.AOP的作用 在OOP中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增加.AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可 ...
- SpringBoot中使用LoadTimeWeaving技术实现AOP功能
目录 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 1.2 JDK实现LTW的原理 1.3 如何在Spring中实现LTW 2. Springboot中使用LTW实现A ...
- (转)使用CGLIB实现AOP功能与AOP概念解释
http://blog.csdn.net/yerenyuan_pku/article/details/52864395 使用CGLIB实现AOP功能 在Java里面,我们要产生某个对象的代理对象,这个 ...
- Ioc 之 Unity的AOP功能
前面我们介绍了Unity的依赖注入功能,现在来介绍下Unity的AOP功能.AOP是面向切面编程,它能够使我们在不改变现有代码结构的情况下额外的为其添加一些功能. 我们还是使用配置文件来对类型进行注入 ...
- C# Unity依赖注入利用Attribute实现AOP功能
使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展 ...
- VSPackge插件系列:常用IDE功能的封装
继上一篇VSPackge插件系列简单介绍如何正确的获取DTE之后,就一直没发VSPackge插件系列的文章了,最近同事也想了解如何在代码中与VS交互,特发一篇文章示例一些简单功能是如何调用,也以备以后 ...
- spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)
1. 声明式事务管理分类 声明式事务管理也有两种常用的方式, 一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解. 显然基于注解的方式更简单易用,更清爽. ...
随机推荐
- hdu4597 Play Game 区间DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597 全国邀请赛通化赛区第8题--题目重现 思路: 区间DP的思想,想法是队友想出来的,感觉很秒,自己 ...
- 深入Java集合学习系列:Hashtable的实现原理
第1部分 Hashtable介绍 和HashMap一样,Hashtable也是一个散列表,它存储的内容是键值对(key-value)映射.Hashtable继承于Dictionary,实现了Map.C ...
- ScheduledFuture和RunnableScheduledFuture详解
ScheduledFuture java.util.concurrent 接口 ScheduledFuture<V> 类型参数: V - 此 Future 返回的结果类型. 所 ...
- 配置网络yum源
有的时候服务器需要下载一些软件,是本地yum源没有的,这时候需要配置网络yum源 #cd /etc/yum.repos.d/ 把这个目录下的配置文件备份,改名:或者是把文件里边的enabled=1的 ...
- 【JAVAWEB学习笔记】14_response
HttpServletResponse 学习目标 案例一.完成文件下载 案例二.生成验证码(了解) 1.HttpServletResponse概述 我们在创建Servlet时会覆盖service()方 ...
- Spark操作HBase问题:java.io.IOException: Non-increasing Bloom keys
1 问题描述 在使用Spark BulkLoad数据到HBase时遇到以下问题: 17/05/19 14:47:26 WARN scheduler.TaskSetManager: Lost task ...
- 主java程序猿知识体系结构
zuoxiaolong博客园<浅谈程序猿书箱的选择,你会如何选择自己的爱书呢>一文,链接如下:http://www.cnblogs.com/zuoxiaolong/p/life19.htm ...
- 【WPF MaterialDesign 示例开源项目】 Work Time Manager
转岗写了将近一年的 PHP 最近因为 工作太多太杂, 在汇报工作的时候经常会忘记自己做了些什么,本来想只是使用excel来记录,但是发现了excel的很多局限性,光是无法共享就郁闷死了,习惯了下班不带 ...
- C# 字典 Dictionary
原文地址http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionary.html 侵删
- 使用nodeJS实现前端项目自动化之项目构建和文件合并
前面的话 一般地,我们使用构建工具来完成项目的自动化操作.本文主要介绍如何使用nodeJS来实现简单的项目结构构建和文件合并 项目构建 假设,最终实现的项目名称为'test',结构如下图所示 那么,首 ...