Table des matières
@Bean 注解方法执行策略 " >@Bean 注解方法执行策略
@Component 注解 " >@Component 注解
示例 1:调用@Configuration类中的@Bean注解的方法,返回的是同一个示例" >示例 1:调用@Configuration类中的@Bean注解的方法,返回的是同一个示例
示例 2 :调用@Component类中的@Bean注解的方法,返回的是一个新的实例。" >示例 2 :调用@Component类中的@Bean注解的方法,返回的是一个新的实例。
Maison Java javaDidacticiel Intervieweur : La différence entre @Configuration et @Component

Intervieweur : La différence entre @Configuration et @Component

Aug 15, 2023 pm 04:29 PM
component @configuration

Hier, un ami m'a signalé qu'on lui avait posé des questions sur les annotations lors de l'entretien@Configuration@Configuration@Component 的区别。

一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例。

理解:调用@Configuration类中的@Bean注解的方法,返回的是同一个示例;而调用@Component类中的@Bean et

@Component
.


En une phrase, c'est @Configuration Le tout avec @Bean Les méthodes annotées seront proxy dynamiquement, donc l'appel de cette méthode renverra la même instance.

Compréhension : Appelez @Configuration classe La La méthode annotée @Bean renvoie le même exemple ; lors de l'appel à <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: in class ;">@Component rgba(27 , 31, 35, 0,05) ; famille de polices : "Operator Mono", Consolas, Monaco, Menlo, monospace ; saut de mot : break-all ; couleur : rgb (239, 112, 96);">@ Bean code> La méthode annotée renvoie une nouvelle instance.

🎜« 🎜🎜Remarque : l'appel mentionné ci-dessus n'est pas obtenu à partir du conteneur Spring ! Voir l'exemple 1 et l'exemple 2 ci-dessous🎜🎜🎜Regardez les détails d'implémentation ci-dessous.🎜

@Configuration 注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    String value() default "";
}
Copier après la connexion

从定义来看, @Configuration注解本质上还是@Component,因此 <contexte :component-scan/> 或者 @ ComponentScan 都能处理@Configuration</code >注解的类。<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">@Configuration注解本质上还是@Component,因此 <context:component-scan/> 或者 @ComponentScan 都能处理@Configuration注解的类。

@Configuration

@Configuration标记的类必须符合下面的要求:🎜
  • 配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。
  • 配置类不能是final 类(没法动态代理)。
  • 配置注解通常为了通过 @Bean注解生成 Spring 容器管理的类,
  • 配置类必须是非本地的(即不能在方法中声明,不能是 private)。
  • 任何嵌套配置类都必须声明为static。
  • @Bean方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有 @Configuration,也不会被特殊处理,只会作为普通的 bean)。

@Bean 注解方法执行策略

先给一个简单的示例代码:

@Configuration
public class MyBeanConfig {

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country());
    }

}
Copier après la connexion

相信大多数人第一次看到上面 userInfo() 中调用 country()时,会认为这里的 Country和上面 @Bean方法返回的 Country 可能不是同一个对象,因此可能会通过下面的方式来替代这种方式:

  • @Autowired
  • private Country country;

实际上不需要这么做(后面会给出需要这样做的场景),直接调用country() 方法返回的是同一个实例。

@Component 注解

@Component注解并没有通过 cglib 来代理@Bean 方法的调用,因此像下面这样配置时,就是两个不同的 country

@Component
public class MyBeanConfig {

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country());
    }

}
Copier après la connexion

有些特殊情况下,我们不希望 MyBeanConfig被代理(代理后会变成WebMvcConfig$$EnhancerBySpringCGLIB$$8bef3235293)时,就得用 @Component,这种情况下,上面的写法就需要改成下面这样:

@Component
public class MyBeanConfig {

    @Autowired
    private Country country;

    @Bean
    public Country country(){
        return new Country();
    }

    @Bean
    public UserInfo userInfo(){
        return new UserInfo(country);
    }

}
Copier après la connexion

这种方式可以保证使用的同一个 Country 实例。

