Inhaltsverzeichnis
@Bean 注解方法执行策略 " >@Bean 注解方法执行策略
@Component 注解 " >@Component 注解
示例 1:调用@Configuration类中的@Bean注解的方法,返回的是同一个示例" >示例 1:调用@Configuration类中的@Bean注解的方法,返回的是同一个示例
示例 2 :调用@Component类中的@Bean注解的方法,返回的是一个新的实例。" >示例 2 :调用@Component类中的@Bean注解的方法,返回的是一个新的实例。
Heim Java javaLernprogramm Interviewer: Der Unterschied zwischen @Configuration und @Component

Interviewer: Der Unterschied zwischen @Configuration und @Component

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

Gestern berichtete mir ein Freund, dass er während des Interviews nach Anmerkungen gefragt wurde@Configuration@Configuration@Component 的区别。

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

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

@Component
.


In einem Satz ist es@Bean Die mit Anmerkungen versehenen Methoden werden dynamisch als Proxy verwendet, sodass der Aufruf dieser Methode dieselbe Instanz zurückgibt.

Verstehen: Rufen Sie <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);font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>@ Bean Die mit Code> annotierte Methode gibt eine neue Instanz zurück.

🎜“🎜🎜Hinweis: Der oben genannte Aufruf wird nicht aus dem Federcontainer erhalten. Siehe Beispiel 1 und Beispiel 2 unten. 🎜🎜🎜 Sehen Sie sich die Implementierungsdetails unten an. 🎜

@Konfiguration 注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    String value() default "";
}
Nach dem Login kopieren

从定义来看, @Configuration注解本质上还是@Component,因此 @ ComponentScan 都能处理@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());
    }

}
Nach dem Login kopieren

相信大多数人第一次看到上面 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());
    }

}
Nach dem Login kopieren

有些特殊情况下,我们不希望 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);
    }

}
Nach dem Login kopieren

这种方式可以保证使用的同一个 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;
 }
}
Nach dem Login kopieren

第二个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;
 }
}
Nach dem Login kopieren

@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();
 }
}
Nach dem Login kopieren

测试类 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 ? "是同一个对象":"不是同一个对象");
 }
}
Nach dem Login kopieren

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

Interviewer: Der Unterschied zwischen @Configuration und @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 ? "是同一个对象":"不是同一个对象";
 }
}
Nach dem Login kopieren

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

Interviewer: Der Unterschied zwischen @Configuration und @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();
 }
}
Nach dem Login kopieren

测试 :

Interviewer: Der Unterschied zwischen @Configuration und @Component

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

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

Das obige ist der detaillierte Inhalt vonInterviewer: Der Unterschied zwischen @Configuration und @Component. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Interviewer: Der Unterschied zwischen @Configuration und @Component Interviewer: Der Unterschied zwischen @Configuration und @Component Aug 15, 2023 pm 04:29 PM

Der Aufruf der annotierten Methode @Bean in der Klasse @Configuration gibt das gleiche Beispiel zurück; der Aufruf der annotierten Methode @Bean in der Klasse @Component gibt eine neue Instanz zurück.

Wie vue3 die Tags defineAsyncComponent und Component verwendet, um dynamische Rendering-Komponenten zu implementieren Wie vue3 die Tags defineAsyncComponent und Component verwendet, um dynamische Rendering-Komponenten zu implementieren May 12, 2023 pm 05:55 PM

