pra*_*ddy 0 qualifiers autowired spring-boot
BubbleSort.java 该类实现SortAlgorithm接口
package com.prakash.Spring.Example;
import org.springframework.stereotype.Component;
@Component
@Qualifier("bubbleSort")
public class BubbleSort implements SortAlgorithm {
public void sort() {
System.out.println("Sort from Bubble Sort");
}
}
Run Code Online (Sandbox Code Playgroud)
QuickSort.java 该类实现了SortAlgorithm接口包com.prakash.Spring.Example;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
@Component
@Qualifier("quickSort")
public class QuickSort implements SortAlgorithm {
@Override
public void sort() {
System.out.println("Sort from Quick Sort");
}
}
Run Code Online (Sandbox Code Playgroud)
排序算法.java
package com.prakash.Spring.Example;
public interface SortAlgorithm {
void sort();
}
Run Code Online (Sandbox Code Playgroud)
BinarySearch.java 在这个类中,我想使用 fastSort bean 作为我的组件。
package com.prakash.Spring.Example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class BinarySearch {
@Autowired
@Qualifier("quickSort")
private SortAlgorithm sortAlgorithm;
public BinarySearch(SortAlgorithm sortAlgorithm) {
super();
this.sortAlgorithm = sortAlgorithm;
}
public int[] search(int[] numbers) {
sortAlgorithm.sort();
System.out.println("This is from BinarySearch");
return numbers;
}
}
Run Code Online (Sandbox Code Playgroud)
ComplexBusinessService.java 在这个类中,我使用 getBean 方法获取 bean
package com.prakash.Spring.Example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class ComplexBussinessService {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ComplexBussinessService.class, args);
BinarySearch binarySearch = applicationContext.getBean(BinarySearch.class);
int[] result = binarySearch.search(new int[] { 2, 4, 3 });
for (int i : result) {
System.out.print(i+" ");
}
applicationContext.close();
}
}
Run Code Online (Sandbox Code Playgroud)
这就是原因。实际上,这是 Spring 的棘手部分,了解依赖注入何时以及如何发生。
这是依赖注入的顺序:
@Autowired)@Autowired)技巧就在这里:
如果一个被注释的类@Component也只有一个非默认构造函数,那么这个构造函数会被自动调用。当您首先调用构造函数,然后调用字段时,@QualifierSpring 甚至不会解释您的字段,因为它在构造函数调用期间失败,因此出现异常。
要解决这个问题,您有两种选择:
BinarySearch。然后 Spring 将调用默认构造函数new BinarySearch(),然后sortAlgorithm使用@Qualifier.import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class BinarySearch {
@Autowired
@Qualifier("quickSort")
private SortAlgorithm sortAlgorithm;
public int[] search(int[] numbers) {
sortAlgorithm.sort();
System.out.println("This is from BinarySearch");
return numbers;
}
}
Run Code Online (Sandbox Code Playgroud)
@Qualifier在构造函数参数中添加 a :import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class BinarySearch {
private SortAlgorithm sortAlgorithm;
public BinarySearch(@Qualifier("quickSort") SortAlgorithm sortAlgorithm) {
super();
this.sortAlgorithm = sortAlgorithm;
}
public int[] search(int[] numbers) {
sortAlgorithm.sort();
System.out.println("This is from BinarySearch");
return numbers;
}
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你 !
| 归档时间: |
|
| 查看次数: |
2912 次 |
| 最近记录: |