La traque de la cause du Printemps “pas admissibles pour l'auto-proxy”
Lorsque vous commencer à déconner avec le Printemps de l'auto-proxy choses, vous souvent ce comportement comme l'a documenté:
Des Classes qui implémentent l'
BeanPostProcessor interface sont
particulière, et si elles sont traitées
différemment par le conteneur. Tous
BeanPostProcessors et leur directement
référencé haricots seront instanciés
au démarrage, en tant que partie de la spéciale
phase de démarrage de l'
ApplicationContext, puis tous ceux
BeanPostProcessors sera enregistré
dans un triées de la mode et appliquée à
tous les autres haricots. Depuis AOP
auto-proxy est mis en œuvre comme un
BeanPostProcessor lui-même, pas de
BeanPostProcessors ou directement
référencé haricots sont admissibles pour
auto-proxy (et donc n'aura pas de
aspects de la 'tissé' en eux.Pour toute bean, vous devriez voir un
info message de journal: “Haricot "toto" n'est pas
admissibles pour l'obtention de traités par tous
BeanPostProcessors (par exemple: non
admissible pour l'auto-proxy)”.
En d'autres termes, si j'écris mes propres BeanPostProcessor, et que la classe fait directement référence à d'autres haricots dans le contexte, puis ceux qui sont référencés les haricots ne seront pas admissibles pour l'auto-proxy, et un message est enregistré à cet effet.
Mon problème est que la traque où la référence directe est peut être très difficile, depuis la "référence directe" peut en fait être une chaîne de dépendances transitives qui finit par se prendre dans la moitié des haricots dans le contexte de l'application. Tout le Printemps vous donne, c'est que seul message info, et ce n'est pas vraiment beaucoup d'aide, au-delà de vous dire quand un haricot a été pris dans ce réseau de références.
La BeanPostProcessor je suis en développement n'ont direct des références à d'autres haricots, mais c'est un ensemble très limité de références. Malgré cela, presque tous les haricots dans mon contexte est alors d'être exclus de l'auto-déterminées, selon le journal, les messages, mais je ne vois pas où cette dépendance qui se passe.
Quelqu'un a trouvé une meilleure façon d'assurer le suivi de ce bas?
- Vous pouvez également obtenir ce message d'information pour
PersistenceExceptionTranslator
classes.
Vous devez vous connecter pour publier un commentaire.
Suivez cette recette:
BeanPostProcessorChecker
dans votre IDE (c'est un intérieur de classe deAbstractApplicationContext
)if (logger.isInfoEnabled()) {
dans la méthodepostProcessAfterInitialization
Quand vous frappez le point d'arrêt, regardez pour les appels à
getBean(String,Class<T>)
dans votre trace de la pile.L'un de ces appels vous essayez de créer un
BeanPostProcessor
. Que bean devrait être le coupable.Fond
Imaginez cette situation:
Quand le Printemps est de créer
config
(puisque c'est une dépendance deFooPP
), il a un problème: Le contrat dit que tous lesBeanPostProcessor
doit être appliquée à chaque bean est en cours de création. Mais quand le Printemps des besoinsconfig
, il y a au moins un PP (à savoirFooPP
) qui n'est pas prêt pour le service!Cela devient encore pire lorsque vous utilisez un
@Configuration
classe pour définir ce bean:Chaque classe de configuration est un haricot. Que signifie construire un bean factory de
BadSpringConfig
, le Printemps doit appliquer le post-processeurfooPP
mais pour ce faire, il doit d'abord le haricot usine ...Dans cet exemple, il est possible de casser une des dépendances cycliques. Vous pouvez faire
FooPP
mettre en œuvreBeanFactoryAware
pour obtenir Printemps injecter leBeanFactory
dans le post-processeur. De cette façon, vous n'avez pas besoin d'permettra à l'autowiring.Plus tard dans le code, vous pouvez paresseusement demander le haricot:
(source pour LazyInit)
Pour briser le cycle entre le bean factory et le post-processeur, vous devez configurer le post-processeur dans un fichier de configuration XML. Le printemps peut lire et construire toutes les structures sans se confondre.
LazyInit
est thead coffre-fort, donc oui.BeanPostProcessorChecker
a depuis été déplacé àPostProcessorRegistrationDelegate
classe de Spring Framework 4Juste à apporter un peu de fermeture pour cette question, l'effondrement de l'objet non initialisé graphique a été causé par le
BeanPostProcessor
à l'aide de@Autowired
pour obtenir ses dépendances, et les autowire mécanisme efficace causées tous les autres bean définition être initialisée avant monBeanPostProcessor
eu la chance d'avoir un mot à dire en la matière. La solution est de ne pas utiliser permettra à l'autowiring pour votre BPPs.Ne sais pas si c'est utile, mais l'Éclipse Spring IDE's
la vue du graphique ressemble à cela pourrait être utile dans le tri des haricots références..