1. 程式人生 > 其它 >java介面多實現注入方法總結

java介面多實現注入方法總結

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. 參考

注: 第二個是第一個翻譯