下面说一下create(..)方法干些什么东东(我说的create(..)是这个哦new ContainerBuilder().factory(IPerson.class,Person.class).factory(IUserPerson.class,UserPerson.class).create(true))
java 代码
- final ContainerImpl container = new ContainerImpl(
- new HashMap<key>, InternalFactory>(factories)); </key>
- if (loadSingletons) {
- container.callInContext(new ContainerImpl.ContextualCallable<void>() { </void>
- public Void call(InternalContext context) {
- for (InternalFactory factory : singletonFactories) {
- factory.create(context);
- }
- return null;
- }
- });
- }
首先它创建一个ContainerImpl对象,这个对象的创建过程会做很多很多的事情,一些需要依赖注入的东西会在这里完成还是前面说的,它并没有完成真正的依赖注入(对象都没有创建当然没法注入了
),它只是完成依赖注入所需要的一些信息,当然它不只完成这些,我现在还有点迷糊,等过两天再好好整理这一块!!
java 代码
- container.injectStatics(staticInjections);
这段代码是进行static field 和static method的注入,众所周知static是和对象无关的,所以可以在没有实例化对象前进行注入
java 代码
- IUserPerson person=container.getInstance(IUserPerson.class);
这行代码就是实例化一个对象,这个过程会完成所有的真的依赖注入工作
在
- container.getInstance(..)
这个方法中会调用如下一段代码
- ExternalContext previous = context.getExternalContext();
- Key<t> key = Key.newInstance(type, name); </t>
- context.setExternalContext(ExternalContext.newInstance(null, key, this));
- try {
- InternalFactory o = getFactory(key);
- if (o != null) {
- return getFactory(key).create(context);
- } else {
- return null;
- }
- } finally {
- context.setExternalContext(previous);
- }
在这里通过
Key.newInstance(type, name);创建一个Key,这个Key的type和name和调用factory(..)时放到factories中的Key相对应,所以通过InternalFactory o = getFactory(key);这个方法就能得到前面在factory(..)中创建的InternalFactory对象,进而可以调用它的create(..)方法(个人觉得这个设计的很精妙!),我们再来重新看一下这个方法的实现
- public T create(InternalContext context) {
- if (constructor == null) {
- this.constructor =
- context.getContainerImpl().getConstructor(implementation);
- }
- return (T) constructor.construct(context, type);
- }
这段代码通过调用constructor.construct(context, type);来创建一个对象,并进行依赖注入,
- Object construct(InternalContext context, Class<? super T> expectedType) {
- ConstructionContext<T> constructionContext =
- context.getConstructionContext(this);
-
-
- if (constructionContext.isConstructing()) {
-
-
- return constructionContext.createProxy(expectedType);
- }
-
-
-
- T t = constructionContext.getCurrentReference();
- if (t != null) {
- return t;
- }
-
- try {
-
- constructionContext.startConstruction();
- try {
- Object[] parameters =
- getParameters(constructor, context, parameterInjectors);
- t = constructor.newInstance(parameters);
- constructionContext.setProxyDelegates(t);
- } finally {
- constructionContext.finishConstruction();
- }
-
-
-
- constructionContext.setCurrentReference(t);
-
-
- for (Injector injector : injectors) {
- injector.inject(context, t);
- }
-
- return t;
- } catch (InstantiationException e) {
- throw new RuntimeException(e);
- } catch (IllegalAccessException e) {
- throw new RuntimeException(e);
- } catch (InvocationTargetException e) {
- throw new RuntimeException(e);
- } finally {
- constructionContext.removeCurrentReference();
- }
- }
这就是xwork进行依赖注入的过程,写的比较粗浅(不过第一次写原创,还是鼓励一下
),
分享到:
相关推荐
《深入理解XWork框架:官方源码解析》 XWork是一个强大的Action框架,它为Java Web应用程序提供...因此,对于任何想要提升自己Java Web技能的开发者来说,下载并研究XWork的源码都是一个值得投入的时间和精力的活动。
《XWork源码深度解析与应用指南》 XWork,作为一个强大的Action框架,是Struts2的核心组成部分,为Web应用提供了模型驱动的架构支持。...深入研究XWork,不仅是对技术的探索,更是对软件工程实践的深入理解和提升。
总结,xwork的源码研究对于Java Web开发者来说,既是一次技术探索之旅,也是提升技能的有效途径。从2.1.2到2.2.1的演进过程中,我们可以看到框架在功能、性能、易用性等方面的持续优化,这对于我们理解和使用Struts2...
《深入解析xwork-2.0.7:框架与源码探索》 xwork-2.0.7是一个重要的Java框架,它在Web应用开发领域扮演着不可或缺的角色。...对于有志于深入研究Web应用开发的程序员来说,xwork-2.0.7无疑是一份宝贵的资源。
通过对xwork-2.0.4源码的深入研究,开发者不仅可以掌握Struts2框架的内部运作机制,还能提高问题定位和性能优化的能力,同时激发对设计模式和面向切面编程的深入理解。这是一次宝贵的代码学习之旅,对于任何希望提升...
通过深入研究xwork2的源代码,我们可以更深刻地理解其内部机制,提升开发技能。这里,我们将对xwork2源代码进行详尽的探讨。 首先,我们来看一下“xwork-2.1.1-src.zip”这个压缩包,它包含了xwork2的完整源代码,...
深入学习xwork2.0.4源代码,对于理解Struts2框架的工作原理,优化性能,以及进行二次开发具有重大意义。通过阅读源码,我们可以了解到xwork如何协调Action、Interceptor、Validator等组件协同工作,从而更好地设计和...
深入研究xwork-2.1.6-src,我们可以学习到以下核心知识点: 1. **Action管理**:xwork如何创建、初始化和管理Action实例,以及如何通过ActionContext传递请求上下文信息。 2. **拦截器机制**:xwork的拦截器链是...
深入研究Xwork的源代码,我们可以学习到如何优雅地实现MVC架构,如何利用拦截器增强应用的灵活性,以及如何设计可扩展的框架。这对于提升Java Web开发技能,理解Struts2框架的工作方式,以及解决实际开发中的问题都...
XWork2是一个重要的Java框架,它是Struts...通过深入研究XWork2的源代码,开发者可以更好地掌握其设计思想,定制自己的MVC框架,提升应用程序的性能和可维护性。同时,对于理解与其紧密相关的Struts2框架也有很大帮助。
通过对xwork-2.0.4源码的深入研究,我们可以理解其背后的架构设计和工作原理,从而更好地利用这个框架来构建高效、可维护的Web应用。无论是Action、Interceptor还是ActionContext,每一个组件都是为了实现更灵活、更...
通过研究XWork的源代码,你可以更深入地了解其内部工作原理,这对于定制自己的业务框架、优化性能或调试问题都有极大的帮助。同时,由于XWork是Struts2的基础,理解XWork也有助于掌握Struts2的架构设计。 总之,这...
Struts2是一个强大的Java web应用程序框架,它基于MVC(Model-View-Controller)设计模式,使得开发人员能够更...通过深入学习和研究XWork,开发者能够更好地掌握Struts2框架,并在实际项目中游刃有余地运用这些知识。
了解和研究XWork源码有助于开发者提升对Struts2框架的理解,特别是在解决实际问题和优化性能时,源码分析能提供直接的帮助。同时,熟悉源码也能为自定义拦截器、扩展组件或参与开源项目贡献代码打下基础。 在部署...
通过深入研究这些核心组件的源码,可以更深刻地理解XWork的工作原理,以及如何与Struts2协同工作。这有助于我们优化代码,提高应用性能,并解决可能出现的问题。 **应用场景** XWork在实际开发中的应用广泛,尤其...
通过对XWork源代码的深入研究,我们可以更好地理解它的运行机制,从而在实际开发中更高效地利用这一工具。对于想要提升Java Web开发能力的开发者来说,熟悉并掌握XWork的源代码无疑是十分有益的。通过查看并分析源码...
通过对`xwork-2.0.5`源代码的深入研究,开发者不仅可以掌握Struts2的核心运作机制,还能更好地优化应用性能,解决实际问题。同时,这也为理解和学习其他基于XWork的框架(如Struts2)奠定了坚实的基础。 总之,`...
《深入解析xwork-src:揭示Web应用开发的强大框架》 在Web应用开发的世界里,xWork框架是一个不可或缺的工具,其源代码库“xwork-src”为我们提供了深入了解这个框架内部运作机制的机会。本文将深入探讨xwork-src的...
通过深入研究xwork-core-2.1.6的源代码,开发者不仅可以掌握Struts2的核心概念和工作流程,还能学习到设计模式、并发控制、性能优化等方面的实践知识。这将极大地提高我们解决实际问题的能力,使我们能更好地应对...
深入学习XWork源码,我们可以关注以下几个核心概念: - **Action接口与ActionSupport类**:Action接口定义了动作的基本行为,而ActionSupport是它的默认实现,提供了默认的错误处理和结果返回机制。 - **...