TL; DR
Chú thích @Autowired cho phép bạn cần tự mình thực hiện nối dây trong tệp XML (hoặc bất kỳ cách nào khác) và chỉ tìm cho bạn những gì cần được tiêm ở đâu và thực hiện điều đó cho bạn.
Giải thích đầy đủ
Các @Autowired
chú thích cho phép bạn bỏ qua các cấu hình khác về những gì để tiêm và chỉ làm điều đó cho bạn. Giả sử gói của bạn là com.mycompany.movies
bạn phải đặt thẻ này vào XML (tệp ngữ cảnh ứng dụng):
<context:component-scan base-package="com.mycompany.movies" />
Thẻ này sẽ tự động quét. Giả sử mỗi lớp phải trở thành một bean được chú thích với một chú thích chính xác như @Component
(đối với bean đơn giản) hoặc @Controller
(đối với điều khiển servlet) hoặc @Repository
(đối với DAO
các lớp) và các lớp này nằm ở đâu đó trong gói com.mycompany.movies
, Spring sẽ tìm tất cả các lớp này và tạo một hạt cho mỗi người. Điều này được thực hiện trong 2 lần quét các lớp - lần đầu tiên nó chỉ tìm kiếm các lớp cần trở thành một hạt và ánh xạ các mũi tiêm cần thực hiện, và trong lần quét thứ hai, nó tiêm hạt đậu. Tất nhiên, bạn có thể định nghĩa các bean của mình trong tệp XML truyền thống hơn hoặc với lớp @Configuration (hoặc bất kỳ kết hợp nào của ba).
Các @Autowired
chú thích cho mùa xuân nơi tiêm cần phải xảy ra. Nếu bạn đặt nó vào một phương thức, setMovieFinder
nó sẽ hiểu (bằng tiền tố set
+ @Autowired
chú thích) rằng một hạt cần phải được tiêm. Trong lần quét thứ hai, Spring tìm kiếm một loại đậu MovieFinder
và nếu tìm thấy loại đậu đó, nó sẽ tiêm nó vào phương thức này. Nếu nó tìm thấy hai hạt như vậy bạn sẽ nhận được một Exception
. Để tránh Exception
, bạn có thể sử dụng @Qualifier
chú thích và cho biết loại đậu nào trong hai loại đậu được tiêm theo cách sau:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
Hoặc nếu bạn muốn khai báo các bean trong XML của mình, nó sẽ trông giống như thế này:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
Trong phần @Autowired
khai báo, bạn cũng cần thêm phần @Qualifier
để cho biết loại nào trong hai loại đậu màu cần tiêm:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
Nếu bạn không muốn sử dụng hai chú thích ( @Autowired
và @Qualifier
), bạn có thể sử dụng @Resource
để kết hợp hai chú thích này:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
Các @Resource
(bạn có thể đọc một số dữ liệu thêm về nó trong các bình luận đầu tiên về câu trả lời này) phụ tùng bạn việc sử dụng hai chú thích và thay vào đó bạn chỉ sử dụng một.
Tôi sẽ chỉ thêm hai bình luận nữa:
- Thực hành tốt sẽ được sử dụng
@Inject
thay @Autowired
vì bởi vì nó không phải là đặc trưng của mùa xuân và là một phần của JSR-330
tiêu chuẩn .
- Một cách thực hành tốt khác là đặt
@Inject
/ @Autowired
trên một hàm tạo thay vì một phương thức. Nếu bạn đặt nó trên một hàm tạo, bạn có thể xác nhận rằng các hạt được tiêm không phải là null và thất bại nhanh khi bạn cố gắng khởi động ứng dụng và tránh NullPointerException
khi bạn thực sự cần sử dụng bean.
Cập nhật : Để hoàn thành bức tranh, tôi đã tạo một câu hỏi mới về @Configuration
lớp.