示例 1:调用@Configuration类中的@Bean注解的方法,返回的是同一个示例

第一个bean类

package com.xl.test.logtest.utils;

public class Child {
 private String name = "the child";

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }
}
Copier après la connexion

第二个bean类

package com.xl.test.logtest.utils;

public class Woman {
 
 private String name = "the woman";
 
 private Child child;

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public Child getChild() {
  return child;
 }

 public void setChild(Child child) {
  this.child = child;
 }
}
Copier après la connexion

@Configuration

package com.xl.test.logtest.utils;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Configuration
//@Component
public class Human {
 
 @Bean
 public Woman getWomanBean() {
  Woman woman = new Woman();
  woman.setChild(getChildBean()); // 直接调用@Bean注解的方法方法getChildBean()
  return woman;
 }
 
 @Bean
 public Child getChildBean() {
  return new Child();
 }
}
Copier après la connexion

测试类 I

本测试类为一个配置类,这样启动项目是就可以看到测试效果的,更加快捷;也可以使用其他方式测试见下面的测试类 II

package com.xl.test.logtest.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Man {
 
 @Autowired
 public Man(Woman wn, Child child) {
  System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
  System.out.println(wn.getChild() == child ? "是同一个对象":"不是同一个对象");
 }
}
Copier après la connexion

启动项目,查看输出结果:

Intervieweur : La différence entre @Configuration et @Component

测试类 II

package com.xl.test.logtest.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.xl.test.logtest.utils.Child;
import com.xl.test.logtest.utils.Woman;

@RestController
public class LogTestController {
 @Autowired
 Woman woman ;
 
 @Autowired
 Child child;
 
 @GetMapping("/log")
 public String log() {
  return woman.getChild() == child ? "是同一个对象":"不是同一个对象";
 }
}
Copier après la connexion

浏览器访问项目,查看结果;输入localhost:8080/log

Intervieweur : La différence entre @Configuration et @Component

示例 2 :调用@Component类中的@Bean注解的方法,返回的是一个新的实例。

测试代码,只需要将@Configuration改为@Component即可!其他的均不变

package com.xl.test.logtest.utils;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

//@Configuration
@Component
public class Human {
 
 @Bean
 public Woman getWomanBean() {
  Woman woman = new Woman();
  woman.setChild(getChildBean()); // 直接调用@Bean注解的方法方法getChildBean()
  return woman;
 }
 
 @Bean
 public Child getChildBean() {
  return new Child();
 }
}
Copier après la connexion

测试 :

Intervieweur : La différence entre @Configuration et @Component

控制台和浏览器展示,均符合预期!

最后,如果你也需要修改简历,需要模拟面试的。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment vue3 utilise finishAsyncComponent et les balises de composants pour implémenter des composants de rendu dynamique Comment vue3 utilise finishAsyncComponent et les balises de composants pour implémenter des composants de rendu dynamique May 12, 2023 pm 05:55 PM

