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类中执行此操作。
标签:Qualifier,spring,Primary,class,注释,bean,mvc,public From: https://www.cnblogs.com/dkpp/p/18059405