Inversion Of Control (IOC) and Dependency Injection
IOC技術的本質就是構建對象的技術換句話說就是將一個類實例化成對象的技術。既然要耦合是無法避免的,要如何無耦合是非常困難的,因此Spring提供一個容器,我們可以先在XML內先設定好類別中的依賴關係,當Spring容器啟動時,建構對象轉為Spring控制,我們可以使用容器取得該類別的實例,這種方式也稱為反轉控制(IOC)。
那Spring IOC機制又是如何產生的呢? 這邊我有稍微去找些文章,發現Spring其實也是解析我們所設置的XML檔,然後使用反射機制放到自己的MAP中,接下來我們在使用ID去跟MAP做查詢。
這邊我將使用一個簡單的範例說明IOC與DI是如何的方便,假設我們有一個喜好食物清單,若想要在網站一啟動就得到這個List,就可以如以下動作。
CacheFruitIoc
我們建立一組FruitList,這邊將會網站啟動時,將資料存入memory中。
@Configuration
@ComponentScan({ "com.jmeter.dao.*" })
public class CacheFruitIoc {
@Autowired
private FruitDao fruitDao;
@Bean
public List<Fruit> fruitCacheList() {
return fruitDao.findAll();
}
}
FruitController
使用方式也非常簡單,就讓Controller注入這個清單,這樣可以減少DB的存取。
@Controller
public class FruitController {
@Autowired
public List<Fruit> fruitCacheList;
@ResponseBody
@RequestMapping(value = "/fruits", produces="application/json", method = RequestMethod.GET)
public List<Fruit> getFruits() {
return fruitCacheList;
}
}