Qual a finalidade de colocar “@Statefull” ou “@Stateless” acima de uma classe? Eu entendo um pouco o conceito de EJB, mas o que muda na prática ao inserir essas annotations?
Stateful é com estado
e Stateless é sem estado
Ex: Sabe aquele carrinho de compra de ecommerces? Aquilo usa algo “Stateful”, ou seja, é criado uma sessão para o usuário. É por causa dessa sessão, que ele consegue continuar navegando no site, sem perder o que está em seu carrinho de compras. Se fosse stateless, no primeiro click pra outra página que ele desse, já perderia os valores do carrinho de compras.
http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html#gipnl
Estas anotações são parte de um total de 3 (além da @Stateless e @Stateful, temos a @Singleton)
Basicamente, elas indicam um Session Bean (bean de sessão) e a utilidade do bean em questão é que vai definir qual anotação será utilizada.
Vamos imaginar o seguinte, um Session Bean que tem como finalidade ser rápido e ágil para conectar-se a uma base de dados e retornar informações lidas nesta base, aí você utiliza um @Stateless, que não irá se prender à sessão e não manterá o estado das ações.
Agora, imagine que você precisa fazer uma interação com dados que serão, sucessivamente, enviados ao servidor. O bean, neste caso, precisa armazenar os dados até que receba a ordem de finalizar o processo por completo e liberar a sessão. Este é um @Stateful, ele mantém a sessão ativa enquanto o cliente necessitar, pode ser mais lento ou mais ágil que o @Stateless, porém, é exclusivo, cada instância do bean atende uma única sessão por vez.
Por último, temos o @Singleton, que cria uma única instância para quaisquer requisições, agindo como um @Stateless, pois não manterá o estado e nem será reservado por nenhum cliente.