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天前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
16 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
1月前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
1月前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
1月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
145 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
18天前
|
设计模式 Java 测试技术
spring复习04,静态代理动态代理,AOP
这篇文章讲解了Java代理模式的相关知识,包括静态代理和动态代理(JDK动态代理和CGLIB),以及AOP(面向切面编程)的概念和在Spring框架中的应用。文章还提供了详细的示例代码,演示了如何使用Spring AOP进行方法增强和代理对象的创建。
spring复习04,静态代理动态代理,AOP
|
1天前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
16 3
|
1天前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
14 2
|
2天前
|
人工智能 缓存 Java
深入解析Spring AI框架:在Java应用中实现智能化交互的关键
【10月更文挑战第12天】Spring AI 是 Spring 框架家族的新成员,旨在满足 Java 应用程序对人工智能集成的需求。它支持自然语言处理、图像识别等多种 AI 技术,并提供与云服务(如 OpenAI、Azure Cognitive Services)及本地模型的无缝集成。通过简单的配置和编码,开发者可轻松实现 AI 功能,同时应对模型切换、数据安全及性能优化等挑战。
|
9天前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
45 9
|
21天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
864 9