Comment instancier printemps haricots contrôlés au moment de l'exécution?
J'ai collé avec un simple de la plaine de java pour le printemps. Demande a un "Conteneur" de l'objet qui instancie ses parties lors de l'exécution. Laissez-moi vous expliquer avec le code:
public class Container {
private List<RuntimeBean> runtimeBeans = new ArrayList<RuntimeBean>();
public void load() {
//repeated several times depending on external data/environment
RuntimeBean beanRuntime = createRuntimeBean();
runtimeBeans.add(beanRuntime);
}
public RuntimeBean createRuntimeBean() {
//should create bean which internally can have some
//spring annotations or in other words
//should be managed by spring
}
}
En gros, lors du chargement du conteneur demande à un système externe à lui fournir des informations sur le nombre et la configuration de chaque RuntimeBean et puis c'est de créer les haricots selon les spec.
Le problème est: quand on n'en ressort
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfiguration.class);
Container container = (Container) context.getBean("container");
notre objet est entièrement configuré et avoir toutes les dépendances injecté. Mais dans mon cas, j'ai pour instancier des objets, qui doit également l'injection de dépendance après j'exécute la méthode load ().
Comment puis-je y parvenir?
Je suis à l'aide de java à base de config. J'ai déjà essayé de faire une usine pour RuntimeBeans:
public class BeanRuntimeFactory {
@Bean
public RuntimeBean createRuntimeBean() {
return new RuntimeBean();
}
}
attend @Bean pour travailler dans de soi-disant 'lite' mode. http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html Malheureusement, je n'ai trouvé aucune différence avec simplement faire de nouvelles RuntimeBean();
Voici un post avec un problème similaire: Comment obtenir des haricots créé par l'interface factorybean printemps-ils gérés?
Il est également http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/annotation/Configurable.html mais il ressemble à un marteau dans mon cas.
J'ai aussi essayé ApplicationContext.getBean("runtimeBean", args) où runtimeBean a un "Prototype", mais getBean est un affreux solution.
Upd1.
Pour être plus concret, je suis en train de revoir cette classe:
https://github.com/apache/lucene-solr/blob/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@see #méthode load() et de trouver "retour créer(cd, false);"
Upd2.
J'ai trouvé très intéressant appelé "méthode de recherche injection" au printemps de la documentation:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-lookup-method-injection
Et également un intéressant jira billet https://jira.spring.io/browse/SPR-5192 où Phil Webb dit https://jira.spring.io/browse/SPR-5192?focusedCommentId=86051&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-86051 que javax.injecter.Le fournisseur doit être utilisée ici (ça me rappelle Guice).
Upd3.
Il est également http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/ServiceLocatorFactoryBean.html
Upd4.
Le problème avec tous ces "recherche" méthodes est qu'elles ne prennent pas en charge la transmission des arguments.. j'ai aussi besoin de passer des arguments comme je le ferais avec applicationContext.getBean("runtimeBean", arg1, arg2). Regarde comme il a été fixé à un certain point avec https://jira.spring.io/browse/SPR-7431
Upd5. Google Guice ont une fonction propre pour qu'il appelle AssistedInject. https://github.com/google/guice/wiki/AssistedInject
Pourriez-vous expliquer davantage sur ce que vous aimeriez faire?
Pas vrai si l'objet est renvoyé par l'intermédiaire d'un bien intercepté
@Bean
méthode, par exemple sur une classe de configuration. Cela sonne un peu comme un XY problème, cependant, et quelque chose comme le Printemps Nuage des Connecteurs peut être une meilleure option.D'accord, Java Configuration nécessite l'opérateur new. J'ai été plus se référant à la
Container
classe et de son utilisation de new
. Cela ne va pas voler avec le Printemps.Vous êtes tous de droite, ma question est comment la refonte du code pour le faire fonctionner. Ce que je voudrais faire? J'aimerais en quelque sorte redisign le code de définir exécution des haricots dans de configuration (mais comment faire si je ne sais même pas le nombre et les propriétés d'un haricots) ou d'avoir une usine qui pourrait créer les fèves au moment de l'exécution avec le fait de remplir le printemps de tissage... en Fait, je ne sais pas, j'ai besoin de quelqu'un pour lui expliquer comment faire les choses.
OriginalL'auteur Vadim Kirilchuk | 2015-01-07
Vous devez vous connecter pour publier un commentaire.
Semble que j'ai trouvé une solution. Comme je suis à l'aide de java à base de configuration, il est encore plus simple que vous pouvez imaginer. Alternative à xml serait la recherche de la méthode, mais seulement à partir du printemps de la version 4.1.X comme il prend en charge les arguments passés à la méthode.
Ici est un exemple de travail:
.
Merci à tous.
Java l'approche fondée sur le travail, même sur des versions antérieures, suis-je raté quelque chose?
sssBefore il n'a pas accepté les arguments pour le constructeur, il a été résolu depuis 4.1.4
Avant qu'il n'accepte pas les arguments pour le constructeur, il a été résolu depuis 4.1.4. Vous devez vous rappeler que, en appelant retour runtimeBean(beanName); vous n'êtes pas à appeler votre méthode runtimeBean directement, mais plutôt d'appel de l'instanciation de la méthode sur le haricot usine qui est responsable de la création de cette fève au Printemps contexte, et les arguments sont résolus par l'usine avant qu'ils sont passés à la réelle bean.En cas de '@Bean " et " @Configuration des annotations de l'ensemble du processus est intercepté par ConfigurationClassEnhancer.BeanFactoryAwareMethodInterceptor et il décide de la façon d'instancier votre bean.
Merci pour les détails
OriginalL'auteur Vadim Kirilchuk
je pense que votre concept est mal en utilisant
RuntimeBean beanRuntime = createRuntimeBean();
vous êtes en contournant le Printemps de conteneurs et de recourir à l'aide de java ordinaire constructeur par conséquent, toutes les annotations sur l'usine de la méthode sont ignorés et le haricot n'est jamais géré par le Printemps
voici la solution pour créer plusieurs prototypes de haricots dans une méthode, pas assez à la recherche, mais devrait fonctionner, je autocâblés conteneur dans RuntimeBean comme preuve de permettra à l'autowiring indiqué dans le journal aussi vous pouvez voir dans le journal que chaque fève est la nouvelle instance de prototype lorsque vous exécutez cette .
'
Un autre problème est que mon prototype portée du bean est paramétrée avec certains paramètres. ObjectFactory#getObject() doensn permettent pas de passer des paramètres.
OriginalL'auteur mariubog
Vous n'avez pas besoin de la
Container
parce que tous les objets de l'exécution devrait être créé, organisé et géré parApplicationContext
. Pensez à une application web, ils sont à peu près les mêmes. Chaque demande contient de données externes/environnement info comme vous l'avez mentionné ci-dessus. Ce que vous avez besoin est un prototype/portée de la requête bean comme desExternalData
ouEnvironmentInfo
qui peut lire et maintenez-les données d'exécution par le biais d'un statique façon, disons, d'une statique de la méthode de fabrique.Si vous avez besoin d'un conteneur pour enregistrer les objets de l'exécution, le code devrait être
Officiel doc Singleton haricots avec le prototype de grain de dépendances.
OriginalL'auteur Anderson
Il est possible d'enregistrer les haricots dynamiquement en utilisant
BeanFactoryPostProcesor
. Ici, vous pouvez le faire lors de l'application est en cours de démarrage (printemps du contexte de l'application est en étant initialisé). Vous ne pouvez pas enregistrer les haricots latet, mais d'un autre côté, vous pouvez utiliser l'injection de dépendance pour les haricots, qu'ils deviennent de "vrai" Printemps des haricots.Tel que présenté ci-dessus, vous pouvez toujours utiliser le Printemps de l'Injection de Dépendance, parce que le post-processeur travaille à la mise en Contexte de l'Application.
OriginalL'auteur walkeros
Une approche simple:
Au lieu d'utiliser SingletonBeanRegistry vous pouvez utiliser ceci:
De toute façon SingletonBeanBuilder s'étend HierarchicalBeanFactory et HierarchicalBeanFactory s'étend BeanFactory
OriginalL'auteur Rzv Razvan