`
seadragonnj
  • 浏览: 59464 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入研究xwork(二)

阅读更多
下面说一下create(..)方法干些什么东东(我说的create(..)是这个哦new ContainerBuilder().factory(IPerson.class,Person.class).factory(IUserPerson.class,UserPerson.class).create(true))
java 代码
  1. final ContainerImpl container = new ContainerImpl(
  2. new HashMap<key>, InternalFactory>(factories)); </key>
  3. if (loadSingletons) {
  4. container.callInContext(new ContainerImpl.ContextualCallable<void>() { </void>
  5. public Void call(InternalContext context) {
  6. for (InternalFactory factory : singletonFactories) {
  7. factory.create(context);
  8. }
  9. return null;
  10. }
  11. });
  12. }
首先它创建一个ContainerImpl对象,这个对象的创建过程会做很多很多的事情,一些需要依赖注入的东西会在这里完成还是前面说的,它并没有完成真正的依赖注入(对象都没有创建当然没法注入了),它只是完成依赖注入所需要的一些信息,当然它不只完成这些,我现在还有点迷糊,等过两天再好好整理这一块!!
java 代码
  1. container.injectStatics(staticInjections);
这段代码是进行static field 和static method的注入,众所周知static是和对象无关的,所以可以在没有实例化对象前进行注入

java 代码
  1. IUserPerson person=container.getInstance(IUserPerson.class);
这行代码就是实例化一个对象,这个过程会完成所有的真的依赖注入工作

  1. container.getInstance(..)
这个方法中会调用如下一段代码
  1. ExternalContext previous = context.getExternalContext();
  2. Key<t> key = Key.newInstance(type, name); </t>
  3. context.setExternalContext(ExternalContext.newInstance(null, key, this));
  4. try {
  5. InternalFactory o = getFactory(key);
  6. if (o != null) {
  7. return getFactory(key).create(context);
  8. } else {
  9. return null;
  10. }
  11. } finally {
  12. context.setExternalContext(previous);
  13. }
在这里通过Key.newInstance(type, name);创建一个Key,这个Key的type和name和调用factory(..)时放到factories中的Key相对应,所以通过InternalFactory o = getFactory(key);这个方法就能得到前面在factory(..)中创建的InternalFactory对象,进而可以调用它的create(..)方法(个人觉得这个设计的很精妙!),我们再来重新看一下这个方法的实现
  1. public T create(InternalContext context) {  
  2.   if (constructor == null) {  
  3.     this.constructor =  
  4.         context.getContainerImpl().getConstructor(implementation);  
  5.   }  
  6.   return (T) constructor.construct(context, type);  
  7. }  
这段代码通过调用
constructor.construct(context, type);来创建一个对象,并进行依赖注入,
 
  1. Object construct(InternalContext context, Class<? super T> expectedType) {  
  2.    ConstructionContext<T> constructionContext =  
  3.        context.getConstructionContext(this);  
  4.   
  5.    // We have a circular reference between constructors. Return a proxy.  
  6.    if (constructionContext.isConstructing()) {  
  7.      // TODO (crazybob): if we can't proxy this object, can we proxy the  
  8.      // other object?  
  9.      return constructionContext.createProxy(expectedType);  
  10.    }  
  11.   
  12.    // If we're re-entering this factory while injecting fields or methods,  
  13.    // return the same instance. This prevents infinite loops.  
  14.    T t = constructionContext.getCurrentReference();  
  15.    if (t != null) {  
  16.      return t;  
  17.    }  
  18.   
  19.    try {  
  20.      // First time through...  
  21.      constructionContext.startConstruction();  
  22.      try {  
  23.        Object[] parameters =  
  24.            getParameters(constructor, context, parameterInjectors);  
  25.        t = constructor.newInstance(parameters);  
  26.        constructionContext.setProxyDelegates(t);  
  27.      } finally {  
  28.        constructionContext.finishConstruction();  
  29.      }  
  30.   
  31.      // Store reference. If an injector re-enters this factory, they'll  
  32.      // get the same reference.  
  33.      constructionContext.setCurrentReference(t);  
  34.   
  35.      // Inject fields and methods.  
  36.      for (Injector injector : injectors) {  
  37.        injector.inject(context, t);  
  38.      }  
  39.   
  40.      return t;  
  41.    } catch (InstantiationException e) {  
  42.      throw new RuntimeException(e);  
  43.    } catch (IllegalAccessException e) {  
  44.      throw new RuntimeException(e);  
  45.    } catch (InvocationTargetException e) {  
  46.      throw new RuntimeException(e);  
  47.    } finally {  
  48.      constructionContext.removeCurrentReference();  
  49.    }  
  50.  } 
这就是xwork进行依赖注入的过程,写的比较粗浅(不过第一次写原创,还是鼓励一下),
分享到:
评论

相关推荐

    xwork官网源码 下载 xwork

    《深入理解XWork框架:官方源码解析》 XWork是一个强大的Action框架,它为Java Web应用程序提供...因此,对于任何想要提升自己Java Web技能的开发者来说,下载并研究XWork的源码都是一个值得投入的时间和精力的活动。

    xwork源码及文档

    《XWork源码深度解析与应用指南》 XWork,作为一个强大的Action框架,是Struts2的核心组成部分,为Web应用提供了模型驱动的架构支持。...深入研究XWork,不仅是对技术的探索,更是对软件工程实践的深入理解和提升。

    xwork2.1.2源码与xwork2.2.1源码

    总结,xwork的源码研究对于Java Web开发者来说,既是一次技术探索之旅,也是提升技能的有效途径。从2.1.2到2.2.1的演进过程中,我们可以看到框架在功能、性能、易用性等方面的持续优化,这对于我们理解和使用Struts2...

    xwork-2.0.7jar

    《深入解析xwork-2.0.7:框架与源码探索》 xwork-2.0.7是一个重要的Java框架,它在Web应用开发领域扮演着不可或缺的角色。...对于有志于深入研究Web应用开发的程序员来说,xwork-2.0.7无疑是一份宝贵的资源。

    xwork-2.0.4源码

    通过对xwork-2.0.4源码的深入研究,开发者不仅可以掌握Struts2框架的内部运作机制,还能提高问题定位和性能优化的能力,同时激发对设计模式和面向切面编程的深入理解。这是一次宝贵的代码学习之旅,对于任何希望提升...

    xwork2源代码(整理)

    通过深入研究xwork2的源代码,我们可以更深刻地理解其内部机制,提升开发技能。这里,我们将对xwork2源代码进行详尽的探讨。 首先,我们来看一下“xwork-2.1.1-src.zip”这个压缩包,它包含了xwork2的完整源代码,...

    xwork2.0.4源代码

    深入学习xwork2.0.4源代码,对于理解Struts2框架的工作原理,优化性能,以及进行二次开发具有重大意义。通过阅读源码,我们可以了解到xwork如何协调Action、Interceptor、Validator等组件协同工作,从而更好地设计和...

    xwork-assembly-2.1.6-src

    深入研究xwork-2.1.6-src,我们可以学习到以下核心知识点: 1. **Action管理**:xwork如何创建、初始化和管理Action实例,以及如何通过ActionContext传递请求上下文信息。 2. **拦截器机制**:xwork的拦截器链是...

    Xwork完整源代码

    深入研究Xwork的源代码,我们可以学习到如何优雅地实现MVC架构,如何利用拦截器增强应用的灵活性,以及如何设计可扩展的框架。这对于提升Java Web开发技能,理解Struts2框架的工作方式,以及解决实际开发中的问题都...

    所有xwork2源代码

    XWork2是一个重要的Java框架,它是Struts...通过深入研究XWork2的源代码,开发者可以更好地掌握其设计思想,定制自己的MVC框架,提升应用程序的性能和可维护性。同时,对于理解与其紧密相关的Struts2框架也有很大帮助。

    xwork-2.0.4 源码

    通过对xwork-2.0.4源码的深入研究,我们可以理解其背后的架构设计和工作原理,从而更好地利用这个框架来构建高效、可维护的Web应用。无论是Action、Interceptor还是ActionContext,每一个组件都是为了实现更灵活、更...

    完整的xwork源代码

    通过研究XWork的源代码,你可以更深入地了解其内部工作原理,这对于定制自己的业务框架、优化性能或调试问题都有极大的帮助。同时,由于XWork是Struts2的基础,理解XWork也有助于掌握Struts2的架构设计。 总之,这...

    struts2之xwork

    Struts2是一个强大的Java web应用程序框架,它基于MVC(Model-View-Controller)设计模式,使得开发人员能够更...通过深入学习和研究XWork,开发者能够更好地掌握Struts2框架,并在实际项目中游刃有余地运用这些知识。

    xwork源码及札包

    了解和研究XWork源码有助于开发者提升对Struts2框架的理解,特别是在解决实际问题和优化性能时,源码分析能提供直接的帮助。同时,熟悉源码也能为自定义拦截器、扩展组件或参与开源项目贡献代码打下基础。 在部署...

    xwork源码(全)

    通过深入研究这些核心组件的源码,可以更深刻地理解XWork的工作原理,以及如何与Struts2协同工作。这有助于我们优化代码,提高应用性能,并解决可能出现的问题。 **应用场景** XWork在实际开发中的应用广泛,尤其...

    xwork源代码,最新版本

    通过对XWork源代码的深入研究,我们可以更好地理解它的运行机制,从而在实际开发中更高效地利用这一工具。对于想要提升Java Web开发能力的开发者来说,熟悉并掌握XWork的源代码无疑是十分有益的。通过查看并分析源码...

    xwork-2.0.5-src

    通过对`xwork-2.0.5`源代码的深入研究,开发者不仅可以掌握Struts2的核心运作机制,还能更好地优化应用性能,解决实际问题。同时,这也为理解和学习其他基于XWork的框架(如Struts2)奠定了坚实的基础。 总之,`...

    xwork-src

    《深入解析xwork-src:揭示Web应用开发的强大框架》 在Web应用开发的世界里,xWork框架是一个不可或缺的工具,其源代码库“xwork-src”为我们提供了深入了解这个框架内部运作机制的机会。本文将深入探讨xwork-src的...

    xwork-core-2.1.6源代码

    通过深入研究xwork-core-2.1.6的源代码,开发者不仅可以掌握Struts2的核心概念和工作流程,还能学习到设计模式、并发控制、性能优化等方面的实践知识。这将极大地提高我们解决实际问题的能力,使我们能更好地应对...

    XWork 源码

    深入学习XWork源码,我们可以关注以下几个核心概念: - **Action接口与ActionSupport类**:Action接口定义了动作的基本行为,而ActionSupport是它的默认实现,提供了默认的错误处理和结果返回机制。 - **...

Global site tag (gtag.js) - Google Analytics