EJB 3.x #

Para injetar beans do Spring em um Web-Service no Glassfish, seja ele JAX-WS ou JAX-RS, pode-se utilizar EJB's configurados com interceptors.

Para configurar um interceptor num EJB, é necessário anotar a classe com

 @Stateless
 @Interceptors(SpringBeanAutowiringInterceptor.class)
 public class WebService {
 }

Note que os interceptors funcionam somente com EJB's, então é necessário anotar a classe com @Stateless (@Stateful geralmente não é utilizado em Web-Services).

Além disso, um arquivo XML deve ser criado para que o interceptor possa carregar o Spring Application Context.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
   <!-- This context is loaded by type and not by name -->
   <bean class="org.springframework.context.support.ClassPathXmlApplicationContext">
         <constructor-arg value="classpath*:application-context.xml" />
   </bean>
</beans>

Agora falta habilitar a injeção de dependência via annotation, para isso adicione o namespace e a configuração abaixo no application-context.xml.

<beans xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  <context:annotation-config />

Isso deve ser suficiente para que seja possível injetar beans do Spring no Web-Service utilizando a annotation @Autowire.

 @Stateless
 @Interceptors(SpringBeanAutowiringInterceptor.class)
 public class WebService {

   @Autowire
   @Qualifier("springBean")
   private SpringBean bean;

 }

Lembre-se que por padrão, o @Autowire faz um bind por tipo. Caso queira fazê-lo por nome, você deve especificar a annotation @Qualifier para qualificar o bean a ser injetado.