56_实现类似spring的可配置的AOP框架
》 config.properties 配置文件 key=类名
》 BeanFactory Bean工厂,负责得到bean getBean(“xxx”)
》ProxyBeanFactory 产生代理的工厂 getProxy(Object target,Advice advice);
》AopFrameworkTest 测试类
思路:
getBean(”xxx”)
xxx=ProxyBeanFactory 时,返回代理类对象
xxx=其他类时,直接返回该类对象
- config.properties
#xxx=java.util.ArrayList
xxx=com.itcast.day3.aopframework.ProxyBeanFactory
xxx.advice=com.itcast.day3.MyAdvice
xxx.target=java.util.ArrayList
- BeanFactory
package com.itcast.day3.aopframework; import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; import com.itcast.day3.Advice; public class BeanFactory {
private Properties props=new Properties(); public BeanFactory(InputStream ips){
try {
props.load(ips);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //bean工厂
public Object getBean(String name){
Object bean=null;
try {
bean=Class.forName(props.getProperty(name)).newInstance();
if(bean instanceof ProxyBeanFactory){
Object proxy=null;
ProxyBeanFactory proxyFactoryBean=(ProxyBeanFactory)bean;
Advice advice = (Advice)Class.forName(props.getProperty(name+".advice")).newInstance();
Object target = Class.forName(props.getProperty(name+".target").newInstance());
proxyFactoryBean.setAdvice(advice);
proxyFactoryBean.setTarget(target);
proxy=proxyFactoryBean.getProxy();
return proxy;
}
} catch (Exception e) {
e.printStackTrace();
}
return bean;
} }
- ProxyBeanFactory
package com.itcast.day3.aopframework; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import com.itcast.day3.Advice; public class ProxyBeanFactory {
private Advice advice;//系统功能的封装,一般都有一个接口
private Object target;//目标类
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;
}
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 reVal=method.invoke(target, args);//反射方式调用目标类的方法
advice.afterMethod(method);
return reVal;
}
}
);
return proxy;
} }
- AopFrameworkTest
package com.itcast.day3.aopframework; import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection; public class AopFrameworkTest {
public static void main(String[] args) throws Exception {
InputStream ips=AopFrameworkTest.class.getResourceAsStream("config.properties");
Object bean=new BeanFactory(ips).getBean("xxx"); if(bean instanceof ArrayList){
Collection collection=((Collection)bean);
collection.add("123");
for(Object obj:collection){
System.out.println(obj);
}
}else{
System.out.println("返回的是代理类: "+bean.getClass().getName()+" 的实例");
((Collection)bean).clear();
} }
}
56_实现类似spring的可配置的AOP框架的更多相关文章
- JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架
1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...
- java 实现类似spring的可配置的AOP框架
一.工厂类BeanFactory: 1.工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换. 2.getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符 ...
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Jav ...
- java框架之Spring(2)-注解配置IOC&AOP配置
注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...
- Spring学习记录(十二)---AOP理解和基于注解配置
Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...
- Spring 5| 轻量级的开源JavaEE框架
一.Spring框架的概述 1.Spring是轻量级的开源的JavaEE框架 2.Spring可以解决企业应用开发的复杂性 3.Spring有两个核心的部分:IOC(控制反转)和AOP(面向切面编程) ...
- Spring学习(八)AOP详解
文章更新时间:2020/04/06 一.一个例子 在上面的例子中,包租婆的核心业务就是签合同,收房租,那么这就够了,灰色框起来的部分都是重复且边缘的事,交给中介商就好了,这就是 AOP 的一个思想:让 ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)
你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...
- SPRING SECURITY JAVA配置:Web Security
在前一篇,我已经介绍了Spring Security Java配置,也概括的介绍了一下这个项目方方面面.在这篇文章中,我们来看一看一个简单的基于web security配置的例子.之后我们再来作更多的 ...
随机推荐
- Solr 清空数据的简便方法
1. 首先访问你的 core,然后点击左侧的 Documents 2. 在 documents type 选择 XML 3. documents 输入下面语句 <delete><qu ...
- Linux的IO模型
在输入输出系统一文中介绍了系统内核操作IO设备的机制. 我们了解到内核可以直接访问IO设备, 用户进程无法IO设备. 就是说IO操作需要分为两个过程, 内核从IO设备读取数据保存到内核空间, 将数据由 ...
- 为PartialView传递一个参数
看这篇之前,得先了解这个<在MVC应用程序中动态加载PartialView>http://www.cnblogs.com/insus/p/3547985.html. 因为是从这篇重构而来. ...
- 如何解决WEB应用中文乱码问题
最容易出现乱码的场景是浏览器向服务器发送请求的过程,解决的策略就是强制为请求和响应设置编码格式. 一.POST 方式请求乱码 1. 在每个 Controller 中单独处理 request.setCh ...
- java工具类-接受请求参数,并利用反射调用方法
public String a(HttpServletRequest request,HttpServletResponse response) throws JSONException, IOExc ...
- IIS进程回收后第一次访问慢的问题
IIS 有一种机制,默认会在IIS空闲一定时间段后,将应用程序池进行回收,这个时间段在IIS6中默认是20分钟,在IIS7中默认是1740分钟.两个配置都不合理,都会导致当应用程序池被回收后,第一次访 ...
- SpingBoot —— 多线程
Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.而实际开发中任务一般是非 ...
- Python 进阶必备函数
1. lambda 表达式 匿名函数(英语:anonymous function)是指一类无需定义标识符(函数名)的函数.通俗来说呢,就是它可以让我们的函数,可以不需要函数名. 正常情况下,我们定义一 ...
- Js利用Canvas实现图片压缩
最近做的APP项目涉及到手机拍照上传图片,因为手机拍照的图片通常都比较大,所以上传的时候就会很慢.为此,需要对图片进行压缩处理来优化上传功能.以下是具体实现: /* * 图片压缩 * img 原始图片 ...
- Flutter——设置appBar的高度
使用脚手架Scaffold可以设置AppBar,想要设置高度,在AppBar外包一层PreferredSize,设置preferredSize的属性为想要的高度即可. Scaffold( appBar ...