依賴注入 javax inject中 Inject Named Qualifier和 Provider用法
阿新 • • 發佈:2018-12-19
Spring自帶的@Autowired的預設情況等價於JSR-330的@Inject註解;Spring自帶的@Qualifier的預設的根據Bean名字注入情況等價於JSR-330的@Named註解;Spring自帶的@Qualifier的擴充套件@Qualifier限定描述符註解情況等價於JSR-330的@Qualifier註解。
用過Spring框架的我們都知道,每當生成依賴注入的時候,我們都必須生成相應類的set方法,而且要在set方法上面寫上@Autowired,才能實現依賴注入,如下:
Java程式碼- package com.kaishengit.web;
- import com.kaishengit.service.ProjectService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- @Controller
- public
- private ProjectService projectService;
- //set
- @Autowired
- public void setProjectService(ProjectService projectService) {
- this.projectService = projectService;
- }
- }
每次都要生成相應的set方法感覺好麻煩,現在如果我們使用javax.inject.jar,只需要在相應類的屬性上面加上@Inject,如下程式碼:
Java程式碼- package com.kaishengit.web;
- import com.kaishengit.service.ProjectService;
- import org.springframework.stereotype.Controller;
- import javax.inject.Inject;
- @Controller
- public class FolderController {
- @Inject
- private ProjectService projectService;
- }
@Inject
@Inject支援建構函式、方法和欄位註解,也可能使用於靜態例項成員。可註解成員可以是任意修飾符(private,package-private,protected,public)。注入順序:建構函式、欄位,然後是方法。父類的欄位和方法注入優先於子類的欄位和方法,同一類中的欄位和方法是沒有順序的。
@Inject註解的建構函式可以是無參或多個引數的建構函式。@Inject每個類中最多註解一個建構函式。
在欄位註解:
- 用@Inject註解
- 欄位不能是final的
- 擁有一個合法的名稱
在方法上註解:
- 用@Inject註解
- 不能是抽象方法
- 不能宣告自身引數型別
- 可以有返回結果
- 擁有一個合法的名稱
- 可以有0個或多個引數
@Inject MethodModirers ResultType Identifier(FormalParameterList ) Throws MethodBody
[上述翻譯:inject的doc文件,翻譯不好敬請諒解]
建構函式註解:
- @Inject
- public House(Person owner) {
- System.out.println("---這是房屋建構函式---");
- this.owner = owner;
- }
- @Injectprivate Person owner;
- @Inject
- publicvoid setOwner(Person owner) {
- this.owner = owner;
- }
SpringUtil類:
- publicclass SpringUtil {
- privatestatic ApplicationContext context = null;
- publicstatic ApplicationContext getApplicationContext() {
- if (context == null) {
- context = new ClassPathXmlApplicationContext("spring.xml");
- }
- return context;
- }
- publicstatic ApplicationContext getApplicationContext(String path) {
- returnnew ClassPathXmlApplicationContext(path);
- }
- publicstatic ApplicationContext getAnnotationConfigApplicationContext(String basePackages) {
- returnnew AnnotationConfigApplicationContext(basePackages);
- }
- }
- import javax.inject.Named;
- @Named
- publicclass Person {
- private String name;
- public Person() {
- System.out.println("---這是人的建構函式---");
- }
- public String getName() {
- return name;
- }
- publicvoid setName(String name) {