1. Grundlegende dynamische Einführung von Komponenten: Einfache dynamische Einführung bedeutet, dass das Front-End weiß, welche Komponenten eingeführt werden müssen, und mehrere Komponenten in die übergeordnete Komponente einführt, diese jedoch nicht rendert, nachdem bestimmte Bedingungen erfüllt sind Ort angegebene Komponente. import{reactive,ref,shallowReactive,onActivated,defineAsyncComponent,}from'vue';constcustomModal=defineAsyncComponent(()=>import('./modal/CustomM

Tipps zur Verwendung von Mixin, Extend, Component und anderen APIs zur Implementierung der Komponentenanpassung in Vue Tipps zur Verwendung von Mixin, Extend, Component und anderen APIs zur Implementierung der Komponentenanpassung in Vue Jun 25, 2023 pm 03:28 PM

Vue.js ist ein beliebtes Front-End-Framework, das viele APIs für die Komponentenanpassung bereitstellt. In diesem Artikel werden die APIs Mixin, Extend, Component und andere in Vue vorgestellt, um Ihnen dabei zu helfen, die Fähigkeiten der Komponentenanpassung zu erlernen. Mixin Mixin ist eine Möglichkeit, Komponentencode in Vue wiederzuverwenden. Dadurch können wir bereits geschriebenen Code in verschiedenen Komponenten wiederverwenden und so die Notwendigkeit reduzieren, doppelten Code zu schreiben. Beispielsweise können wir Mixins verwenden, um mehrere Gruppen zusammenzuführen

Was sind die Einsatzszenarien von @Configuration in Java? Was sind die Einsatzszenarien von @Configuration in Java? Apr 21, 2023 am 10:37 AM

1. Kurze Einführung: @Configuration-Annotationen können für eine Klasse annotiert werden. Wenn sie für eine Klasse annotiert werden, scannt Spring automatisch die mit @Configuration-Annotationen versehene Klasse, registriert sie im IOC-Container und instanziiert sie in einem Bean-Objekt. Wenn die mit der Annotation @Configuration annotierte Klasse eine Methode zum Erstellen eines mit der Annotation @Bean annotierten Klassenobjekts enthält, führt Spring auch automatisch die mit der Annotation @Bean annotierte Methode aus und registriert die entsprechenden Bean-Definitionsinformationen im IOC-Container Instanziieren Sie es. 2. Anmerkungsbeschreibung @Configuration-Annotation ist ein Tool, das seit der Spring 3.0-Version hinzugefügt wurde.

Automatische Springboot-Konfiguration und @Configuration-Konfigurationsklasseninstanzanalyse Automatische Springboot-Konfiguration und @Configuration-Konfigurationsklasseninstanzanalyse May 14, 2023 pm 06:25 PM

@Configuration Hinweis 1: Die Konfigurationsklasse (diese Klasse unter @Configuration) entspricht tatsächlich einer Factory. Die mit der @Bean-Annotation gekennzeichnete Methode entspricht der Factory-Methode: @Configuration // Hinweis 1: Die Konfiguration Die Klasse entspricht tatsächlich einer Factory. Die mit der Annotation @Bean gekennzeichnete Methode entspricht der Factory-Methode staticclassMyConfig{@BeanpublicBean1bean1(){System.out.println("bean1()");returnnewBean1();} Wenn Sie Ich möchte in Zukunft eine Instanz von bean1 generieren

Was tun, wenn „react.component' einen Fehler meldet? Was tun, wenn „react.component' einen Fehler meldet? Dec 20, 2022 am 10:49 AM

Lösung für den Fehler „react.component“: 1. Öffnen Sie die entsprechende Reaktionsdatei, suchen Sie nach der Anweisung „class Counter erweitert Component {static propTypes = {...“ und ändern Sie das Gleichheitszeichen in einen Doppelpunkt. 2. Ändern Sie „{; „presets“: [„react“, „es2015“, „stage-0“]}“ reicht aus.

Was ist die Komponente von React? Was ist die Komponente von React? Dec 05, 2022 pm 05:54 PM

In React bedeutet Komponente auf Chinesisch „Komponente“. Dabei handelt es sich um eine gekapselte UI-Komponente mit unabhängigen Funktionen. Der anzuzeigende Inhalt ist in mehrere unabhängige Teile unterteilt, und jeder dieser Teile ist eine Komponente. Komponenten haben zwei wichtige Dinge: zum einen Eigenschaften und zum anderen den Zustand. Die Eigenschaften einer Komponente werden ihr von der übergeordneten Komponente zugewiesen und speichern die Anforderungen der übergeordneten Komponente an die untergeordnete Komponente. Auf die Eigenschaften kann innerhalb der Komponente zugegriffen werden, der Status der Komponente kann jedoch nicht geändert werden durch die Komponente selbst zur Speicherung. Der aktuelle Zustand der Komponente kann geändert werden.

So verwenden Sie @Configuration- und @bean-Annotationen in Springboot So verwenden Sie @Configuration- und @bean-Annotationen in Springboot May 12, 2023 pm 02:46 PM

Die Annotation @Configuration kann den Effekt der Verwendung der XML-Konfigurationsdatei in Spring erzielen. Im Spring-Projekt integrieren wir Frameworks von Drittanbietern wie Shiro und konfigurieren sie in der Spring.xml-Konfiguration Datei, zum Beispiel: / css/**=anon/js/**=anon/validatecode.jsp*=anon/images/**=anon/login.jsp=anon/service/**=anon/**= authc lässt sich in Shiro in Springboot integrieren: @Configurationpublic

See all articles