package org.jooby; import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; import org.jooby.mvc.GET; import org.jooby.mvc.Path; import org.jooby.scope.RequestScoped; import org.jooby.test.ServerFeature; import org.junit.Test; public class RequestScopedFeature extends ServerFeature { @RequestScoped public static class RequestScopedObject { static int instances = 0; { instances += 1; } @Override public String toString() { return "" + instances; } } @Path("/r") public static class DefScope { static int instances = 0; { instances += 1; } private RequestScopedObject requestScoped; @Inject public DefScope(final RequestScopedObject requestScoped) { this.requestScoped = requestScoped; } @GET public String m() { return "d" + instances + ":" + requestScoped.toString(); } } @Path("/s") @Singleton public static class SingletonScope { private Provider<RequestScopedObject> requestScoped; static int instances = 0; { instances += 1; } @Inject public SingletonScope(final Provider<RequestScopedObject> requestScoped) { this.requestScoped = requestScoped; } @GET public String m() { return "s" + instances + ":" + requestScoped.get().toString(); } } { get("/", (req, resp) -> { // ask once req.require(RequestScopedObject.class); // ask twice req.require(RequestScopedObject.class); // get it resp.send(req.require(RequestScopedObject.class)); }); use(DefScope.class); use(SingletonScope.class); } @Test public void numberOfInstances() throws Exception { RequestScopedObject.instances = 0; DefScope.instances = 0; SingletonScope.instances = 0; request() .get("/") .expect("1"); request() .get("/r") .expect("d1:2"); request() .get("/r") .expect("d2:3"); request() .get("/s") .expect("s1:4"); request() .get("/s") .expect("s1:5"); } }