สร้าง interface ขึ้นมา ในที่นี้ชื่อว่า Worker
Worker.java
package com.blogspot.na5cent.app.service; /** * * @author redcrow */ public interface Worker { public void working(); }implementations
สร้าง Worker[n] implementation ซึ่ง implements an interface Worker
ในที่นี้ประกอบไปด้วย Worker1, Worker2, Worker3
การทำงานแต่ละตัวคือให้ log class name ของตัวเองออกมา
Worker1.java
package com.blogspot.na5cent.app.service.impl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.blogspot.na5cent.app.service.Worker; /** * * @author redcrow */ @Component public class Worker1 implements Worker{ private static final Logger LOG = LoggerFactory.getLogger(Worker1.class); @Override public void working() { LOG.debug("worker name {}", getClass().getName()); } }Worker2.java
package com.blogspot.na5cent.app.service.impl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.blogspot.na5cent.app.service.Worker; /** * * @author redcrow */ @Component public class Worker2 implements Worker{ private static final Logger LOG = LoggerFactory.getLogger(Worker2.class); @Override public void working() { LOG.debug("worker name {}", getClass().getName()); } }Worker3.java
package com.blogspot.na5cent.app.service.impl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.blogspot.na5cent.app.service.Worker; /** * * @author redcrow */ @Component public class Worker3 implements Worker{ private static final Logger LOG = LoggerFactory.getLogger(Worker3.class); @Override public void working() { LOG.debug("worker name {}", getClass().getName()); } }test
เรียกทุกๆ implementations ซึ่ง implements an interface Worker
ผ่านการ @Autowire List<Worker> workers
Spring จะไปค้นหาทุกๆ implementations ให้เราเอง
TestWorker.java
package com.blogspot.na5cent.app.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * * @author redcrow */ @Component public class TestWorker { @Autowired private List<Worker> workers; //***** autowire list of an interface public void testWoking() { if (workers != null) { for (Worker worker : workers) { worker.working(); //call all an implementation } } } }ปรากฏว่ามีการเรียกใช้งานทุกๆ implementation ซึ่ง implements an interface Worker จริง
ด้วยการ log class name ของตัวเองออกมา
สังเกตว่า class นี้ (TestWorker.java) ไม่ได้ขึ้นตรงต่อ Worker1, Worker2, Worker3 (implementations) เลย แต่ขึ้นตรงต่อ Worker (interface) แทน
spring เป็นตัวจัดการ inject dependencies (implementations) มาให้เราโดยอัตโนมัติ (แต่เราต้องทำให้ class นั้นถูก new instance ด้วย spring เท่านั้น โดยการใส่ @Component หรือ @Service บน class)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น