spring容器對於Bean的創建和對象屬性的依賴注入提供了注解的支持,讓我們在開發中能夠更加便捷的實現對象的創建和對象屬性的依賴注入。
一,對於Bean的創建spring容器提供了以下四個注解的支持:
1、@Component
2、@Repository dao層實現類的注解
3、@Service service層實現類的注解
4、@Controller controller層實現類的注解
以上四個注解在普通使用中是等效的,但在web項目中為了區分三層架構中不同層之間Bean的創建,為了避免注解使用的混亂,使用后三個注解進行區分。
二,對於Bean屬性的依賴注入分為兩類,一類是對於屬性是String類型或者基本數據類型Spring容器提供了@Value這個注解,另一類是對於屬性是對象的提供了@Autowired和@Resource這兩個注解。
其中,@Autowired這個注解是spring框架自帶的注解,而@Resource(javax.annotation.Resource)這個注解是javax擴展包中注解規范的一種,而spring對這一注解提供了支持。
下面我們通過實驗來說明注解對於bean創建和bean屬性依賴注入的實現。
首先要在配置文件中配置注解掃描的驅動。
<context:annotation-config/>
<context:component-scan base-package="com.opensource"/>
這里提一句,如果配置了注解掃描包的范圍,也就是第二行,那么<context:annotation-config/>可以不用配置,因為配置掃描包的范圍后,注解的驅動也就有了。
實驗一,bean的創建,因為spring容器對於bean創建的四個注解是等效,這里我們使用@Component這個注解
Student類:
@Component public class Student { public Student(){ System.out.println("spring容器調用Student類的無參構造器"); }
測試類:
public class MyTest { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("spring-bean.xml"); } }
實驗結果:

實驗二:bean屬性為String類型及基本數據類型的的依賴注入
student類:
@Component(value = "student") public class Student { @Value("張三") private String name; @Value("23") private int age; public String getName() { return name; } public int getAge() { return age; } }
在這里 @Component(value = "student") value指定的是bean的id,另外對於注解方式實現的依賴注入,bean的屬性無需再提供setter方法。
測試類:
public class MyTest { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("spring-bean.xml"); Student student = (Student)ac.getBean("student"); System.out.println(student.getName()); System.out.println(student.getAge()); } }
實驗結果:
實驗三:bean屬性為java對象的依賴注入。
對於bean屬性為java對象的依賴注入,分為兩種一種是byName類型的,一種是byType類型的。而使用的注解分別是@Autowired和@Resource,對於byType類型的兩者的使用沒有區別,但是對於byName類型的@Autowired要使用聯合注解@Qualifier,所以說使用@Resource較為簡單。這里我們在研究對於bean屬性為java對象的依賴注入時就使用@Resource這個注解了。
實驗3.1:按照byName類型對bean屬性為java對象的依賴注入。
上個實驗中的Student類保持不變,再提供一個Teacher類。
@Component("teacher") public class Teacher { @Resource(name = "student") private Student student; public Student getStudent() { return student; } }
測試類:
public class MyTest { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("spring-bean.xml"); Teacher teacher = (Teacher)ac.getBean("teacher"); System.out.println(teacher.getStudent().getName()); System.out.println(teacher.getStudent().getAge()); } }
實驗結果:
實驗3.2:按照byType類型對bean屬性為java對象的依賴注入。
對於這種方式的依賴注入,只需分別修改Student類和Teacher類。
@Component public class Student { @Value("張三") private String name; @Value("23") @Qualifier private int age; public String getName() { return name; } public int getAge() { return age; } }
@Component("teacher") public class Teacher { @Resource private Student student; public Student getStudent() { return student; } }
當然在這里Student類的id也是可以保留的,這里這么做是為了說明問題。實驗結果同上。
最后說一點,我們作為程序員,研究問題還是要仔細深入一點的。當你對原理了解的有夠透徹,開發起來也就得心應手了,很多開發中的問題和疑惑也就迎刃而解了,而且在面對其他問題的時候也可做到觸類旁通。當然在開發中沒有太多的時間讓你去研究原理,開發中要以實現功能為前提,可等項目上線的后,你有大把的時間或者空余的時間,你大可去刨根問底,深入的去研究一項技術,為覺得這對一名程序員的成長是很重要的事情。