栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring中的@Autowired,@Qualifier和@Primary注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring中的@Autowired,@Qualifier和@Primary注解

目录

1. `@Autowired` 注解

1.1. `@Autowired` 注解的使用

1.1.1. 类成员变量上(较为常用)1.1.2. 用在方法上1.1.3. 用在构造器上1.1.4. 用在参数上 1.2. `@Autowired` 注解的说明 2. `@Autowired` 配合 `@Qualifier`3. `@Autowired` 配合 `@Primary`

1. @Autowired 注解 1.1. @Autowired 注解的使用

@Autowired 注解,可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作

1.1.1. 类成员变量上(较为常用)
@Controller
public class SoakController {
 
	@Autowired
	private SoakService soakService;
}
1.1.2. 用在方法上
@Controller
public class SoakController {
 
	private SoakService soakService;
	
	@Autowired 
	public void setSoakService(SoakService soakService) {
		this.soakService = soakService;
	}
}
1.1.3. 用在构造器上
@Controller
public class SoakController {
 
	private SoakService soakService;
	
	@Autowired 
	public SoakController(SoakService soakService) {
		this.soakService = soakService;
	}
}
1.1.4. 用在参数上
@Controller
public class SoakController extends baseController {
 
	private SoakService soakService;
	
	public SoakController(@Autowired SoakService soakService) {
		this.soakService = soakService;
	}
}
1.2. @Autowired 注解的说明

默认优先按照 byType 去容器中找对应的组件,找到就赋值如果找到多个相同类型的组件,再通过 byName 来到 IOC 容器中进行查找默认情况下,它具有强制契约特性,其所标注的属性必须是可装配的。如果没有 bean 可以装配到 @Autowired 所标注的属性或参数中,那么你会看到 org.springframework.beans.factory.NoSuchBeanDefinitionException 的异常信息 2. @Autowired 配合 @Qualifier

@Autowired 是默认根据 byType 进行自动装配的,如果需要按 byName 进行装配,则需要配合 @Qualifier 注解使用如果容器中存在多个相同类型的组件,此时需要通过 byName 来进行装配,则需要配合 @Qualifier 注解使用

组件 1

@Service
public class BookService {// 类型为 BookService,name 为 bookService

}

组件 2

@Configuration
public class MainConfigOfAutowired {

	// 类型为 BookService,name 为 bookService01
    @Bean
    public BookService bookService01() {
        return new BookService();
    }
}

测试

@Autowired
@Qualifier("bookService01")
private BookService bookService;

@Test
public void MyTest() {
	System.out.println(bookService);
}

由于容器中存在 bookService01 和 bookService 两个类型相同的组件 bean,那么此时可以使用 @Qualifier(“bookService01”) 明确指定 bean 的 name 后,@Autowired 不再根据 byType 自动装配了,而用 bookService01 作为组件的 name 去容器中查找,找到组件 2,装配成功

3. @Autowired 配合 @Primary

Spring 在进行自动装配的时候,会 优先 使用用 @Primary 标注指定的 bean如果容器中有多个组件 Type 类型相同,注入的 bean 的 Name 名称也相同,那么此时就可以使用 @Primary 注解,将某一个组件 优先 注入不能把多个 bean 都标注为 @Primary,不然你会得到 NoUniqueBeanDefinitionException 这个异常

组件 1

@Service
public class BookService { // 类型为 BookService,name 为 bookService

}

组件 2

@Configuration
public class MainConfigOfAutowired {

	// 类型为 BookService,name 为 bookService01
    @Primary
    @Bean
    public BookService bookService01() {
        return new BookService();
    }
}

测试 1

@Autowired
private BookService bookService;

@Test
public void MyTest() {
	System.out.println(bookService);
}

因为组件 2 使用了 @Primary 注解标注,所以 @Autowired 会优先使用 name 为 bookService01 进行装配

测试 2

@Qualifier("bookService")
@Autowired
private BookService bookService;

@Test
public void MyTest() {
	System.out.println(bookService);
}

虽然组件 2 使用了 @Primary 注解标注,但是 @Qualifier 比 @Primary 的优先级要高,所以使用注解 @Qualifier 标注指定后, @Primary 就不起作用了,所以还是直接用指定的 bookService 作为组件的 name 去容器中装配

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/764305.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号