文档章节

学习模拟Spring(二)

noteman
 noteman
发布于 2017/05/14 12:16
字数 482
阅读 23
收藏 0
点赞 0
评论 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
粉丝 13
博文 214
码字总数 41351
作品 0
六安
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow ⋅ 05/28 ⋅ 0

Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

一、单元测试的目的   简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作。以减少我们在...

文文1 ⋅ 06/01 ⋅ 0

第一个Spring Boot应用

在JavaEE的领域,Spring可以说是占据了半壁江山。但Spring各种复杂的XML配置一直被开发者诟病。 Pivotal在2014年4月发布了SpringBoot的1.0版,到现在已经有3个年头了。其实也不是新东西了。 ...

虾游于海 ⋅ 2017/01/23 ⋅ 0

m.toutiao.im/whatsmars

whatsmars $ Java生态研究(Spring Boot + Redis + Dubbo + RocketMQ) Spring Boot 系列(Servlet, Tomcat, Spring, SpringMVC, Spring Boot) Modules intro Module Intro whatsmars-common m......

m.toutiao.im ⋅ 2017/12/25 ⋅ 0

第五十章:SpringBoot2.0新特性 - 岂止至今最简单redis缓存集成

自从升级到了版本后集成作为缓存就更为简单了,我们只需要配置相关的链接信息以及使用注解开启缓存,这样我们就直接可以在项目内使用缓存相关的内容。 由于最近这段时间一直在研发公司的持久...

恒宇少年 ⋅ 04/15 ⋅ 0

spring boot 2.0 源码分析(二)

在上一章学习了spring boot 2.0启动的大概流程以后,今天我们来深挖一下SpringApplication实例变量的run函数。 先把这段run函数的代码贴出来:

java高级架构牛人 ⋅ 06/05 ⋅ 0

SpringBoot详解(一)-快速入门

SpringBoot详解系列文章: SpringBoot详解(一)-快速入门 SpringBoot详解(二)-Spring Boot的核心 SpringBoot详解(三)-Spring Boot的web开发 SpringBoot详解(四)-优雅地处理日志 一、S...

CSDN_LQR ⋅ 2017/08/30 ⋅ 0

SpringBoot整合ElasticSearch及源码

一 Springboot 与检索 xhesrc="https://img-blog.csdn.net/20180619233907666?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4OTc0NjM0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA......

刘信坚 ⋅ 06/20 ⋅ 0

微服务架构 spring boot 那些最基础的知识点

一、创建SpringBoot项目 概念 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再...

烂猪皮 ⋅ 05/09 ⋅ 0

spring梳理(二) 基于注解的方式注册bean

我们知道,如果想要将bean交由spring容器管理,就需要首先将bean注册在spring容器中,而bean可以通过xml或者注解的方式进行注册,基于xml的配置一般是通过、等xml标签进行配置,然后由sprin...

wyn_lin ⋅ 05/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 22分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 23分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 34分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 36分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 38分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 40分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部