GuiceアノテーションのためにシングルトンのクラスController
があります。このクラスを別のシングルトンクラスで拡張すると、アノテーションのために1つしかないはずの新しいリストが作成されます。ここController
のコードは次のとおりです。(Guice)シングルトンクラスを拡張すると別のリストになる
@Singleton
public class Controller extends HttpServlet {
@Inject protected IAccountService accountService;
@Inject protected ITalenService talenService;
@Inject protected List<IAppGegevensService> appGegevensServices;
@Inject protected List<ITalenService> talenServices;
私は2 ITalenServicesを持って知っているが、それが原因で別の理由のためです。 私のモジュールは、コードのこの部分が含まれています。ここ
@Singleton @Provides
List<IAppGegevensService> provideAppGegevensServices() {
return new ArrayList<>();
}
@Singleton @Provides
List<ITalenService> provideTalenServices() {
return new ArrayList<>();
}
はController
を拡張し、リストを設定し、クラスのコードです:
@Singleton
public class MaakNieuweAppController extends Controller {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("talen", talenService.getAlleTalen());
addAppGegevensService(accountService.findAccount((String) req.getSession().getAttribute("email")));
addTalenService(accountService.findAccount((String) req.getSession().getAttribute("email")));
req.getRequestDispatcher("kiezenTalen.jsp").forward(req, resp);
}
}
ここでの値のいずれかを要求クラスのコードがありますリストで:できるだけ早く私はリストappGegevensServices
またはtalenServices
にオブジェクトを追加し、リストIを求めるよう
@Singleton
@MultipartConfig
public class AlgemeneGegevensController extends Controller {
private Account account;
private IAppGegevensService appGegevensService;
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
account = accountService.findAccount((String) req.getSession().getAttribute("email"));
appGegevensService = getAppGegevensService(account);
n別のクラス(またはそのリスト内の特定のインスタンス)はnullです。リストが1つしかないことを確認するにはどうすればよいですか?
あなたは '何を誤解「のみであるため、注釈の1がなければならない間、私は、新しいリストを取得します」@シングルトンはそうします:それはguiceに、バインドされたときに特定のクラスのインスタンスを1つだけ作成するように指示します。 'Controller'のインスタンスと' MaakNieuweAppController'のインスタンスがある場合、 'Controller'はインスタンスが2つあるのでシングルトンではありません。 –
私はそれがguiceにクラスのインスタンスを1つ作成するように指示していますが、あまりにも正しいリストが1つしかないはずです。コントローラがシングルトンではないのはなぜですか?それは注釈のためか、間違っていますか? ^^ – Sjoerd
アドバイスの言葉:フィールドインジェクション(アトリビュートにアノテーションを挿入する)を使用する場合は、コンストラクタ内部で何をするかに非常に注意してください。あなたはここに注入された豆にアクセスできない!あなたの例ではアクセスしませんが、コンストラクタ内のものを初期化する必要がある場合は、コンストラクタインジェクションを使用するのがベストです。 –