文档章节

学习模拟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
粉丝 14
博文 233
码字总数 44869
作品 0
六安
私信 提问
Java程序员从笨鸟到菜鸟之(六十八)细谈Spring(二)自己动手模拟spring

在我们学习spring之前,根据spring的特性,我们来自己来模拟一个spring出来,也就是说不利用spring来实现spring的效果。本实例主要是实现spring的IOC功能。 点击下载源码:用力点 首先我们把...

长平狐
2012/11/12
131
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 Cloud教学视频

大家好,我是《疯狂Spring Cloud微服务架构实战》一书的作者杨恩雄,该书的配套教学视频已经录制完成,目的是为了让更多的朋友能轻松地学习Spring Cloud。本书与配套视频,适合Spring Cloud的...

杨大仙的程序空间
2017/10/18
0
24

没有更多内容

加载失败,请刷新页面

加载更多

esxi 更换ssl证书

概述 就是想换一个证书而已,你可以通过下面的途径去申请一个泛解析域名的证书之后再esxi上安装上 使用阿里云域名api申请Let’s Encrypt泛域名免费ssl证书 申请完成证书之后进行下一步 操作 ...

bboysoulcn
15分钟前
0
0
PLC编程入门:梯形图

梯形图(LAD)是PLC编程的最佳可视化语言,它看起来非常类似于继电器电路图,因此如果 你对继电器控制和电子电路有所了解的话,那么学起来会非常容易! 在这个教程中,我们将学习关于使用梯形...

汇智网教程
18分钟前
0
0
Kubernetes 1.13.0的快速升级

Kubernetes 1.13.0已经正式发布,快速升级(含国内镜像快速下载链接)包括升级kubeadm/kubectl/kubelet版本、拉取镜像、升级Kubernetes集群三个主要步骤。注意Kubernetes 1.13.0版本暂时不支...

openthings
31分钟前
2
0
go的卸载和环境变量配个人.bashrc

若是用安装包直接解压 http://download.csdn.net/detail/u010026901/7592581 cd /usr/local tar -zxvf go1.1.2.linux-386.tar.gz(先把安装包移到这个目录) 3.安装 $ cd go/src,$ ./all.b......

dragon_tech
37分钟前
1
0
区块链安全 - 以太坊短地址攻击

1 基础知识 EVM虚拟机在解析合约的字节码时,依赖的是ABI的定义,从而去识别各个字段位于字节码的什么地方。关于ABI,可以阅读这个文档: https://github.com/ethereum/wiki/wiki/Ethereum-C...

HiBlock
47分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部