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

一、重点知识点

1、工厂类BeanFactory负责创建目标类或者是代理类的实例对象,并通过配置文件实现切换,其getBean()方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该实例对象的getProxy()方法返回的对象

2、BeanFactory的构造方法接收代表配置文件的输入流

3、ProxyFactoryBean充当封装生成动态代理的工厂,需要为工厂类提供目标、通知等参数信息

4、编写测试类进行测试

二、代码实现

整体代码结构:

代码实现:

1、通知接口以及实现类

 package com.ssc.proxy;

 import java.lang.reflect.Method;

 public interface Advice {

     void beforeMethod(Method method);
void afterMethod(Method method); } --------------------------------------------------------------------------- package com.ssc.proxy; import java.lang.reflect.Method; public class MyAdvice implements Advice { long beginTime = 0;
long endTime = 0; @Override
public void beforeMethod(Method method) {
System.out.println("Advice中的方法开始执行了。。。");
beginTime = System.currentTimeMillis();
} @Override
public void afterMethod(Method method) {
endTime = System.currentTimeMillis();
System.out.println(method.getName() + "running time:" + (endTime - beginTime));
System.out.println("Advice中的方法结束执行了。。。");
} }

2、BeanFactory实现

 package com.ssc.aopframework;

 import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; import com.ssc.proxy.Advice; public class BeanFactory { Properties props = new Properties(); public BeanFactory(InputStream ips){
try {
props.load(ips);
} catch (IOException e) {
e.printStackTrace();
}
} public Object getBean(String name){
String className = props.getProperty(name);
Object bean = null;
try {
Class clazz = Class.forName(className);
bean = clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
if(bean instanceof ProxyFactoryBean){
Object proxy = null;
ProxyFactoryBean proxyBeanFactory = (ProxyFactoryBean) bean;
try {
// 从配置文件中读取类名,通过反射创建对象参数
Advice advice = (Advice) Class.forName(props.getProperty(name + ".advice")).newInstance();
Object target = Class.forName(props.getProperty(name + ".target")).newInstance();
// 初始化通知以及目标参数
proxyBeanFactory.setAdvice(advice);
proxyBeanFactory.setTarget(target);
proxy = proxyBeanFactory.getProxy();
return proxy;
} catch (Exception e) {
e.printStackTrace();
}
}
return bean;
}
}

3、ProxyFactoryBean 实现

 package com.ssc.aopframework;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import com.ssc.proxy.Advice; public class ProxyFactoryBean { private Advice advice; private Object target; 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 { // 这里就是Collection类或者是子类中的方法执行 也就是调用了add()方法 同时我还做了一些其他事情。计算程序运行时间
advice.beforeMethod(method);
Object retVal = method.invoke(target, args);
advice.afterMethod(method); return retVal;
}
});
return proxy;
} public Advice getAdvice() {
return advice;
} public void setAdvice(Advice advice) {
this.advice = advice;
} public Object getTarget() {
return target;
} public void setTarget(Object target) {
this.target = target;
} }

4、配置文件实现(纯粹瞎写的配置文件)

 #xxx=java.util.ArrayList
xxx=com.ssc.aopframework.ProxyFactoryBean
xxx.advice=com.ssc.proxy.MyAdvice
xxx.target=java.util.ArrayList

5、测试类实现

 package com.ssc.aopframework;

 import java.io.InputStream;

 public class AopFrameworkTest {

     public static void main(String[] args) {
InputStream ips = AopFrameworkTest.class.getResourceAsStream("config.properties");
Object bean = new BeanFactory(ips).getBean("xxx");
System.out.println(bean.getClass().getName());
}
}

