2010-11-26 37 views
9

Tengo algunos problemas con la anotación de autowire. Mi aplicación es el siguiente:Spring @Autowired no funciona

Aquí es controlador:

@Controller 
public class MyController { 
    @Autowired 
    @Qualifier("someService") 
    private SomeService someService; 

    .... 
} 

Es una capa de servicio:

public interface SomeService { 
    ... 
} 

@Service 
public class SomeServiceImpl implements SomeService{  
    @Autowired 
    @Qualifier("myDAO") 
    private MyDAO myDAO; 

    .... 
} 

y la capa DAO:

public interface MyDAO{ 
    ....   
} 

@Repository 
public class JDBCDAOImpl implements MyDAO {  
    @Autowired 
    @Qualifier("dataSource") 
    private DataSource dataSource;  
    .... 
} 

Este es un servicio de aplicaciones archivo .xml:

.... 
<bean id="propertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
     p:location="/WEB-INF/jdbc.properties" /> 

<bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     p:driverClassName="${jdbc.driverClassName}" 
     p:url="${jdbc.url}" 
     p:username="${jdbc.username}" 
     p:password="${jdbc.password}"/> 

<bean id="SomeService" class="com.service.SomeServiceImpl" />  
<bean id="myDAO" class="com.db.JDBCDAOImpl" />  

Así que ... Cuando estoy iniciando una aplicación web, MyController realiza el autoenvío correctamente (el campo someService correctamente inyectado por el objeto de clase SomeServiceImpl), pero myDao feild of someService tiene valor nulo (no se ha insertado correctamente).

¿Podrían ayudarme a encontrar un problema?

P.S. Es interesante, pero cuando cambio una "id. De frijol" de myDAO a otra (por ejemplo myDAO2), el sistema me da un error, que no se pudo realizar la inyección, porque bean myDAO no existe. Entonces, Spring hace una inyección, pero ¿dónde está? ¿Y por qué no funciona correctamente?

+0

¿Por qué no utiliza @Service annotation en el servicio y @Repository en el DAO como lo hace con @Controller en el controlador? – Javi

+0

sí ... lo uso. Editado ... Me olvido de escribirlos, porque mi aplicación es más compleja que el código anterior. Pero errores en ese lugar. – Ilnur

+5

si agrega la anotación @Repository y @ Service, no tiene que definirlos en el xml como un bean. Se encontrarán con Javi

Respuesta

9

Encuentro la solución. Como dijo Javi (muchas gracias por ti, Javi), tengo que anotar DAO y las clases de capa de servicio con la anotación @Repository y @Service. Ahora he intentado escribir así:

@Service("someService") 
public class SomeServiceImpl implements SomeService{  
    @Autowired 
    @Qualifier("myDAO") 
    private MyDAO myDAO; 

    .... 
} 

y

@Repository("myDAO") 
    public class JDBCDAOImpl implements MyDAO {  
    @Autowired 
    @Qualifier("dataSource") 
    private DataSource dataSource;  
    .... 
} 

y todo funciona bien !!!

Pero todavía no encontré una respuesta para esta consulta: si la aplicación será más compleja, y tendrá una estructura más compleja, donde la anotación @Repositore y @Service no se prefiere para algunas clases, cómo inyectar correctamente beans, que se encuentra en niveles inferiores (en un campo de clases, o en un campo de campos de clases) (con anotación @Autowire, por supuesto)?

+8

@Component es el que se utiliza para otro componente que no es controlador, servicio o repositorios – Javi

+0

OK. ¡Muchas gracias! Puede poner su comentario como respuesta, y lo verificaré como la solución de mi pregunta. – Ilnur

+0

@Ilnur Marque su respuesta como la aceptada porque ha sido usted quien la ha encontrado, aunque puede votar el comentario si le parece interesante también :) – Javi

4

Supongo que necesita <context:annotation-config />.

+0

Existe en el archivo app-servlet.xml.Algo como esto: Ilnur

+0

Esto resolvió mi problema. Necesita anotación-config para usar las anotaciones – SashikaXP

2
You can use 
<context:component-scan base-package="PATH OF THE BASE PACKAGE"/> entry your configuration .xml file. This entry will scan/read all the stareo type af annotations from the java classes . 
Cuestiones relacionadas