¿Por qué usaría la reflexión? ¿Por qué no simplemente:
SampleClass action = new SampleClass();
action.setRequest(request);
Eso hace lo mismo, pero es más fácil de leer, permite al compilador para comprobar que realmente existen los tipos y métodos, te ofrece la Javadoc para el método invocado, permite a su IDE para ayudar en refactorizaciones, ...
Y todavía es inyección de dependencia, porque la acción no busca su solicitud, pero recibe la solicitud durante la inicialización.
Editar: solicitó Thorbjørn Muestro cómo se usaría esa acción. Se inyectaría por sí mismo (usando un setter) en cualquier componente que use la acción. El componente usaría entonces el objeto de acción inyectado.
SampleClass action = new SampleClass();
action.setRequest(request);
Servlet servlet = new ActionBasedServlet();
servlet.setAction(action);
Si servlet
está destinado a vivir más que action
, es decir, se debe utilizar un nuevo Action
cada vez que se necesita uno, se puede inyectar en lugar setter un ActionFactory
en servlet
.
En este caso concreto, me pregunto si la acción realmente necesita mantener una solicitud como parte de su estado, o puede ser inmutable y simplemente actuar sobre la solicitud aprobada por el Servlet como parámetro de método.En ese caso, la inicialización de tiempo de arranque haría:
SampleClass action = new SampleClass();
Servlet servlet = new ActionBasedServlet();
servlet.setAction(action);
y ActionBasedServlet
definiría
public void serve(Request req, Response resp) {
foo();
action.act(req, resp);
bar();
}
Me gusta el término "por arte de magia". Cómo está sucediendo la inicialización. Cómo se hace en primavera o en contenedores DI similares. –
La idea es alejar la inicialización tanto de la clase inyectada como de la clase en la que ocurre la inyección, por lo que no saben cómo sucede. Donde mueva el código de inyección a, depende de la implementación, y _you_ esencialmente no necesita saber. Al final, se usa la reflexión, pero eso es como decir que Hibernate está usando JDBC al final. –
Mi intención es pasar el objeto de solicitud a diferentes clases de controlador dinámicamente desde un filtro de despachador, donde obtenemos objetos de solicitud y respuesta. –