Tag: inversion of control

使用System属性更改spring bean别名

我试图弄清楚是否可以通过系统属性更改弹簧别名配置。 这是配置: 我希望能够使用JVM属性,例如使用-Duse=beanThree为别名选择另一个bean。 不幸的是,使用直接解决方案会抛出NoSuchBeanDefinitionExceptionexception:( 有什么建议么?

尽管使用了@Primary,但两个具有相同名称的bean会导致ConflictingBeanDefinitionException

我有一个应用程序初始化程序类,用于将特定于应用程序的数据插入数据库。 @Component(“applicationInitializer”) public class ApplicationInitializer { @PostConstruct public void init(){ // some clever code here } } 还有DevApplicationInitializer类,用于在开发人员计算机上使用一些示例数据初始化数据库(在部署生产代码时排除此类)。 @Component(“applicationInitializer”) @Primary public class DevApplicationInitializer extends ApplicationInitializer { @PostConstruct @Override public void init(){ super.init(); // even more clever code here } } 直到我给bean命名(只有@Component注释) – 一切正常 – 当DevApplicationInitializer可用时,它被实例化而不是ApplicationInitializer 。 当我给他们一个applicationInitializer名称时,抛出了exception: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘applicationInitializer’ for bean class […]

重复使用原型bean的相同实例两次 – Spring

我有一个Spring的问题:我需要重复使用相同的bean实例两次,但不要使它成为单例。 这是一个简短的ApplicationContext: … and more args 因此,我需要在内部完全初始化带有Lifecycle和PropertySetter Provider ,并且此PropertySetter必须包含对Provider具有的相同Lifecycle引用。 当我将lifecycle和propertySetter定义为单例时,它会导致很大的问题,因为如果我创建多个Provider ,则所有Provider类实例共享相同的生命周期和属性setter,并且它会破坏应用程序逻辑。 当我尝试将所有bean定义为原型时, Provider和PropertySetter中的生命周期不再相同=> exception。 我有一个解决方案:传递给Provider only Lifecycle并在Provider java构造函数中创建PropertySetter (通过扩展Provider )。 它运作良好,但仅限于我当地的环境。 在生产代码中我无法扩展3pty Provider类,因此我无法使用此解决方案。 请告诉我,在这种情况下最合适的做法是什么?

Spring不支持接口注入吗?

我知道Spring不支持接口注入,我已多次阅读过。 但是今天我在Martin Fowler( 链接 )中看到一篇关于IOC的文章时,似乎在Spring中使用ApplicationContextAware是类似于Interface注入的。 当我们的Spring bean需要Spring’上下文引用时,我们将实现ApplicationContextAware并实现setApplicationContext(ApplicationContext context)方法,并且我们将bean包含在配置文件中。 这是不是和Interface注入相同,那里告诉Spring注入(或),比如说将上下文的引用传递给这个bean? 或者我在这里遗漏了什么? 感谢您的任何信息! ManiKanta

Spring的@Autowired是一个巨大的性能问题吗?

我有一个项目……我不知道…… 200-300 daos / services / controllers我使用@Autowired连接所有内容而不是在applicationContext.xml指定所有内容。 我的问题是,这对我的创业时间有多大影响? 是否值得删除所有@Autowired注释并实际通过applicationContext.xml手动连接此applicationContext.xml ? 从架构的角度来看,我喜欢@Autowired 。 我不想通过使用xml文件添加另一层复杂性 – 就我而言,它没有增加任何价值。 但是,如果这种事情为我的容器的加载时间增加10秒,我可能会考虑它。 如果成本是100毫秒,那么我会保持原样。 谢谢

春豆田注射

使用Spring IoC允许设置通过setter公开的bean属性: public class Bean { private String value; public void setValue(String value) { this.value = value; } } 而bean的定义是: 是否有任何现有的Spring Framework插件/类允许直接将bean字段作为属性公开而不定义setter? 像这样的bean具有相同的bean定义: public class Bean { @Property private String value; }

Spring 3.2 Autowiregenerics类型

所以我在Spring 3.2中有许多generics,理想情况下我的架构看起来像这样。 class GenericDao{} class GenericService<T, T_DAO extends GenericDao> { // FAILS @Autowired T_DAO; } @Component class Foo{} @Repository class FooDao extends GenericDao{} @Service FooService extends GenericService{} 遗憾的是,对于generics的多个实现,自动assembly会引发有关多个匹配bean定义的错误。 我认为这是因为@Autowired进程在类型擦除之前。 我找到或想出的每一个解决方案看起来都很难看,或者只是莫名其妙地拒绝工作。 解决这个问题的最佳方法是什么?

多个实例中的Dagger 2单身人士

我刚刚测试了Dagger 2,我对单例注释有一些奇怪的行为。 我创建了一些测试代码来显示我的问题。 我的模块: @Module public class App { @Provides @Singleton ThingA provideThingA(){ return new ConcreteThingA(); } } 在singleton中我想要的东西的界面: public interface ThingA { void showMyId(); } 执行: public class ConcreteThingA implements ThingA { @Override public void showMyId() { System.out.println(this); } } 执行Dagger的代码: public void doStuff() { ThingA thingA=DaggerThingAComponent.create().provideThingA(); ThingA thingB=DaggerThingAComponent.create().provideThingA(); System.out.println(“Hello”); } 这是一个屏幕截图,显示当我要求它两次时,我没有得到相同的实例。 我错过了什么基本的东西? ThingA只是一个愚蠢的名字,在我的实际应用程序中,我希望在我的服务上有这种单例行为。

接口在Spring IoC / DI中使用@Component注释进行注释。 可能是什么原因?

有时,接口使用@Component注释进行注释。 然后我明显的推理是,实现这种接口的类也将被视为组件。 但如果我是对的,事实并非如此。 那么接口上@Component注释的目的是什么呢?

Guice动态注入自定义注释

我有一些资源,但我不能迭代它并将它们全部绑定,我必须使用密钥来请求资源。所以,我必须动态注入。 我定义了一个注释 @Target({ METHOD, CONSTRUCTOR, FIELD }) @Retention(RUNTIME) @Documented @BindingAnnotation public @interface Res { String value();// the key of the resource } 像这样用 public class Test { @Inject @Res(“author.name”) String name; @Inject @Res(“author.age”) int age; @Inject @Res(“author.blog”) Uri blog; } 我必须处理由@Res注释的@Res ,我需要知道注入字段和注释。 这在Guice有可能吗? 即使有spi?