1. Introduction dynamique de base des composants : une introduction dynamique simple signifie que le frontal sait quels composants introduire et introduit plusieurs composants dans le composant parent, mais ne le restitue pas une fois que certaines conditions sont remplies, il sera rendu à un certain moment. emplacement. import{reactive,ref,shallowReactive,onActivated,defineAsyncComponent,}from'vue';constcustomModal=defineAsyncComponent(()=>import('./modal/CustomM

Intervieweur : La différence entre @Configuration et @Component Intervieweur : La différence entre @Configuration et @Component Aug 15, 2023 pm 04:29 PM

L’appel de la méthode annotée @Bean dans la classe @Configuration renvoie le même exemple ; l’appel de la méthode annotée @Bean dans la classe @Component renvoie une nouvelle instance.

Conseils sur l'utilisation de mixin, extend, composant et autres API pour personnaliser les composants dans Vue Conseils sur l'utilisation de mixin, extend, composant et autres API pour personnaliser les composants dans Vue Jun 25, 2023 pm 03:28 PM

Vue.js est un framework frontal populaire qui fournit de nombreuses API pour la personnalisation des composants. Cet article présentera les API mixin, extend, composant et autres dans Vue pour vous aider à maîtriser les compétences de personnalisation des composants. Mixin Mixin est un moyen de réutiliser le code des composants dans Vue. Cela nous permet de réutiliser du code déjà écrit dans différents composants, réduisant ainsi le besoin d'écrire du code en double. Par exemple, nous pouvons utiliser des mixins pour nous aider à combiner plusieurs groupes

Quels sont les scénarios d'utilisation de @Configuration en Java ? Quels sont les scénarios d'utilisation de @Configuration en Java ? Apr 21, 2023 am 10:37 AM

1. Brève introduction : l'annotation @Configuration peut être annotée sur une classe, lorsqu'elle est annotée sur une classe, Spring analysera automatiquement la classe annotée avec l'annotation @Configuration, l'enregistrera dans le conteneur IOC et l'instanciera dans un objet Bean. Si la classe annotée avec l'annotation @Configuration contient une méthode pour créer un objet de classe annoté avec l'annotation @Bean, Spring exécutera également automatiquement la méthode annotée avec l'annotation @Bean et enregistrera les informations de définition de Bean correspondantes dans le conteneur IOC et. instancier-le. 2. Description de l'annotation L'annotation @Configuration est un outil ajouté depuis la version Spring 3.0.

Que faire si React.component signale une erreur Que faire si React.component signale une erreur Dec 20, 2022 am 10:49 AM

Solution à l'erreur react.component : 1. Ouvrez le fichier de réaction correspondant, recherchez l'instruction "class Counter extends Component {static propTypes = {..." et remplacez le signe égal par deux points ; 2. Modifiez "{" "presets": ["react", "es2015", "stage-0"]}" suffit.

Configuration automatique Springboot et analyse des instances de classe de configuration @Configuration Configuration automatique Springboot et analyse des instances de classe de configuration @Configuration May 14, 2023 pm 06:25 PM

@Configuration Note 1 La classe de configuration (cette classe sous @Configuration) est en fait équivalente à une usine. La méthode marquée avec l'annotation @Bean est équivalente à la méthode factory. Considérons l'exemple suivant : @Configuration//Note 1 : La classe de configuration. est en fait équivalent à une usine, la méthode marquée de l'annotation @Bean est équivalente à la méthode d'usine staticclassMyConfig{@BeanpublicBean1bean1(){System.out.println("bean1()");returnnewBean1();} Si vous le souhaitez. pour générer une instance de bean1 dans le futur

Quel est le composant de réagir ? Quel est le composant de réagir ? Dec 05, 2022 pm 05:54 PM

Dans React, composant signifie « composant » en chinois, qui est un composant d'interface utilisateur encapsulé avec des fonctions indépendantes ; le contenu à afficher est divisé en plusieurs parties indépendantes, et chacune de ces parties est un composant. Les composants ont deux choses importantes, l’une sont les propriétés et l’autre l’état. Les propriétés d'un composant lui sont données par le composant parent et stockent les exigences du composant parent pour le composant enfant. Les propriétés sont accessibles dans le composant, mais elles ne peuvent pas être modifiées. L'état du composant est défini et utilisé. par le composant lui-même pour le stockage. L'état actuel du composant. L'état du composant peut être modifié.

Introduction à la fonction Vue.component et comment enregistrer des composants globaux Introduction à la fonction Vue.component et comment enregistrer des composants globaux Jul 25, 2023 pm 10:54 PM

Introduction à la fonction Vue.component et comment enregistrer des composants globaux Dans le développement Vue, un composant est une instance Vue réutilisable. Le concept de composants est très utile lorsque nous devons utiliser les mêmes éléments ou logiques d’interface utilisateur à plusieurs endroits. Vue fournit la fonction Vue.component pour enregistrer les composants globaux à utiliser dans n'importe quelle instance de Vue. Cet article présentera l'utilisation de la fonction Vue.component et montrera comment enregistrer les composants globaux. Fonction Vue.component

See all articles