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類中執行此操作。