Mùa xuân biết loại đa hình nào được sử dụng.
Miễn là chỉ thực hiện một giao diện duy nhất và triển khai được chú thích với @Component
khi bật tính năng quét thành phần của Spring, 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 kích hoạt, thì bạn phải định nghĩa bean một cách rõ ràng trong tệp tin application-config.xml của bạn (hoặc tệp cấu hình mùa xuân tương đương).
Tôi có cần @Qualifier hoặc @Resource không?
Khi bạn có nhiều hơn một thực hiện, thì bạn cần phải hội đủ điều kiện mỗi người trong số họ và trong tự động hệ thống dây điện, bạn sẽ cần phải sử dụng @Qualifier
chú thích để tiêm việc thực hiện đúng, 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 cách sử dụng thuộc tính name
của chú thích này.
Tại sao chúng ta tự động hóa giao diện chứ không phải lớp được triển khai?
Thứ nhất, luôn luôn là cách hay để mã hóa cho giao diện nói chung. Thứ hai, trong trường hợp của mùa xuân, bạn có thể tiêm 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 mô hình 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 đậu 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 bao bì nơi đây là hiện tại, sau đó bạn nên đủ điều kiện từng lớp với @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 phiên bản loại B
.
Bạn tự động tạo giao diện để có thể triển khai * khác * - đó là một trong những điểm mã hóa giao diện chứ không phải lớp. –
Bạn muốn thực hiện một cách khác nhau; Tôi không hiểu câu hỏi. –
Nếu chúng tôi đang nối dây trong giao diện, điều gì xảy ra khi có phương pháp hiển thị mặc định trong lớp Impl mà tôi cần truy cập? Tôi không thể thêm phương thức đó vào giao diện vì giao diện công cộng không thể chứa công cụ sửa đổi mặc định. – JLewkovich