@Autocâblés et @Service de travail de contrôleur, mais pas à partir d'un autre package
J'ai besoin d'aide pour comprendre le concept derrière @Autowired
et @Service
. J'ai un DAO défini avec @Service
et contrôleur avec @Autowired
et tout semble bien fonctionner, cependant, j'utilise le même @Autowired
dans une classe différente, alors il ne fonctionne pas.
Exemple:
Service
@Service
public class MyService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource (DataSource myDataSource) {
this.jdbcTemplate = new JdbcTemplate(myDataSource);
}
public void testUpdate(){
jdbcTemplate.update("some query");
}
}
Contrôleur
package com.springtest.mywork.controller;
@Controller
@RequestMapping(value = "/test.html")
public class MyController
{
@Autowired
MyService myService;
@RequestMapping(method = RequestMethod.GET)
public String test(Model model)
{
systemsService.testUpdate();
return "view/test";
}
}
Ci-dessus fonctionne très bien. Cependant, Si je veux utiliser MyService
dans un POJO ensuite, il ne fonctionne tout simplement pas. Exemple:
package com.springtest.mywork.pojos;
public class MyPojo {
@Autowired
MyService myService;
public void testFromPojo () {
myService.someDataAccessMethod(); //myService is still null
}
}
Printemps Config:
<beans>
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<context:component-scan base-package="com.springtest.mywork" />
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb" />
<property name="username" value="hello" />
<property name="password" value="what" />
</bean>
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
</beans>
- Est
MyPojo
instancié par le Printemps? - Je n'ai pas fait n'importe quoi pour
MyController
dans config.xml donc, je ne l'ai pas fait pourMyPojo
soit. Que dois-je faire? - Vous pouvez poster votre Printemps config?
- mise à jour avec le printemps config ajoutée au bas
Vous devez vous connecter pour publier un commentaire.
C'est parce que votre classe POJO n'est pas géré par le printemps conteneur.
@Autowire
annotation fonctionnera uniquement les objets qui sont gérés par un ressort (ie créé par le printemps conteneur).Dans votre cas, le service et objet de contrôleur sont gérés par le printemps, mais votre classe POJO n'est pas géré par le printemps, c'est pourquoi le
@Autowire
n'est pas de produire le comportement attendu par vous.Un autre problème que j'ai remarqué, c'est que, vous êtes à l'aide de la
@Service
annotation dans le DAO couche quand le printemps a la@Repository
annotation spécifiquement créée à cet effet.Aussi il n'est pas souhaitable de permettre de printemps pour gérer les classes POJO, car, normalement, il sera de données des éléments de stockage qui doit être créé à l'extérieur du récipient.
Pouvez-vous nous dire quel est le but de la classe POJO et pourquoi le
service
exemple, est utilisé dans tout ça?@Repository
au lieu de@Service
. Dans mon pojo je veux faire quelques requêtes à la base de données. C'est tout simplement pourquoi je veux utilisermyService
dans mon POJO. S'il vous plaît laissez-moi savoir si il ya une meilleure façon de le faire? Tout ce que je veux faire de mon POJO est d'exécuter des requêtes à la base de donnéesMyPojo p = new MyPojo(); p.testFromPojo();
MyPojo p = new MyPojo(myService); p.testFromPojo()
alors maintenantMyPojo
aura un constructeur qui prend une instance demyService
@Autowired
ne fonctionnera pas, vous devez créer une méthode de définition et d'appeler la méthode d'initialisation du contrôleur aprèsMyPojo p = new MyPojo()
est fait.Lors de l'utilisation de classpath de l'analyse, vous devez communiquer au Printemps les classes à gérer. Ceci est fait en utilisant la
@Service
d'annotation et de ses relations (@Controller
,@Repository
, etc).Si vous choisissez pas annoter votre bean, vous devez déclarer explicitement dans votre config, juste comme vous l'avez fait avec
dataSource
etjdbcTemplate
.L'annotation des classes signifie que uniquement les classes dans le package sont gérés par le Printemps; qui vous permet de numériser un lot sans avoir à gérer tous les classes de ce package.
@Service
ou@Repository
ou@Controller
?@Service
est la plupart des non-spécifique, de sorte que ce que j'avais utiliser.com.springtest.mywork.controller
et pojo est danscom.springtest.mywork.mypojo
. Au printemps config j'ai<context:component-scan base-package="com.springtest.mywork" />
donc je suis en supposant que les deux sous-paquetagescontroller
etmypojo
doivent être numérisés...?<context:annotation-config>
(comme @Pradeep mentionne ci-dessous)De les inclure dans applicationContext.xml fichier
Vous pouvez mettre en œuvre pour utiliser le printemps-géré les haricots dans votre classe POJO.
http://www.javacodegeeks.com/2015/03/using-spring-managed-bean-in-non-managed-object.html
vérifier votre contexte composant d'analyse dans votre fichier de configuration