实现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注解. 显然基于注解的方式更简单易用,更清爽. ...
随机推荐
- Maven学习-优化和重构POM
在一个复杂的项目中,项目的各个模块存在各种相互依赖关系.优化一个多模块项目的POM最好通过几步来做.总的来说,我们总是寻找一个POM中的重复或者多个兄弟POM中的重复.在多模块项目中依赖重复的模式主要 ...
- TCP协议简介
1.TCP协议的特点 TCP是面向连接的运输层协议 每一条TCP连接只能有两个端点.TCP只能进行点对点通信 TCP提供可靠交付的服务.通过TCP连接传输的数据,无差错.不丢失.不重复.并且按序到达 ...
- fopen的使用小记
整理自https://msdn.microsoft.com/zh-cn/library/t3ayayh1(VS.80).aspx errno, _doserrno, _sys_errlist, and ...
- JQuery控制下拉列表
//遍历option和添加.移除option function changeShipMethod(shipping){ var len = $("select[@name=ISHIPTYPE ...
- Windows下安装Nodejs步骤
最近打算把我们的微信端用Vue.js重构,为什么选择Vue.js,一是之前使用的是传统的asp.net mvc,多页面应用用户体验比单页面要差.二是使用过Angular.js,感觉对开发人员要求较 ...
- trap-接收信号_采取行动
trap命令用于指定在接收到信号后将要采取的动作,常见的用途是在脚本程序被中断时完成清理工作. kill和trap等都可以看到信号编号及其关联的名称. "信号"是指那些被异步发送到 ...
- 第 9 章 MySQL数据库Schema设计的性能优化
前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只 ...
- SmartCoder每日站立会议04
1.站立会议内容 经过今天的站立会议,决定首页先做成简单的样式,先完善功能.进行了首页模块划分. 站立会议照片: 2.任务展板 3.燃尽图
- jQuery-强大的jQuery选择器、过滤器
1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择ID为divId的元素 element 根据元素的名称选择, $(" ...
- Git基础-打标签
打标签 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做.本节我们一起来学习如何列出所有可用的标签,如何新建标签,以 ...