java - Spring 注入(inject) - 实例

标签 java spring spring-mvc code-injection

我是 Spring 新手,但我不明白这一点。 当我调用 myMethod 两次或多次时,myManager 中的 propA 会被覆盖,并且每次都会调用“doSomething”对于相同的 propA 值(最后设置的)。 Spring注入(inject)是如何工作的?每次调用 myMethod() 时,我都希望有一个新的 MyManager 实例。难道是我的方法不对?

这是我的简化(也是错误的)代码:

public class myClass {

private MyManager manager;
//..setter and getter 

public String myMethod() {
    //somelogic

    manager.setPropA("a");

    Thread tt = new Thread(manager);
    try {
        tt.start();
    } catch (IllegalThreadStateException e) {
        log.error("Errore", e);
    }
}
}

public class MyManager implements Runnable {

private MyService service;
private String propA;

//Setters and getters   
@Override
public void run() {
    try {
        // sleep(30000);
        service.doSomething(propA);
    } catch (Exception ex) {
        //ERROR
    }
}
}

Spring 配置:

<bean id="myClass" class="..." scope="prototype" >
    <property name="manager" ref="MyManager"/>
</bean>


<bean id="MyManager" class="" scope="prototype">
    <property name="service" ref="MyService"/>
</bean>


   <bean id="MyService" class="...">
    <property name="myDao" ref="MyDao" />
</bean>

是的,我有@reos。

我最终得到了这个解决方案,但我不太高兴并更改了我的代码。

这是我不满意的解决方案,如果有人感兴趣的话:

public class MyManager implements ApplicationContextAware,  Runnable {

private MyService service;
private String propA;
private static ApplicationContext applicationContext;


public MyManager() {

}

public static ApplicationContext getApplicationContext() {
    return applicationContext;
}

@Override
public  void setApplicationContext(ApplicationContext applicationContext) {
    this.applicationContext = applicationContext;
}


//Others getters and setters


@Override
public void run() {
try {
    // sleep(30000);
service= (MyService)this.applicationContext.getBean("MyService");
    service.doSomething(propA);
} catch (Exception ex) {
    //ERROR
}
}

}


public class myClass {

private MyManager manager;
//..setter and getter 

public String myMethod() {
//somelogic

MyManager manager = new MyManager();
manager.setPropA("propA");

manager.setPropA("a");

Thread tt = new Thread(manager);
try {
    tt.start();
} catch (IllegalThreadStateException e) {
    log.error("Errore", e);
 }
}
}

最佳答案

这是行不通的。据我所知,Spring 仅在创建时注入(inject)您的代码。因此,当创建 myClass 时,它将找到对 myManager 的引用,然后也将创建该引用,以便可以注入(inject)它。因此,您的经理将始终属于同一个实例。

如果您想要一个新实例,我建议实现一个工厂。

public class MyManagerfactory {

public MyManager create() { ... // create new instance }

}

您现在可以将工厂注入(inject) MyClass,而不是直接注入(inject)管理器。然后,工厂将创建一个新的管理器实例,您可以配置该实例并将其传递给线程来执行。

如果您想通过 Spring 执行此操作,则必须创建 MyClass 实例的多个实例,并向它们传递 MyManager 的不同实例。调用方法不会为您执行注入(inject)。

您可以通过应用程序上下文手动创建 Bean,但这也不是最理想的解决方案。我认为在这种情况下你想要一个工厂。

希望有帮助,

阿图尔

关于java - Spring 注入(inject) - 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34301709/

相关文章:

java - 正在注册 jaxws :client as a Spring bean in Spring Boot Framework

java - 注释处理器不能在纯 Java 中运行

java - 尝试使用 Spring 和扩展 Hibernate 的 JpaRepository 的自定义 GenericDao 接口(interface)来使用 EhCache

mysql - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : Unknown column 'user0_.userId' in 'field list'

java - hibernate中的多对多自引用关联

spring - @Indexed 不适用于 spring 数据 cassandra

java - Spring Boot - 如何从依赖项中包含 REST 端点?

java - 在java程序中执行jar文件

java - Idea Intellij中的springframework源代码

Java-如何分析函数代码