Printemps - création d'objets avec le nouvel opérateur à l'aide de @Configurable & @Valeur des annotations
Est-il possible d'utiliser @Configurable sur une classe qui est tissé à l'aide de AspectJ et que le Printemps pour charger des valeurs de champs/méthodes annotées avec @Valeur?
Je sais que c'est possible avec @Autocâblés et @Resource etc... Sont d'autres.
par exemple
@Configurable
public Class MyObj{
@Value("$(my.prop)")
private String aField;
public String getAField(){
return aField;
}
}
Et puis avoir quelque chose comme
public aMethodSomewhereElse(){
MyObj obj = new MyObj()
assertNotNull(obj.getAField());
}
Existe-il des alternatives à être en mesure de créer MyObj
avec le new
opérateur et toujours obtenir de printemps pour gérer les annotations?
--EDIT:--
Il EST possible de le faire à l'aide de new
lors de l'utilisation de @Autocâblés, ont un oeil à quelques-Hibernate et JPA trucs avec le Printemps et l'AOP... j'ai utilisé dans le passé pour faire quelques profilage de code Java. Mais j'ai vraiment envie d'utiliser SPEL et @Valeur avant de se moquer d'un exemple complet j'espérais trouver la réponse ici. Pour info si vous n'avez pas confiance en moi, le Printemps Manuel dit même qu'il est possible de le faire, ce que je veux savoir c'est si il est possible d'utiliser @Valeur annotations dans le même champ...
Le Printemps conteneur instancie et configure les haricots définis dans votre
contexte de l'application. Il est également possible de demander un haricot usine à
configurer un objet préexistant donné le nom d'un haricot définition
contenant la configuration à appliquer. L'spring-aspects.jar
contient une annotation-driven aspect qui exploite cette capacité à
permettre l'injection de dépendance de tout objet.
Et...
À l'aide de l'annotation sur sa propre n'a rien de sûr. C'est le
AnnotationBeanConfigurerAspect dans spring-aspects.jar qui agit sur le
la présence de l'annotation. Dans l'essence de l'aspect dit "après
de retour de l'initialisation d'un nouvel objet de type annoté
avec @Configurable, configurer l'objet nouvellement créé à l'aide de Printemps dans
conformément aux propriétés de l'annotation". Dans ce contexte,
l'initialisation se réfère à de nouveaux objets instanciés (par exemple, objets
instanciée avec le "nouvel" opérateur) ainsi que Serializable
des objets qui font l'objet de la désérialisation (par exemple, via readResolve()).
http://static.springsource.org/spring/docs/3.0.0.RC2/reference/html/ch07s08.html
Acclamations.
new
opérateur et demander printemps à autowire propriétés. Je pense que 1 façon de résoudre ce problème est d'obtenir une référence statique pour applicationContext
et de créer un prototype
étendue de haricot.Ceci EST possible en utilisant AspectJ et @Configurable annotation comme mentionné dans ma question. Voir le printemps manuel: static.springsource.org/spring/docs/3.0.0.RC2/reference/html/...
OriginalL'auteur NightWolf | 2013-02-27
Vous devez vous connecter pour publier un commentaire.
Vous avez absolument raison -
@Autowired
champs sera câblé dans un@Configurable
annoté de la classe, même en dehors d'un Ressort conteneur, en supposant que vous avez un AspectJ de l'infrastructure en place.Vous avez noté une bonne hic cependant,
@Value
champs sont traitées par un Ressort de haricots post-processeur(AutowiredAnnotationBeanPostProcessor), ce qui résout le@Value
annoté champs. Il n'est pas d'agir sur les objets instanciés à l'extérieur du contenant, mais - en bref, l' @Autocâblés champs doit être raccordée, mais@Value
propriétés ne va pas.Je pense que de quelques options, dont l'un sera pour l'injecter dans un
Environment
qui est rempli à l'aide d'un@PropertySource
annotation, la deuxième option pourrait être d'utiliser un<util:properties id="props"
avec les propriétés que vous souhaitez et autowire dansProperties
exemple, vous pouvez alors faireprops.getProperty(name)
des appels explicites dans votre code. Ces deux solution essentiellement de dérivationPropertyPlaceHolderConfigurer
OriginalL'auteur Biju Kunjummen
Faire
signifie que obj n'est pas géré par le printemps, donc il ne va pas faire permettra à l'autowiring.
Seule façon de le faire est d'obtenir de l'instance à partir d'un contexte d'application. Par exemple:
OriginalL'auteur DominikM
Je ne pense pas qu'il est possible d'utiliser
new
opérateur et demander printemps à autowire propriétés. Je pense que 1 façon de résoudre ce problème est d'obtenir une référence statique pourapplicationContext
et de créer un prototype d'étendue de haricot.OriginalL'auteur Arun P Johny