实现类似AOP的封装和配置的更多相关文章

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

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

  2. spring框架中AOP思想与各种配置详解

    Spring中提供两种AOP支持:   1.基于代理的经典AOP   2.Aspectj注解配置AOP    首先我们先了解什么是AOP,AOP(Aspect Oriented Programming ...

  3. ajax实现注册用户名时动态显示用户名是否已经被注册(1、ajax可以实现我们常见的注册用户名动态判断)(2、jquery里面的ajax也是类似我们这样封装了的函数)

    ajax实现注册用户名时动态显示用户名是否已经被注册(1.ajax可以实现我们常见的注册用户名动态判断)(2.jquery里面的ajax也是类似我们这样封装了的函数) 一.总结 1.ajax可以实现我 ...

  4. Spring AOP源码分析(二):AOP的三种配置方式与内部解析实现

    AOP配置 在应用代码中,可以通过在spring的XML配置文件applicationContext.xml或者基于注解方式来配置AOP.AOP配置的核心元素为:pointcut,advisor,as ...

  5. Vue 2.x折腾记 - (17) 基于Ant Design Vue 封装一个配置式的表单组件

    前言 写了个类似上篇搜索的封装,但是要考虑的东西更多. 具体业务比展示的代码要复杂,篇幅太长就不引入了. 效果图 2019-04-25 添加了下拉多选的渲染,并搜索默认过滤文本而非值 简化了渲染的子组 ...

  6. Spring学习4-面向切面(AOP)之schema配置方式

    一.通过Scheme配置实现AOP步骤(Spring AOP环境的环境与上篇博文 Spring接口方式相同)    步骤一.编写业务类: public class AspectBusiness {   ...

  7. Spring Aop实例之xml配置

    AOP的配置方式有2种方式:xml配置和AspectJ注解方式.今天我们就来实践一下xml配置方式. 我采用的jdk代理,所以首先将接口和实现类代码附上 package com.tgb.aop; pu ...

  8. 【Spring五】AOP之使用注解配置

    AOP使用注解配置流程: 1.当spring容器启动时候.    < context:component- scan base-package= "cn.itheima03.sprin ...

  9. 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置

    在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...

随机推荐

  1. JS鼠标响应事件经过、移动、点击示例介绍

    原文: http://www.jb51.net/article/41124.htm onMouseDown 按下鼠标时触发 onMouseOver 鼠标经过时触发 onMouseUp 按下鼠标松开鼠标 ...

  2. CodeForces 644B【模拟】

    题意: 查询数 和 最大的队列容量+1: 按时间顺序 ti代表,第i个出线的时间: di代表,第i个需要处理的时间: 对于第i个输出他所需要的时间完成,或者拒绝进入输出-1: 思路: 真是MDZZ了, ...

  3. Unity开发MMOARPG游戏解决方案

    http://www.csdn.net/article/2015-05-07/2824634 天神互动是一家已经上市的以研发MMOARPG游戏为主的技术公司,<苍穹变>是天神互动研发的第一 ...

  4. iOS 7 隐藏特性

    当 iOS7 刚发布的时候,全世界的苹果开发人员都立马尝试着去编译他们的app,接着再花上数月的时间来修复任何出现的故障,甚至重做app.这样的结果,使得人们根本无暇去探究 iOS7 所带来的新东西. ...

  5. VRTK3.3.0-001头盔相机

    VRTK3.3.0下载地址:https://github.com/ExtendRealityLtd/VRTK/tree/3.3.0 SteamVR1.2.3下载地址:https://github.co ...

  6. 买票案例 1.synchronize关键字 2.lock锁

  7. python selenium模块调用浏览器的时候出错

    python selenium模块使用出错,这个怎么改 因为不同版本更新不同步问题,浏览器都要另外下一个驱动.

  8. DRF教程4-视图集和路由类

    rest框架包括一个处理viewset的抽象,允许开发人员集中精力处理api交互和建模,url构造都根据常见方式自动处理. ViewSet类 几乎和VIew类一样,不过它提供read,update这样 ...

  9. .net 键盘

    private void txtGoodsGroup_KeyPress(object sender, KeyPressEventArgs e) { base.OnKeyPress(e); if ((i ...

  10. Spring AOP初步总结(一)

    学习AOP有段时间了,一直没空总结一下,导致有些知识点都遗忘了,之后会把以前学过的Spring核心相关的知识点总结一轮... 先大体介绍下Spring AOP的特点(均摘自"Spring i ...