Làm thế nào để mùa xuân biết loại đa hình để sử dụng.
Miễn là chỉ có một triển khai duy nhất của giao diện và việc triển khai đó được chú thích với chức @Component
năng quét thành phần của Spring được kích hoạt, Spring framework có thể tìm ra cặp (giao diện, triển khai). Nếu quét thành phần không được bật, thì bạn phải xác định rõ ràng bean trong application-config.xml (hoặc tệp cấu hình lò xo tương đương).
Tôi có cần @Qualifier hoặc @Resource không?
Khi bạn có nhiều hơn một lần triển khai, thì bạn cần phải đủ điều kiện cho mỗi lần thực hiện và trong quá trình tự động nối dây, bạn sẽ cần sử dụng @Qualifier
chú thích để thực hiện đúng việc thực hiện, cùng với @Autowired
chú thích. Nếu bạn đang sử dụng @Resource (ngữ nghĩa J2EE), thì bạn nên chỉ định tên bean bằng name
thuộc tính của chú thích này.
Tại sao chúng ta tự động giao diện mà không phải lớp thực hiện?
Thứ nhất, luôn luôn là một thực hành tốt để mã hóa các giao diện nói chung. Thứ hai, trong trường hợp mùa xuân, bạn có thể thực hiện bất kỳ thực hiện nào trong thời gian chạy. Một trường hợp sử dụng điển hình là tiêm thực hiện giả trong giai đoạn thử nghiệm.
interface IA
{
public void someFunction();
}
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
....
worker.someFunction();
}
Cấu hình bean của bạn sẽ trông như thế này:
<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />
Ngoài ra, nếu bạn kích hoạt quét thành phần trên gói có các gói này, thì bạn nên đủ điều kiện cho mỗi lớp @Component
như sau:
interface IA
{
public void someFunction();
}
@Component(value="b")
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
@Component(value="c")
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
@Component
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
....
worker.someFunction();
}
Sau đó, worker
trong MyRunner
sẽ được tiêm với một thể hiện của loại B
.