java介面多實現注入方法總結
阿新 • • 發佈:2022-05-25
1. 單實現介面注入方法
1.1 構造注入(推薦)
@RequiredArgsConstructor
public class TestController {
// 其只有一個具體的實現類
private final DemoService demoService;
}
1.2 全參構造注入
@AllArgsConstructor
public class TestController {
DemoService demoService;
}
注: 當需要注入的全部是service時候, 這兩種沒有區別, 但是如果要使用@Value等其他註解時, 全參注入會報null. (@Value只是舉例, @Value可以使用hutool中的SpringUtil方法代替)
1.3 @Autowired
(Spring提供) 與 @Resource
(J2EE提供)直接用即可
2. 多實現介面注入方法
public interface BaseService { /** * 建立物件 * * @param obj 物件 * @return 成功返回id */ public int crate(String obj); } import org.springframework.stereotype.Service; @Service("baseStudent") public class BaseStudentServiceImpl implements BaseService { @Override public int crate() { System.err.println("新增學生"); return 1; } } import org.springframework.stereotype.Service; @Service("baseTeacher") public class BaseTeacherServiceImpl implements BaseService { @Override public int crate() { System.err.println("新增老師"); return 2; } }
2.1 錯誤嘗試
如果還使用以上任意一種方法進行注入的話, 都會報found 2
異常, 具體描述可能不同.
2.2 @Service
上新增各自的名稱,
注入時候使用@Qualifier("baseStudent")
進行指定.
public class TestController {
@Autowired
@Qualifier("baseStudent")
private BaseService baseService;
}
2.3 使用@Resource
指定.
public class TestController { @Resource(name = "baseStudent") private BaseService baseService; }
2.4 嘗試引數注入方法
-
@Setter(onMethod_ = {@Qualifier("")}, onParam = @__(@Qualifier("")))
-
@RequiredArgsConstructor(onConstructor_ = {@Qualifier("")})
都沒有成功, 可能是方向錯了.
2.5 變數名指定
@RequiredArgsConstructor
public class TestController {
// 與1.1和1.2用法相同, 變數名為Service的名字
private final BaseService baseStudent;
}
3. 微服務下的註冊與使用
3.1 註冊時新增分組名稱
public interface BaseService {
/**
* 建立物件
*
* @param obj 物件
* @return 成功返回id
*/
public int crate(String obj);
}
import com.alibaba.dubbo.config.annotation.Service;;
@Service(group = "baseStudent")
public class BaseStudentServiceImpl implements BaseService {
@Override
public int crate() {
System.err.println("新增學生");
return 1;
}
}
import com.alibaba.dubbo.config.annotation.Service;e;
@Service(group = "baseTeacher")
public class BaseTeacherServiceImpl implements BaseService {
@Override
public int crate() {
System.err.println("新增老師");
return 2;
}
}
3.2 使用時使用分組名稱進行指定
import com.alibaba.dubbo.config.annotation.Reference;
public class TestController {
@Reference(group = "baseStudent")
private BaseService baseService;
}
2.幾中的方法並非嘗試
4. 參考
-
Is it possible to add qualifiers in @RequiredArgsConstructor(onConstructor = @__(@Autowired))?
-
有沒有可能在@RequiredArgsConstructor(onConstructor = @__(@Autowired))中新增限定符?
注: 第二個是第一個翻譯