package com.opensymphony.xwork2.inject; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Proxy; import java.util.List; import java.util.ArrayList; /** * Context of a dependency construction. Used to manage circular references. * * @author crazybob@google.com (Bob Lee) */ class ConstructionContext<T> { T currentReference; boolean constructing; List<DelegatingInvocationHandler<T>> invocationHandlers; T getCurrentReference() { return currentReference; } void removeCurrentReference() { this.currentReference = null; } void setCurrentReference(T currentReference) { this.currentReference = currentReference; } boolean isConstructing() { return constructing; } void startConstruction() { this.constructing = true; } void finishConstruction() { this.constructing = false; invocationHandlers = null; } //此处应该是该方法的核心 // Object createProxy(Class<? super T> expectedType) { // TODO: if I create a proxy which implements all the interfaces of // the implementation type, I'll be able to get away with one proxy // instance (as opposed to one per caller). if (!expectedType.isInterface()) { throw new DependencyException( expectedType.getName() + " is not an interface."); } if (invocationHandlers == null) { invocationHandlers = new ArrayList<DelegatingInvocationHandler<T>>(); } DelegatingInvocationHandler<T> invocationHandler = new DelegatingInvocationHandler<T>(); invocationHandlers.add(invocationHandler); return Proxy.newProxyInstance( expectedType.getClassLoader(), // 加载接口的类加载器 new Class[] { expectedType }, // 接口集合 invocationHandler // handler处理类 ); } // 注意此处调用方法 中的参数 和值 认真看看希望能看出端倪来。此处很妙 void setProxyDelegates(T delegate) { if (invocationHandlers != null) { for (DelegatingInvocationHandler<T> invocationHandler : invocationHandlers) { invocationHandler.setDelegate(delegate); } } } // 内部静态类 static class DelegatingInvocationHandler<T> implements InvocationHandler { T delegate; public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (delegate == null) { throw new IllegalStateException( "Not finished constructing. Please don't call methods on this" + " object until the caller's construction is complete."); } try { // method.invoke 中的参数 代理类 和要传入的参数 return method.invoke(delegate, args); //method方法应该是delegate接口中的 } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw e.getTargetException(); } } // 此处为何留一个接口方法呢? void setDelegate(T delegate) { this.delegate = delegate; } } }
相关推荐
Struts拦截器是Java Web开发框架Struts2中的核心组件之一,它允许开发者在Action执行前后插入自定义的处理逻辑,实现AOP(面向切面编程)的理念。动态代理则是Java提供的一种机制,允许在运行时创建接口的实现类实例...
在这个实例中,我们可能会看到Spring如何配置并管理Struts2中的bean,以及如何处理业务逻辑。 Velocity是Apache软件基金会的一个开源项目,它是一个模板引擎,专注于视图层的渲染。Velocity允许开发者使用简单的...
总结来说,这个实例提供了一个在旧版JDK环境下使用Struts2和Spring构建Web应用的例子,通过它你可以了解到如何在早期的Java环境中实现MVC架构,以及如何利用Spring进行依赖管理和测试。同时,这也是一个很好的历史...
按照Struts1.x的程序开发步骤,我们可以逐一对应到Struts2中: 1. **安装Struts2:** - 不同于Struts1的Servlet配置,Struts2需要配置Filter。在`web.xml`中添加Struts2的Filter配置,如: ```xml ...
Struts2 提供的 OGNL(Object-Graph Navigation Language)表达式语言可以方便地在 JSP 页面中访问 Action 中的属性和方法。 8. **控制器层**: Struts2 的核心是 Action 类,它们接收请求,执行业务逻辑,然后将...
在本文中,我们将详细介绍 Struts2、Spring 和 Hibernate 三种流行框架的整合应用,并通过实例来展示如何使用这些框架来实现 CRUD 操作。 Struts2 概述 Struts2 是一个基于 MVC 模式的 Web 框架,自推出以来受到...
Struts2和MyBatis是Java Web开发中常用的两个框架,它们分别负责MVC模式中的控制层和数据访问层。本实例将引导你入门这两个框架的整合使用。 **Struts2** 是一个强大的MVC框架,它继承了Struts1的优点,并引入了更...
Struts2和Hibernate是两个非常重要的Java开源框架,它们在企业级Web开发中扮演着核心角色。本压缩包“tom9 jdk10环境下struts2+hibernate3.6.10jar包.zip”提供了在Tomcat9服务器和JDK10环境下运行Struts2与...
下面是我用Struts2做的一个分页显示实例,基本的思路是:把数据库表中的每一行数据封装成一个对象,用一个返回类型为List的方法返回这些对象,接着在Struts2的action里面定义一个List属性,用这个List来接收从数据库...
在"struts2 tiles实例 eclipse下运行"这个项目中,我们将深入理解如何在Eclipse开发环境中配置和运行一个基于Struts2和Tiles的Web应用。首先,确保你已经安装了Eclipse IDE,并且配置好了JDK以及Tomcat服务器。接着...
1. **Action类**:在Struts2中,业务逻辑通常封装在Action类中。Action类是一个Java类,它定义了处理用户请求的方法。在“Hello World”实例中,你会找到一个名为`HelloWorldAction`的类,其中包含了一个简单的执行...
### Struts2、Spring和Hibernate应用实例 #### 一、简介与背景 随着Java技术的发展,Web应用程序变得越来越复杂,为了提高开发效率和维护性,出现了多种轻量级的Java Web框架,其中最为著名的三个框架分别是Struts...
Struts2.3框架是Java Web开发中常用的一个开源MVC框架,它的出现极大地简化了基于JSP和Servlet的应用程序构建。本实例旨在为初学者提供一个基础的入门指南,帮助理解Struts2.3的核心概念和使用方法。 首先,让我们...
在Struts1.x中,ActionServlet是入口点,而在Struts2中,入口点变成了一个Filter,即`FilterDispatcher`,需要在`web.xml`中配置。 创建基于Struts2的Web程序通常包括以下步骤: 1. **配置Struts2 Filter** - 在`...
Struts2是一个流行的MVC框架,通过集成IOC框架,如Spring,可以方便地管理Struts2中的动作类(Action)和业务服务层(Service)。 在学习和应用IOC框架,尤其是通过动态代理实现时,我们需要了解以下知识点: 1. ...
在实际开发中,Struts2还提供了丰富的功能,如国际化、数据校验、文件上传、动态方法调用等。通过扩展配置和自定义拦截器,你可以构建出更加复杂和灵活的应用系统。学习和掌握Struts2将有助于提升你的Java Web开发...