在这篇文章中,我们将讨论Spring的@Primary
注解,它是在框架的3.0版本中引入的。
简单地说,当有多个相同类型的Bean时,我们使用@Primary
来给一个Bean更高的优先权。
让我们来详细描述一下这个问题。
在某些情况下,我们需要注册超过一个相同类型的Bean。
在这个例子中,我们有mySQLConnection()
和oracleConnection()
类型的豆子。
@Configuration
public class Config {
@Bean
public Connection mySQLConnection() {
return new MySQLConnection();
}
@Bean
public Connection oracleConnection() {
return new OracleConnection();
}
}
如果我们试图运行该应用程序,Spring会抛出NoUniqueBeanDefinitionException
。
为了访问具有相同类型的Bean,我们通常使用@Qualifier("beanName")注解。
我们在注入点和@Autowired一起应用。在我们的例子中,我们在配置阶段选择了Bean,所以@Qualifier不能在这里应用。我们可以通过下面的链接了解更多关于@Qualifier注解的信息。
为了解决这个问题,Spring提供了@Primary注解。下面的例子展示了如何在spring应用程序中使用@Primary
注解。
@Primary
注解可用于任何直接或间接使用@Component
注解的类,或使用@Bean注解的工厂方法。在这个例子中,我们将使用@Primary
注解与@Component
注解。
让我们创建一个例子来演示在Spring应用程序中使用@Primary
注解的用法。
使用你喜欢的IDE创建一个简单的Maven项目,关于打包结构请参考下面的章节。如果你是maven新手,请阅读本文《如何创建一个简单的Maven项目》。
下图显示了项目结构,供您参考。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.javaguides.spring</groupId>
<artifactId>spring-primary-annotation</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-scope-example</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.0.RELEASE</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
接下来,考虑以下MessageService
接口。
package net.javaguides.spring.primary;
public interface MessageService {
public void sendMsg();
}
创建三个名为FacebookMessageService
、EmailMessageService
和TwitterMessageService
的bean,实现MessageService
接口。
package net.javaguides.spring.primary;
import org.springframework.stereotype.Component;
@Component
public class FacebookMessageService implements MessageService {
@Override
public void sendMsg() {
System.out.println("FacebookMessageService implementation here");
}
}
package net.javaguides.spring.primary;
import org.springframework.stereotype.Component;
@Component
public class EmailMessageService implements MessageService {
@Override
public void sendMsg() {
System.out.println("EmailMessageService Implementation here");
}
}
package net.javaguides.spring.primary;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
@Primary
@Component
public class TwitterMessageService implements MessageService {
@Override
public void sendMsg() {
System.out.println("TwitterMessageService Implementation here");
}
}
注意,在上面的TwitterMessageService
类中,我们添加了@Primary
与@Component
注解。
package net.javaguides.spring.primary;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "net.javaguides.spring.primary")
public class AppConfig {
}
让我们创建一个主类并运行一个应用程序。
package net.javaguides.spring.primary;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Application {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MessageService messageService = context.getBean(MessageService.class);
messageService.sendMsg();
context.close();
}
}
TwitterMessageService Implementation here
本文的源代码可在我的GitHub存储库中找到https://github.com/RameshMF/spring-core-tutorial
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.javaguides.net/2018/10/spring-primary-annotation-example.html
内容来源于网络,如有侵权,请联系作者删除!