Je comprends que l' @Component
annotation a été introduite au printemps 2.5 afin de se débarrasser de la définition du bean xml en utilisant l'analyse de chemin de classe.
@Bean
a été introduit au printemps 3.0 et peut être utilisé avec @Configuration
pour se débarrasser complètement du fichier xml et utiliser la configuration java à la place.
Aurait-il été possible de réutiliser l' @Component
annotation au lieu d'introduire une @Bean
annotation? Je crois comprendre que l'objectif final est de créer des beans dans les deux cas.
java
spring
annotations
autowired
user1396576
la source
la source
@Component
,@Repository
et@Service
annotations au printemps?Lite mode
. Et ce n'est pas recommandé. Voir ici: docs.spring.io/spring/docs/current/spring-framework-reference/…@bean
renvoie une instance personnalisable de Spring Bean, tout en@component
définissant une classe qui peut être instanciée plus tard par le moteur Spring IoC en cas de besoin.Réponses:
@Component
et@Bean
faire deux choses très différentes, et ne doit pas être confondu.@Component
(et@Service
et@Repository
) sont utilisés pour détecter et configurer automatiquement les beans à l'aide de l'analyse de chemin de classe. Il existe un mappage un à un implicite entre la classe annotée et le bean (c'est-à-dire un bean par classe). Le contrôle du câblage est assez limité avec cette approche, car il est purement déclaratif.@Bean
est utilisé pour déclarer explicitement un seul bean, plutôt que de laisser Spring le faire automatiquement comme ci-dessus. Il dissocie la déclaration du bean de la définition de classe et vous permet de créer et de configurer des beans exactement comme vous le souhaitez.Pour répondre à ta question...
Bien sûr, probablement; mais ils ont choisi de ne pas le faire, car les deux sont très différents. Le printemps est déjà assez déroutant sans embrouiller davantage les eaux.
la source
@Component
lorsque le câblage automatique est nécessaire? Il semble que@Bean
cela ne peut pas affecter@Autowired
@Autowired
avec@Bean
si vous avez annoté votre classe de haricots avec@Configuration
@Component Préférable pour la numérisation des composants et le câblage automatique.
Quand devriez-vous utiliser @Bean ?
Parfois, la configuration automatique n'est pas une option. Quand? Imaginons que vous souhaitiez câbler des composants à partir de bibliothèques tierces (vous n'avez pas le code source, vous ne pouvez donc pas annoter ses classes avec @Component), donc la configuration automatique n'est pas possible.
L' annotation @Bean renvoie un objet que spring devrait enregistrer en tant que bean dans le contexte de l'application. Le corps de la méthode porte la logique responsable de la création de l'instance.
la source
@Component
va sur les classes elles-mêmes tandis que@Bean
sur les méthodes de classe (qui produisent des instances d'objets de classe).Considérons que je souhaite une implémentation spécifique en fonction d'un état dynamique.
@Bean
est parfait pour ce cas.Cependant, il n'y a aucun moyen de le faire avec
@Component
.la source
@Configuration
la source
Les deux approches visent à enregistrer le type de cible dans le conteneur Spring.
La différence est qu'elle
@Bean
s'applique aux méthodes , alors qu'elle@Component
s'applique aux types .Par conséquent, lorsque vous utilisez une
@Bean
annotation, vous contrôlez la logique de création d'instance dans le corps de la méthode (voir l' exemple ci-dessus ). Avec l'@Component
annotation, vous ne pouvez pas.la source
Je vois beaucoup de réponses et presque partout son @Component mentionné est pour le câblage automatique où le composant est analysé et @Bean déclare exactement que le bean doit être utilisé différemment. Permettez-moi de montrer en quoi c'est différent.
C'est d'abord une annotation au niveau de la méthode. Deuxièmement, vous utilisez généralement pour configurer les beans dans un code java (si vous n'utilisez pas la configuration xml), puis appelez-le à partir d'une classe à l'aide de la méthode getBean d'ApplicationContext. comme
C'est une manière générale d'annoter un bean et non un bean spécialisé. Une annotation au niveau de la classe et est utilisée pour éviter toutes ces choses de configuration via la configuration java ou xml.
Nous obtenons quelque chose comme ça.
C'est ça . Il vient d'être introduit pour éviter toutes les étapes de configuration pour instancier et utiliser ce bean.
la source
@Bean
approche. Vous pouvez toujours utiliser@Autowire
pour obtenir le bean comme vous le feriez en cas de@Component
.@Bean
ajoute simplement le Bean au Spring Container comme le ferait@Component
. La différence est la suivante. 1. À l'aide de@Bean
, vous pouvez ajouter des classes tierces à Spring Container. 2. En utilisant@Bean
, vous pouvez obtenir l'implémentation souhaitée d'une interface au moment de l'exécution (en utilisant le modèle de conception d'usine)Vous pouvez utiliser
@Bean
pour rendre une classe tierce existante disponible pour votre contexte d'application de framework Spring.En utilisant l'
@Bean
annotation, vous pouvez encapsuler une classe tierce (elle peut ne pas avoir@Component
et il ne peut pas utiliser Spring), en tant que bean Spring. Et puis une fois qu'il est encapsulé à l'aide@Bean
, il est en tant qu'objet singleton et disponible dans votre contexte d'application de framework Spring. Vous pouvez désormais facilement partager / réutiliser ce bean dans votre application en utilisant l'injection de dépendance et@Autowired
.Pensez donc à l'
@Bean
annotation est un wrapper / adaptateur pour les classes tierces. Vous souhaitez rendre les classes tierces disponibles pour votre contexte d'application de framework Spring.En utilisant
@Bean
dans le code ci-dessus, je déclare explicitement un seul bean car à l'intérieur de la méthode, je crée explicitement l'objet à l'aide dunew
mot - clé. J'appelle également manuellement les méthodes setter de la classe donnée. Je peux donc changer la valeur du champ préfixe. Ce travail manuel est donc appelé création explicite. Si j'utilise le@Component
pour la même classe, le bean enregistré dans le conteneur Spring aura la valeur par défaut pour le champ préfixe.En revanche, lorsque nous annotons une classe avec
@Component
, pas besoin d'utiliser manuellement lenew
mot - clé. Il est géré automatiquement par Spring.la source
Lorsque vous utilisez la
@Component
balise, c'est la même chose que d'avoir un POJO (Plain Old Java Object) avec une méthode de déclaration de gousse de vanille (annotée avec@Bean
). Par exemple, les méthodes 1 et 2 suivantes donneront le même résultat.Méthode 1
avec un bean pour 'theNumber':
Méthode 2
avec les haricots pour les deux:
La méthode 2 vous permet de conserver les déclarations de bean ensemble, c'est un peu plus flexible, etc. Vous pouvez même ajouter un autre bean SomeClass non vanille comme le suivant:
la source
Vous avez deux façons de générer des beans. L'une consiste à créer une classe avec une annotation
@Component
. L'autre consiste à créer une méthode et à l'annoter avec@Bean
. Pour les classes contenant la méthode avec@Bean
doivent être annotées avec@Configuration
Une fois que vous exécutez votre projet Spring, la classe avec une@ComponentScan
annotation analysera chaque classe avec@Component
et restaurera l'instance de cette classe dans le conteneur Ioc. Une autre chose@ComponentScan
que faire serait d'exécuter les méthodes avec@Bean
et de restaurer l'objet de retour dans le conteneur Ioc en tant que bean. Ainsi, lorsque vous devez décider du type de beans que vous souhaitez créer en fonction des états actuels, vous devez utiliser@Bean
. Vous pouvez écrire la logique et renvoyer l'objet que vous souhaitez. Une autre chose à mentionner est le nom de la méthode avec@Bean
le nom par défaut du bean.la source
la source
@Bean a été créé pour éviter de coupler Spring et vos règles métier lors de la compilation. Cela signifie que vous pouvez réutiliser vos règles métier dans d'autres cadres tels que PlayFramework ou JEE.
De plus, vous avez un contrôle total sur la façon de créer des beans, où il ne suffit pas de l'instanciation Spring par défaut.
J'ai écrit un article pour en parler.
https://coderstower.com/2019/04/23/factory-methods-decoupling-ioc-container-abstraction/
la source
Différence entre le bean et le composant:
la source
1. À propos de @Component
@Component fonctionne de manière similaire à @Configuration.
Ils indiquent tous les deux que la classe annotée a un ou plusieurs beans à enregistrer
Spring-IOC-Container
.La classe annotée par @Component, nous l'appelons
Component of Spring
. C'est un concept qui contient plusieurs beans.Component class
doit être analysé automatiquement par Spring pour enregistrer ces beans de lacomponent class
.2. À propos de @Bean
@Bean est utilisé pour annoter la méthode de
component-class
(comme mentionné ci-dessus). Il indique que l'instance retured par la méthode annotée doit être enregistrée dansSpring-IOC-Container
.3. Conclusion
La différence entre les deux est relativement évidente, ils sont utilisés dans
different circumstances
. L'utilisation générale est:la source
Points supplémentaires des réponses ci-dessus
Disons que nous avons un module qui est partagé dans plusieurs applications et qui contient quelques services. Tous ne sont pas nécessaires pour chaque application.
Si vous utilisez @Component sur ces classes de service et l'analyse des composants dans l'application,
Dans ce cas, vous avez dû ajuster le filtrage de l'analyse des composants ou fournir la configuration que même les beans inutilisés peuvent exécuter. Sinon, le contexte d'application ne démarre pas.
Dans ce cas, il est préférable de travailler avec l'annotation @Bean et d'instancier uniquement ces beans,
Donc, essentiellement, utilisez @Bean pour ajouter des classes tierces au contexte. Et @Component s'il est juste à l'intérieur de votre application unique.
la source