实现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注解. 显然基于注解的方式更简单易用,更清爽. ...
随机推荐
- 20170515-20170523学习计划---学习java(1)
背景: 组内搞了一个读书会,我是负责人,我们学习的主题是java,为了更好服务读书会,所以安排一下学习计划,到时候在读书会上做分享. 这是第二次读书会,第一次讲了java的一些基本知识,这次只要学习对 ...
- 基于spark和sparkstreaming的word2vec
概述 Word2vec是一款由谷歌发布开源的自然语言处理算法,其目的是把words转换成vectors,从而可以用数学的方法来分析words之间的关系.Spark其该算法进行了封装,并在mllib中实 ...
- conda 使用清华大学开源软件镜像
conda 使用清华大学开源软件镜像 Anaconda的安装步骤不在本文的讨论中,我们主要是学习一下如何配置conda的镜像,以及一些问题的解决过程 配置镜像 在conda安装好之后,默认的镜像是官方 ...
- 修改别人写的利用AOP实现日志监控的问题
原文链接 http://blog.csdn.net/jaune161/article/details/51476138 想法 看到原文博主写的这篇文章,我感觉写的很好,可以在我们的项目中使用AOP来监 ...
- Combine Two Tables
Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...
- javaWeb学习总结(10)- EL表达式
一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...
- 2D游戏开发(1)
<外星人入侵> 通过pygame,入门python的2D游戏开发过程,通过教材制作一个打外星人游戏. 1.函数 run_game() import sys import pygame de ...
- 关于Laravel中的artisan命令
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica; color: #454545 } p.p2 { margin: 0.0p ...
- sql备份(导出脚本)
第一步: 右键需要备份的数据库(这里以MyDB为例)-->任务-->生成脚本
- Ant + Jenkies +Tomcat 自动构建部署Web项目
前言:博主资历尚浅,很多东西都还在刚起步学习的阶段,这几天开发任务比较轻,就在自己window系统下,模拟部署远程服务器,利用Jenkies + Ant + Tomcat 搭建了一个自动发布部署的环境 ...