spring - mvc

dkpp發表於2024-03-07

spring mvc

1.@Autowired

@Component
public class FooService {  
    @Autowired
    private FooFormatter fooFormatter;
}

2.透過@Qualifier自動裝配

例如,讓我們看看如何使用@Qualifier註釋來指示所需的 bean。
首先,我們將定義 2 個Formatter型別的 bean :

@Component("fooFormatter")
public class FooFormatter implements Formatter {
    public String format() {
        return "foo";
    }
}
@Component("barFormatter")
public class BarFormatter implements Formatter {
    public String format() {
        return "bar";
    }
}

我們可以透過使用@Qualifier註釋縮小實現範圍來避免這種情況:

public class FooService {
    @Autowired
    @Qualifier("fooFormatter")
    private Formatter formatter;
}

當有多個相同型別的 bean 時,最好使用@Qualifier以避免歧義。
請注意, @Qualifier註釋的值與我們的FooFormatter實現的@Component註釋中宣告的名稱匹配。

3.透過自定義限定符自動裝配

Spring還允許我們建立自己的自定義@Qualifier註釋。為此,我們應該為@Qualifier註釋提供定義:

@Qualifier
@Target({
  ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface FormatterType {  
    String value();
}

然後我們可以在各種實現中使用FormatterType 來指定自定義值:

@FormatterType("Foo")
@Component
public class FooFormatter implements Formatter {
    public String format() {
        return "foo";
    }
}
@FormatterType("Bar")
@Component
public class BarFormatter implements Formatter {
    public String format() {
        return "bar";
    }
}

最後,我們的自定義限定符註釋已準備好用於自動裝配:

@Component
public class FooService {  
    @Autowired
    @FormatterType("Foo")
    private Formatter formatter;
}

@Target元註釋中指定的值限制了限定符的應用位置,在我們的示例中是欄位、方法、型別和引數。

@Qualifier與@Primary
還有另一個名為@Primary的註釋 ,當依賴注入存在歧義時,我們可以使用它來決定注入哪個 bean。
該註釋定義了存在多個相同型別的 bean 時的偏好。除非另有說明,否則將使用與@Primary註釋關聯的 bean 。
讓我們看一個例子:

@Configuration
public class Config {
 
    @Bean
    public Employee johnEmployee() {
        return new Employee("John");
    }
 
    @Bean
    @Primary
    public Employee tonyEmployee() {
        return new Employee("Tony");
    }
}

在此示例中,兩個方法都返回相同的Employee型別。Spring 將注入的 bean 是tonyEmployee方法返回的 bean 。這是因為它包含@Primary註釋。當我們想要指定預設情況下應注入某種型別的 bean時,此註釋非常有用。
如果我們在某個注入點需要其他 bean,我們需要特別指出。我們可以透過@Qualifier註釋來做到這一點。例如,我們可以透過使用@Qualifier註釋來指定要使用johnEmployee方法返回的 bean 。
值得注意的是,如果@Qualifier和@Primary註解同時存在,那麼@Qualifier註解將優先。基本上,@Primary定義了預設值,而@Qualifier則非常具體。
讓我們看看使用@Primary註釋的另一種方式,這次使用最初的示例:

@Component
@Primary
public class FooFormatter implements Formatter {
    //...
}

@Component
public class BarFormatter implements Formatter {
    //...
}

在這種情況下,@Primary註釋被放置在實現類之一中,並將消除場景的歧義。

4.解釋模型屬性 @ModelAttribute註解是 Spring MVC中最重要的註解之一

@ModelAttribute註釋

5.解釋一下@Controller和@RestController之間的區別

@Controller和@RestController註釋之間的主要區別在於@ResponseBody註釋自動包含在@RestController中。這意味著我們不需要使用@ResponseBody註釋我們的處理程式方法。如果我們想將響應型別直接寫入 HTTP 響應正文,我們需要在 @Controller類中執行此操作。

相關文章