1. 程式人生 > >依賴注入和自動裝配

依賴注入和自動裝配

參考:https://zhidao.baidu.com/question/1577675767538514300.html

          https://blog.csdn.net/u012843873/article/details/52399206

之前一直沒有注意一個問題:spring中的Autowird為什麼能將介面的實現類取代介面,自動裝配給控制類

如下面這個例子,控制類自動注入的是Service,但是真正呼叫的確實ServiceImpl的方法,也就是說控制類真正注入的是ServiceImpl類,這是為什麼呢,為什麼會識別並注入ServiceImpl類??

介面類:CategoryService

public interface CategoryService {
     List<Category> list();
}

實現類:CateGorySericeImpl

@Service
public class CategoryServiceImpl  implements CategoryService{
    @Autowired
    CategoryMapper categoryMapper;
    public List<Category> list(){
        return categoryMapper.list();
    };
}

控制類

@Controller
@RequestMapping("")
public class CategoryController {
    @Autowired
    CategoryService categoryService;
}

原來實現類實現了介面,那麼實現類是介面型別,ServiceImpl和Service是同一種類型,Spring的註解Autowird真正注入的是介面的實現類ServiceImpl而不是介面Service。

問題又來了,如果我有多個實現類實現了這個介面,Spring會注入那個實現類呢???

先從原理說起,什麼是依賴注入,什麼是自動裝配

依賴注入的本質就是裝配,裝配是依賴注入的具體行為

依賴注入有兩種形式:構造器注入和setter注入。也就是我們在xml中寫的一堆<bean></bean>,如果bean太多我們還這樣寫基本是要成為碼農了,更何況我們還有把有關聯的bean裝配起來,一旦bean很多,就不好維護了。

為此Spring使用自動裝配解決這個問題,開發人員不用關心具體裝配哪個bean的引用,識別工作由Spring來完成,因此一般配有自動監測來和自動裝配配合完成。自動裝配其實就是將依賴注入“自動化”的一個簡化配置的操作

xml的<bean>配置中通新增autowire屬性實現四種形式的自動裝配,byName, byType, constructor, autodetect。byName就是會將與屬性的名字一樣的bean進行裝配。byType就同屬性一樣型別的bean進行裝配。constructor就是通過構造器來將型別與引數相同的bean進行裝配。autodetect是constructor與byType的組合,會先進行constructor,如果不成功,再進行byType。

Spring2.5之後提供了註解方式的自動裝配。但是要使用這些註解,需要在配置檔案中配置<context:annotation-config />。只有加上這一配置,才可以使用註解進行自動裝配,預設情況下基於註解的裝配是被禁用的。常用的自動裝配註解有以下幾種:@Autowired,@Resource,@Inject,@Qualifier,@Named。

@Autowired註解是byType類型的,因此會將介面的實現類取代介面,自動裝配給控制類