56_实现类似spring的可配置的AOP框架

简介: 》 config.properties  配置文件   key=类名 》 BeanFactory  Bean工厂,负责得到bean  getBean(“xxx”) 》ProxyBeanFactory 产生代理的工厂  getProxy(Object target,Advice advice); ...

》 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();
        }

    }
}
开始做,坚持做,重复做
相关文章
|
5天前
|
运维 Java 程序员
Spring5深入浅出篇:基于注解实现的AOP
# Spring5 AOP 深入理解:注解实现 本文介绍了基于注解的AOP编程步骤,包括原始对象、额外功能、切点和组装切面。步骤1-3旨在构建切面,与传统AOP相似。示例代码展示了如何使用`@Around`定义切面和执行逻辑。配置中,通过`@Aspect`和`@Around`注解定义切点,并在Spring配置中启用AOP自动代理。 进一步讨论了切点复用,避免重复代码以提高代码维护性。通过`@Pointcut`定义通用切点表达式,然后在多个通知中引用。此外,解释了AOP底层实现的两种动态代理方式:JDK动态代理和Cglib字节码增强,默认使用JDK,可通过配置切换到Cglib
|
11天前
|
安全 Java 开发者
如何在Spring框架中实现横切关注点的集中管理和重用?
【4月更文挑战第30天】如何在Spring框架中实现横切关注点的集中管理和重用?
17 0
|
21小时前
|
XML Java 数据库连接
Spring框架与Spring Boot的区别和联系
Spring框架与Spring Boot的区别和联系
8 0
|
1天前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
8 1
|
2天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
5 0
|
2天前
|
设计模式 数据采集 监控
Spring日志框架
Spring日志框架
6 0
|
2天前
|
Java Spring
Spring文件配置以及获取
Spring文件配置以及获取
10 0
|
2天前
|
前端开发 Java 应用服务中间件
Spring MVC框架概述
Spring MVC 是一个基于Java的轻量级Web框架,采用MVC设计模型实现请求驱动的松耦合应用开发。框架包括DispatcherServlet、HandlerMapping、Handler、HandlerAdapter、ViewResolver核心组件。DispatcherServlet协调这些组件处理HTTP请求和响应,Controller处理业务逻辑,Model封装数据,View负责渲染。通过注解@Controller、@RequestMapping等简化开发,支持RESTful请求。Spring MVC具有清晰的角色分配、Spring框架集成、多种视图技术支持以及异常处理等优点。
11 1
|
5天前
|
XML Java 数据格式
Spring使用AOP 的其他方式
Spring使用AOP 的其他方式
14 2
|
5天前
|
XML Java 数据格式
Spring 项目如何使用AOP
Spring 项目如何使用AOP
19 2