我试图理解dependency injection (DI),并再次失败。 这似乎很愚蠢。 我的代码从来不是一团糟。 我几乎不写虚拟函数和接口(虽然我只做了一次蓝月亮),所有的configuration都被神奇地用json.net(有时使用XML序列化器)序列化成一个类。 我不太明白它解决了什么问题。 它看起来像一个方式来说:“嗨,当你遇到这个函数,返回一个这种types的对象,并使用这些参数/数据。 但是…为什么我会用这个? 注意我从来不需要使用object ,但是我明白这是什么意思。 在使用DI的网站或桌面应用程序中,有哪些实际情况? 我可以很容易地想出为什么有人可能想要在游戏中使用接口/虚函数的情况,但是在非游戏代码中使用非常罕见(难以记忆单个实例)。
我正在重构一个类,并添加一个新的依赖关系。 该类正在构造函数中使用现有的依赖关系。 所以为了一致性,我将这个参数添加到构造函数中。 当然,还有几个子类加上unit testing,所以现在我正在玩游戏,改变所有的构造函数来匹配,并且需要很长时间。 这让我觉得使用setter属性是获取依赖关系的更好方法。 我不认为注入的依赖关系应该是构造一个类的实例的接口的一部分。 你添加一个依赖关系,现在所有的用户(子类和任何直接实例化你的用户)突然知道它。 这感觉就像封装的rest。 这似乎不是现有代码的模式,所以我正在寻找一般共识是什么,build设者与财产的利弊。 是更好地使用属性设置?
大多数的引用dependency injection的例子,我们也可以使用工厂模式来解决。 看起来,当涉及到使用/devise时,dependency injection和工厂之间的区别变得模糊或薄弱。 一旦有人告诉我,它如何使用它,有所作为! 我曾经使用过StructureMap的一个DI容器来解决一个问题,后来我重新devise了一个简单的工厂,去掉了对StructureMap的引用。 谁能告诉我他们之间有什么区别,在哪里使用什么,这里最好的做法是什么?
冒着步入圣战疆域的风险,这些stream行的DI / IoC框架的优点和缺点是什么,可以轻易认为是最好的? ..: Ninject 统一 Castle.Windsor Autofac StructureMap 有没有其他的DI / IoC框架的C#,我没有在这里列出? 在我的用例的上下文中,我构build了一个客户端WPF应用程序和一个WCF / SQL服务基础架构,易用性(特别是语法清晰简洁),一致的文档,良好的社区支持和性能都是重要的因素在我的select。 更新: 所引用的资源和重复问题似乎已经过时,能否有一个知道所有这些框架的人出面并提供一些真正的洞察力? 我意识到这个问题上的大多数意见可能是有偏见的,但我希望有人花时间研究所有这些框架,并至less有一个客观的比较。 如果以前没有做过,我很乐意做自己的调查,但是我认为这是至less有一些人已经做了。 第二次更新: 如果您对多个DI / IoC容器有经验,请对这些容器的优缺点进行sorting和总结,谢谢。 这不是发现人们所有的模糊小容器的练习,我正在寻找stream行的(和主动的)框架之间的比较。
在托pipebean中,在普通的Java对象构造函数之后调用@PostConstruct 。 为什么我会使用@PostConstruct来初始化bean,而不是常规的构造函数本身?
我有一堆Spring类,通过注释从classpath中获取,例如 @Repository("personDao") public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao { // Implementation omitted } 在Spring XML文件中,定义了一个PropertyPlaceholderConfigurer : <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="/WEB-INF/app.properties" /> </bean> 我想从app.properites注入一个属性到上面显示的bean中。 我不能简单地做这样的事情 <bean class="com.example.PersonDaoImpl"> <property name="maxResults" value="${results.max}"/> </bean> 因为PersonDaoImpl不在Spring XML文件中(它是通过注释从类path中获取的)。 我有以下几点: @Repository("personDao") public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao { @Resource(name = "propertyConfigurer") protected void setProperties(PropertyPlaceholderConfigurer ppc) { // Now […]
标准的Spring Web应用程序(由Roo或“Spring MVC Project”模板创build)使用ContextLoaderListener和DispatcherServlet创buildweb.xml。 为什么他们不仅使用DispatcherServlet并使其加载完整的configuration? 我明白,应该使用ContextLoaderListener加载与Web不相关的东西,并使用DispatcherServlet加载Web相关的东西(控制器,…)。 而这个结果有两个上下文:一个父母和一个孩子的上下文。 背景: 几年来我一直这样做。 <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value> </context-param> <!– Creates the Spring Container shared by all Servlets and Filters –> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!– Handles Spring requests –> <servlet> <servlet-name>roo</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/spring/webmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> 这经常导致两个上下文和它们之间的依赖关系的问题。 过去我总是能find解决scheme,而且我有强烈的感觉,这使得软件结构/架构总是更好。 但是现在我面临着这两种情况下的一个问题 。 – 但是这使得我重新思考这两个上下文模式,我在问自己:为什么我要把自己带入这个麻烦,为什么不用一个DispatcherServlet加载所有的Springconfiguration文件,并完全删除ContextLoaderListener 。 (我仍然会有不同的configuration文件,但只有一个上下文。) 有没有任何理由不删除ContextLoaderListener ?
我正在探索dependency injection,术语组合根被用在所有地方。 那是什么?
我想将一个Mockito模拟对象注入到Spring(3+)bean中,以便与JUnit进行unit testing。 我的bean依赖关系目前是通过在私有成员字段上使用@Autowired注解来注入的。 我已经考虑使用ReflectionTestUtils.setField但是我希望注入的bean实例实际上是一个代理,因此不声明目标类的私有成员字段。 我不想为依赖项创build公共setter,因为我将纯粹为了testing目的而修改我的接口。 我遵循了Spring社区给出的一些build议 ,但是模拟并没有被创build,而且自动布线失败: <bean id="dao" class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="com.package.Dao" /> </bean> 我目前遇到的错误如下: … Caused by: org…NoSuchBeanDefinitionException: No matching bean of type [com.package.Dao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: { @org…Autowired(required=true), @org…Qualifier(value=dao) } at org…DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(D…y.java:901) at org…DefaultListableBeanFactory.doResolveDependency(D…y.java:770) 如果我将constructor-arg值设置为无效,那么启动应用程序上下文时不会发生错误。
我发现我的构造函数开始看起来像这样: public MyClass(Container con, SomeClass1 obj1, SomeClass2, obj2…. ) 不断增加参数列表。 由于“容器”是我的dependency injection容器,为什么我不能这样做: public MyClass(Container con) 为每个class? 有什么缺点? 如果我这样做,感觉就像我正在使用一个荣耀的静态。 请分享你对IoC和dependency injection疯狂的想法。