文档章节

学习模拟Spring(二)

noteman
 noteman
发布于 2017/05/14 12:16
字数 482
阅读 23
收藏 0

                                   简单模拟实现 spring aop 功能

参考作品

1.接口

public interface Advice {

	void beforeMethod(Method method);

	void afterMethod(Method method);

}

2:bean容器

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BeanFactory {
	
	 /**
	  * 配置文件属性参数
	  * */
	 Properties props = new Properties();
	 
	 public BeanFactory(InputStream ips){
	        try {
	            props.load(ips);//读入配置文件
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }
	 
	 public Object getBean(String key){
	        //这个方法的用途是:获得一个key所指的类对象,
	        //如果这个类是ProxyFactoryBean类的,即代理类,则创建代理对象并返回
	        //如果不是则直接调用不带参数的构造方法创建对象返回
	        String clazzname = props.getProperty(key);
	        Object bean = null;
	        try {
	            Class<?> clazz = Class.forName(clazzname);
	            bean = clazz.newInstance();//对于javabean必须有不带参数的构造方法
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        if(bean instanceof ProxyFactoryBean)
	        {
	            //转换成ProxyFactoryBean对象,方便使用getProxy方法和set方法
	            ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;
	            Object proxy = null;
	            try {
	                //取得所想建立的对象目标和Advice类
	                Object target = Class.forName(props.getProperty(key+".target")).newInstance();
	                Advice ad = (Advice)Class.forName(props.getProperty(key+".advice")).newInstance();
	                proxyFactoryBean.setTarget(target);
	                proxyFactoryBean.setAd(ad);

	                proxy = proxyFactoryBean.getProxy();
	            } catch (Exception ex) {
	                ex.printStackTrace();
	            }   
	            return proxy;
	        }
	        return bean;
	    }
}

 

3:代理处理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactoryBean {

	private Object target;
	private Advice ad;

	public Object getProxy() {
		// 利用Proxy类的静态方法newProxyInstance创建代理对象
		Object proxyobj = Proxy.newProxyInstance(
				target.getClass().getClassLoader(), 
				target.getClass().getInterfaces(),
				new InvocationHandler() {
					@Override
					public Object invoke(
							Object proxy, 
							Method method,
							Object[] args) throws Throwable {
						ad.beforeMethod(method);
						Object obj = method.invoke(target, args);
						ad.afterMethod(method);
						return obj;
					}
				});
		return proxyobj;
	}

	public Object getTarget() {
		return target;
	}

	public void setTarget(Object target) {
		this.target = target;
	}

	public Advice getAd() {
		return ad;
	}

	public void setAd(Advice ad) {
		this.ad = ad;
	}
}

 

4:代理接口实现

import java.lang.reflect.Method;

public class MyAdvice implements Advice {

	@Override
	public void afterMethod(Method method) {
		System.out.println(method.getName() + "_start");
	}

	@Override
	public void beforeMethod(Method method) {
		System.out.println(method.getName() + "_end");
	}

}

 

5:配置文件config.properties



#bean=java.util.ArrayList
bean=com.step.base.aop.ProxyFactoryBean
bean.target=java.util.ArrayList
bean.advice=com.step.base.aop.MyAdvice

 

6:测试:

import java.io.InputStream;
import java.util.Collection;

import org.junit.Test;

public class AopTest {
	
	String path = "/com/step/base/aop/config.properties";
	
	@Test
	public void test() {
		InputStream ips = 
				AopTest.class.getResourceAsStream(path);
		
		if (null != ips) {
			// 创建工厂
			BeanFactory beanFactory = new BeanFactory(ips);
			// 获取对象并打印对应字节码名字
			Object bean = beanFactory.getBean("bean");
			System.out.println(bean.getClass().getName());
			// 下面语句可以测试Advice类是否有效
			((Collection<?>)bean).clear();
		}
	}
	
}

 

7:结果

com.sun.proxy.$Proxy2
clear_end
clear_start

 

 

本文转载自:

共有 人打赏支持
noteman
粉丝 15
博文 235
码字总数 44885
作品 0
六安
Spring Boot学习笔记

文件上传与下载 springboot 上传文件到服务器 Spring Boot2.0连载(33)-- Spring Boot文件上传下载 SpringBoot项目的The temporary upload location ***is not valid 问题 /tmp/tomcat.8483...

OSC_fly
07/26
0
0
Spring Boot学习资源

Spring Boot 入门 http://blog.csdn.net/isea533/article/details/50278205 ---------------------------------------------------------- Spring Boot 静态资源处理 http://blog.csdn.net/c......

IamOkay
2017/02/17
0
0
spring boot框架学习4-spring boot核心(3)

本节主要: 1:spring boot 为我们提供的 starter pom 都有哪些 2:怎么添加xml配置文件 3:日志相关 本文是《凯哥陪你学系列-框架学习之spring boot框架学习》中第四篇 spring boot框架学习...

凯哥java
2017/10/31
0
0
spring cloud 入门系列:总结

从我第一次接触Spring Cloud到现在已经有3个多月了,当时是在博客园里面注册了账号,并且看到很多文章都在谈论微服务,因此我就去了解了下,最终决定开始学习Spring Cloud。我在一款阅读App...

JAVA开发老菜鸟
07/20
0
0
spring boot框架学习6-spring boot的web开发(2)

本章节主要内容: 通过前面的学习,我们了解并快速完成了spring boot第一个应用。spring boot企业级框架,那么spring boot怎么读取静态资源?如js文件夹,css文件以及png/jpg图片呢?怎么自定...

凯哥java
2017/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

[Python进阶] Python命令行参数

Python 获得命令行参数的方法 需要模块:sys 参数个数:len(sys.argv) 脚本名: sys.argv[0] 参数1: sys.argv[1] 参数2: sys.argv[2] 解析命令行参数 Python提供了一个getopt模块,可用于解...

Eappo_Geng
5分钟前
0
0
add docker api url to jenkins

add docker api url to jenkins add jenkins to dockergroup gpasswd -a $USER docker gpasswd -a jenkins docker https://stackoverflow.com/questions/37178824/how-do-i-find-the-docker-......

kewei_zhang
9分钟前
0
0
Scala入门篇

1、定义变量 var 可变 val 不可变,相当于Java中的final Unit相当于Java中的void,以()表示 scala> val a = println("ddd") ddd a: Unit = () 2,声明数组 scala> val arr = Array(1,2,3,4,5) ......

算法之名
10分钟前
4
0
利用redis统计分布式集群中接口缓存命中情况

接口使用了缓存,想看看缓存命中率,到底提升了多少了?固想到做个统计方法,单机情况下使用 AtomicImteger,考虑到分布式集群中多台服务器调用,所以考虑使用redis进行统计 原来的想法很简单用分布...

计算机的小二青年
10分钟前
0
0
前端加密JS库--CryptoJS 使用指南

有时候项目涉及到的敏感数据比较多,为了信息安全,我们常常需要对一些数据进行接口加密处理,如编码、将明文转化为暗文、加密比对、AES + BASE64 算法加密等。 Base64 编码 为什么要编...

舒龙虎
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部