Spring proxy

By | 25 agosto 2014

Una de las cuestiones mas abstractas a la hora de entender el funcionamiento de Spring, es comprender como Spring carga el conjunto de beans en el Spring Context.

Para esto es fundamental comprender como funcionan, y cual es el cometido de los Spring Proxies.

El cometido de estos proxies es aportar la capacidad a nuestros beans mediante el uso de AOP (Aspect Oriented Programing) de de características como:

  1. Logging.
  2. Transactions.
  3. Caching
  4. Security.
  5. Exception handling.
  6. Etc…

Comúnmente, nosotros utilizamos @anotaciones para implementar estas características, pero realmente es Spring Proxy el que los busca, comprende y encapsula dentro de los diferentes entornos de funcionalidad.

A través de esta imagen podemos comprender mejor este concepto.

En este caso disponemos de una interface AccountService, la cual es implementada por AccountServiceImpl.

Por poner un ejemplo facilón, nuestra interface podria verse asi.

public interface AccountService{

    Account getAccount(String user, String password);

}

Y ahora, tendremos nuestra implementación, la cual viene anotada como @Service, incorporará su conjunto de dependencias e implementara la lógica de negocio.

@Service("accountService")
public class AccountServiceImpl implements AccountService{

    @Autowired
    private AccountDAO accountDAO;

    @Override
    @Cacheable(value="account_region", key="#user + #password")
    public Account getAccount(String user, String password){

        return this.accountDAO.getAccount(user, password);
    }

}

¿Fácil no?

Spring Proxy se encargará de envolver nuestro bean, de tal manera, que cuando este sea accedido desde otro bean de la aplicación, las anotaciones mediante AOP implementen la funcionalidad especifica de dicha anotación.

Un ejemplo en código, seria el @Controller que utiliza nuestro AccountService

@Controller("accountController")
@RequestMapping(value="/account")
public class AcountController{

    @Autowired
    private AccountService accountService

    @RequestMapping(value="/{user}/{password}", method=RequestMethod.GET)
    public Account getAccount(@PathVariable String user, @PathVariable String password){

        return this.accountService.getAccount(user, password);
    }

}

Al realizar la llamada this.accountService.getAccount(user, password); Spring invocara el método del Service a través del Spring Proxy, este, que ya a analizado previamente todas las anotaciones de nuestra clase, conoce que debe cachear el target devuelto por el método con la key especificada mediante SpEl.

En CTW o LTW AspectJ Weaving veremos como los Spring Proxies, aunque nos sirven en el 90% de los casos, en las ocasiones que debemos invocar un método desde otro método de la misma clase no funcionan correctamente, ya que esa llamada se realiza sin pasar a través del Spring Proxy que envuelve al bean.

Comparte esta entrada enShare on LinkedIn0Tweet about this on Twitter0Share on Facebook0Share on Google+0

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *