我想注入同一对象的不同实例(使用会话或应用程序范围)。
我想要两个不同的汽车计数器实例(一个用于红色,一个用于绿色)。相反,它会创建对同一对象的两个引用。
我该如何解决问题?(将具有应用程序范围的计数器保留在具有会话范围的服务休息中)。
休息会话
@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());
}
}
康塔
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;
}
}
康塔托雷
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 康塔托里3
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 {
}
正如 Felks 评论所说,使用这种方法,您可能需要两个单独的限定符注释和两个用于计数器的生成 bean/方法。但是,由于您似乎只有一个 Bean 实现Conta
也许它不一定是最好的方法?
也许你可以尝试这样的事情:
- 将您的类
Conta
更改为普通类,因此没有豆子 - 创建一个新的
@ApplicationScoped
豆来保存所有可能的Contas
这个新豆子可能是这样的:
@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()
将返回相同的红色|绿色计数器,当Contas
注入到其他地方时,这些计数器不会再次初始化。