Le Printemps de l'AOP Proxy qui n'est pas
J'ai deux Printemps proxys mis en place:
<bean id="simpleBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="simpleBeanTarget"/>
</property>
<property name="interceptorNames">
<list>
<value>cacheInterceptor</value>
</list>
</property>
</bean>
<bean id="springDao" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="springDaoTarget"/>
<property name="interceptorNames">
<list>
<value>daoInterceptor</value>
</list>
</property>
</bean>
simpleBean fonctionne très bien -- springDao ne pas.
La SpringDao classe ressemble à:
public class SpringDao extends JdbcDaoSupport {
private SimpleJdbcTemplate simpleJdbcTemplate;
public SimpleJdbcTemplate getSimpleJdbcTemplate() {
if (simpleJdbcTemplate==null) {
simpleJdbcTemplate= new SimpleJdbcTemplate(getDataSource());
}
return simpleJdbcTemplate;
}
...
Et j'ai mon test de l'unité autocâblés comme ceci:
@Autowired
@Qualifier("springDao")
protected SpringDao springDao;
Et la première indication que quelque chose est mauvais, c'est que je reçois cette erreur:
Ne pouvait pas autowire champ: . . . imbriquée
exception est
java.lang.IllegalArgumentException
Si j'en commentaire le @Qualifier d'annotation et d'exécuter mon unité de refaire le test, j'obtiens ceci:
Pas unique bean de type attendu ...
unique correspondant bean, mais trouvé 2:
[springDaoTarget, springDao]
Qu'est ce que j'attendais.
Et j'ai donc changé permettra à l'autowiring à
@Autowired
@Qualifier("springDaoTarget")
protected SpringCustomerCapacityDao springDao;
Et a ajouté ce qui suit à mon test de l'unité:
Object proxy = applicationContext.getBean("springDao");
Assert.assertNotNull(proxy);
Assert.assertTrue(proxy instanceof SpringDao);
Et la instanceof test a échoué, ce qui (pour moi) signifie que mon proxy n'est pas vraiment mon proxy.
Donc, je suis confus. Ce qui se passe? Comment puis-je résoudre ce problème?
Modifier Ici est la demande springDaoTarget définition, qui va décevoir beaucoup de gens:
<bean id="springDaoTarget" class="com.company.SpringDao">
Ouais c'est vrai. Printemps 1.0 avec @Autocâblés 😉
OriginalL'auteur MikeHoss | 2008-11-20
Vous devez vous connecter pour publier un commentaire.
Si la cible de votre proxy met en œuvre au moins une interface de Printemps du comportement par défaut est de créer un JDK Proxy qui implémente toutes les interfaces de la cible. Cela signifie qu'il ne sera pas une sous-classe de la classe cible. Vous pouvez la remplacer en forçant la création de CGLIB procurations au lieu qui sont dynamiques sous-classes de la cible.
En règle générale, si vous allez à l'utilisation de l'AOP, mais seulement utiliser les interfaces de façon limitée, vous aurez envie de forcer CGLIB. Sinon, vous aurez beaucoup de JDK Procurations dans votre conteneur qui ne sont pas du même type que le haricot implémentations que vous avez chargé.
Voir Cliff Meyers blog: Spring AOP: CGLIB ou JDK Proxies Dynamiques?
OriginalL'auteur cliff.meyers
Il était facile à corriger, une fois j'ai tout compris. SpringDao plus hérite de JdbcDaoSupport et maintenant ça fonctionne.
OriginalL'auteur MikeHoss