我想注入同一对象的不同实例(使用Session或Appplication Scope)。
我想要两个不同的汽车柜台实例(一个用于红色实例,另一个用于绿色实例)。 相反,它将创建对同一对象的两个引用。
我该如何解决该问题? (将计数器保留在应用程序作用域中,而服务保留在会话作用域中)。
RestSession
@Path("/api/session")
@SessionScoped
public class RestSession implements Serializable {
@Inject @Contatori
private IContatore countRedCar;
@Inject @Contatori
private IContatore countGreenCar;
@Produces("application/json")
@GET
@Path("/red")
public ResultDTO countRed() {
countRedCar.conta();
return new ResultDTO(countRedCar.getCount(),countGreenCar.getCount());
}
@Produces("application/json")
@GET
@Path("/green")
public ResultDTO countGreen() {
countGreenCar.conta();
return new ResultDTO(countRedCar.getCount(),countGreenCar.getCount());
}
}
Conta
package it.paolo.javaee.util;
import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
@Contatori
public class Conta implements IContatore{
private int count;
public Conta() {
count=0;
}
public int conta() {
return count+=1;
}
public void setCount(int i) {
count=i;
}
public int getCount() {
return count;
}
}
IContatore
package it.paolo.javaee.util;
import java.io.Serializable;
public interface IContatore extends Serializable {
public int conta();
public void setCount(int i);
public int getCount();
}
@interface Contatori3
package it.paolo.javaee.util;
import javax.inject.Qualifier;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
public @interface Contatori3 {
}
答案 0 :(得分:0)
正如Felks评论所说的那样,您可能需要两个单独的限定符注释和两个用于计数器的生产bean /方法。但是,似乎您只有一个Conta
的bean实现,也许不一定是最好的方法?
也许您可以尝试这样的事情:
Conta
更改为普通课程,所以没有bean @ApplicationScoped
bean,以容纳所有可能的Contas
这个新bean可能像:
@ApplicationScoped
@Getter
public class Contas {
private Conta contaRed = new Conta();
private Conta contaGreen = new Conta();
}
在休息时,注入Contas
@Inject
private Contas contas;
并访问以下内容:
contas.getContaRed().whatever();
由于Contas
受应用程序限制,getContaRed|Green()
将返回相同的red | green计数器,当在其他地方注入Contas
时,它们不会再次初始化。