หน้าเว็บ

วันอังคารที่ 15 ตุลาคม พ.ศ. 2556

Spring autowire all implementations which implements an interface

interface
สร้าง 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)



ไม่มีความคิดเห็น:

แสดงความคิดเห็น