1. 程式人生 > >Java反射生成物件注入spring(結合工廠模式)

Java反射生成物件注入spring(結合工廠模式)

利用工廠模式進行程式碼擴充套件,而不用修改原來程式碼。在配置檔案配置要生成的類,通過反射交由工廠生成物件,並將此物件交給spring管理,在專案中遇到此問題並予以解決,做一下記錄。

package cn.easted.edm.core.factory.dao;

import java.util.Map;

import cn.easted.edm.core.factory.Operate;
import cn.easted.edm.core.utils.PropertiesReader;
/**
 * Properties檔案操作工廠類
 * @author Wanghao
 *
 */
public
class PropertiesOperateFactory{ /** * 根據類的名稱來生產物件 * @param key key值 * @return */ public static Operate getOperateByClassKey(String key){ try { Map<String, String> map = new PropertiesReader().getProperties(); Operate operate = (Operate) Class.forName(map.get(key)).newInstance(); return
operate; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } } package cn.easted.edm.core.utils; import
java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * properties讀取內容 */ public class PropertiesReader { public Map<String, String> getProperties() { Properties props = new Properties(); Map<String, String> map = new HashMap<String, String>(); try { InputStream in = getClass().getResourceAsStream("/type.properties"); props.load(in); Enumeration<?> en = props.propertyNames(); while (en.hasMoreElements()) { String key = (String) en.nextElement(); String property = props.getProperty(key); map.put(key, property); } } catch (Exception e) { e.printStackTrace(); } return map; } }

type.properties

old=cn.easted.edm.core.factory.dao.OldVersionOperateFactory

BaseAutoAware.java

package cn.easted.edm.core.utils.springInject;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
/**
 * 通過反射途徑獲得的物件自動注入spring Bean 
 * @author Wanghao
 *
 */
public class BaseAutoAware {

    public BaseAutoAware() {
        ((AutowireCapableBeanFactory)retrieveBeanFactory())  
        .autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);  
    }

    private BeanFactory  retrieveBeanFactory() {
        BaseLocator bl=new BaseLocator();
//      BaseLocator bl = BaseLocator.getInstance();
        return bl.getFactory();
    }
}

BaseLocator.java

package cn.easted.edm.core.utils.springInject;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
/**
 * 手動方式獲取BeanFactory,實現依賴注入。
 * @author Wanghao
 *
 */
public class BaseLocator implements BeanFactoryAware{

    private static BeanFactory factory;
    private static BaseLocator baselocator = null;

    @Override
    public void setBeanFactory(BeanFactory f) throws BeansException {
        factory = f;  
    }

     public  BeanFactory getFactory(){  
         return factory;  
     }  

     public static BaseLocator getInstance() {
            if (baselocator == null)
                  baselocator = (BaseLocator) factory.getBean("baseLocator");
            return baselocator;
        }
}

springmvc.xml配置

<bean id="baseLocator" class="cn.easted.edm.core.utils.springInject.BaseLocator"/>

Operate介面

package cn.easted.edm.core.factory;
/**
 * 桌面、桌面池操作介面
 * @author wanghao
 *
 */
public interface Operate {

    /**
     * 操作虛擬機器
     * @return OperateVM
     */
    public OperateVM operateVM();
    /**
     * 操作桌面池
     * @return OperateVmPool
     */
    public OperateVmPool operateVmPool();

}

OperateVM 介面

package cn.easted.edm.core.factory;

import java.io.IOException;

import org.apache.http.client.ClientProtocolException;

import cn.easted.engine.sdk.exceptions.ServerException;

/**
 *操作虛擬機器介面
 */
public interface OperateVM {
    /**
     * 開機
     * @param vmId 虛擬機器ID
     * @param ecenterId ecenterid 
     * @throws ClientProtocolException
     * @throws ServerException
     * @throws IOException
     */
    public void startVM(String vmId, String ecenterId) throws ClientProtocolException, ServerException, IOException;
    /**
     * 關機
     * @param vmId 虛擬機器ID
     * @param ecenterId ecenterid 
     */
    public void shutDownVM(String vmId, String ecenterId);

}

OperateVmPool 介面

package cn.easted.edm.core.factory;

import java.io.IOException;
import java.util.List;
import java.util.Set;

import org.apache.http.client.ClientProtocolException;

import com.alibaba.fastjson.JSONArray;

import cn.easted.edm.core.generic.common.Page;
import cn.easted.edm.core.model.PoolInformation;
import cn.easted.edm.core.model.TECenter;
import cn.easted.edm.core.model.TResourcePermissionExt;
import cn.easted.edm.core.model.TVmPools;
import cn.easted.edm.core.model.TvmPool;
import cn.easted.edm.core.model.dto.UserAndGroup;
import cn.easted.edm.core.model.dto.VmNetworkInterfaceList;
import cn.easted.edm.core.model.dto.VmPoolDTO;
import cn.easted.engine.core.common.businessentities.network.VmNetworkInterface;
import cn.easted.engine.sdk.entities.Domain;
import cn.easted.engine.sdk.entities.Template;
import cn.easted.engine.sdk.entities.VmPool;
import cn.easted.engine.sdk.exceptions.ServerException;

/**
 * 操作桌面池介面
 * @author Wanghao
 *
 */
public interface OperateVmPool {

    /**
     * 開機
     * @param vmIds 虛擬機器IDs
     * @param ecenterId ecenterId
     * @throws IOException 
     * @throws ServerException 
     * @throws ClientProtocolException 
     */
    public Boolean startVMs(String vmIds, String ecenterId) throws ClientProtocolException, ServerException, IOException;
    /**
     * 關機
     * @param vmIds 虛擬機器IDs
     * @param ecenterId ecenterId
     * @throws IOException 
     * @throws ServerException 
     * @throws ClientProtocolException 
     */
    public Boolean shutDownVMs(String vmIds, String ecenterId) throws ClientProtocolException, ServerException, IOException;

OldVersionOperateFactory.java

package cn.easted.edm.core.factory.dao;

import org.springframework.beans.factory.annotation.Qualifier;

import cn.easted.edm.core.factory.Operate;
import cn.easted.edm.core.factory.OperateVM;
import cn.easted.edm.core.factory.OperateVmPool;
import cn.easted.edm.core.utils.springInject.BaseAutoAware;
/**
 * 操作實現類
 * @author wanghao
 *
 */
public class OldVersionOperateFactory extends BaseAutoAware implements Operate {

    /**
     * operateVM
     */
    private OperateVM oldVersionOperateVM;
    /**
     * operateVmPool
     */
    private OperateVmPool oldVersionOperateVmPool;


    @Override
    public OperateVM operateVM() {
        return oldVersionOperateVM;
    }

    @Override
    public OperateVmPool operateVmPool() {
        return oldVersionOperateVmPool;
    }


    public OperateVM getOldVersionOperateVM() {
        return oldVersionOperateVM;
    }

    public void setOldVersionOperateVM(@Qualifier("oldVM")OperateVM oldVersionOperateVM) {
        this.oldVersionOperateVM = oldVersionOperateVM;
    }

    public OperateVmPool getOldVersionOperateVmPool() {
        return oldVersionOperateVmPool;
    }

    public void setOldVersionOperateVmPool(@Qualifier("oldVmPool")OperateVmPool oldVersionOperateVmPool) {
        this.oldVersionOperateVmPool = oldVersionOperateVmPool;
    }
}

NewVersionOperateFactory.java

package cn.easted.edm.core.factory.dao;

import org.springframework.beans.factory.annotation.Qualifier;

import cn.easted.edm.core.factory.Operate;
import cn.easted.edm.core.factory.OperateVM;
import cn.easted.edm.core.factory.OperateVmPool;
import cn.easted.edm.core.utils.springInject.BaseAutoAware;
/**
 * 操作實現類
 * @author wanghao
 *
 */
public class NewVersionOperateFactory extends BaseAutoAware implements Operate {

    /**
     * operateVM
     */
    private OperateVM newVersionOperateVM;
    /**
     * operateVmPool
     */
    private OperateVmPool newVersionOperateVmPool;

    @Override
    public OperateVM operateVM() {
        return newVersionOperateVM;
    }

    @Override
    public OperateVmPool operateVmPool() {
        return newVersionOperateVmPool;
    }

    public OperateVM getNewVersionOperateVM() {
        return newVersionOperateVM;
    }

    public void setNewVersionOperateVM(@Qualifier("newVM")OperateVM newVersionOperateVM) {
        this.newVersionOperateVM = newVersionOperateVM;
    }

    public OperateVmPool getNewVersionOperateVmPool() {
        return newVersionOperateVmPool;
    }

    public void setNewVersionOperateVmPool(@Qualifier("newVmPool")OperateVmPool newVersionOperateVmPool) {
        this.newVersionOperateVmPool = newVersionOperateVmPool;
    }
}

NewVersionOperateVM.java

package cn.easted.edm.core.factory.impl;

import org.springframework.stereotype.Component;

import cn.easted.edm.core.factory.OperateVM;
/**
 * 操作實現類
 * @author Wanghao
 *
 */
@Component("newVM")
public class NewVersionOperateVM implements OperateVM {


    @Override
    public void startVM(String vmId, String ecenterId) {
        System.out.println("NewVersion start");
    }

    @Override
    public void shutDownVM(String vmId, String ecenterId) {

    }

}

NewVersionOperateVmPool.java

@Component("newVmPool")
public class NewVersionOperateVmPool implements OperateVmPool {

    @Override
    public Boolean startVMs(String vmId, String ecenterId) {
        System.out.println("NewVersionVmpool start");
        return null;
    }

    @Override
    public Boolean shutDownVMs(String vmId, String ecenterId) {
        return null;
    }
    }

OldVersionOperateVM.java

package cn.easted.edm.core.factory.impl;

import java.io.IOException;

import javax.annotation.Resource;

import org.apache.http.client.ClientProtocolException;
import org.springframework.stereotype.Component;

import cn.easted.edm.core.factory.OperateVM;
import cn.easted.edm.core.model.TECenter;
import cn.easted.edm.core.service.ECenterService;
import cn.easted.edm.core.service.SdkFactory;
import cn.easted.engine.sdk.Api;
import cn.easted.engine.sdk.exceptions.ServerException;
/**
 * 虛擬機器操作類
 * @author Wanghao
 *
 */
@Component("oldVM")
public class OldVersionOperateVM implements OperateVM {
    /**
     * sdkFactory
     */
    @Resource
    SdkFactory sdkFactory;

    @Override
    public void startVM(String vmId, String ecenterId) throws ClientProtocolException, ServerException, IOException {
        System.out.println(" OldVersion start");
    }

    @Override
    public void shutDownVM(String vmId, String ecenterId) {

    }

}

OldVersionOperateVmPool .java

/**
 * 桌面池操作類
 * @author Wanghao
 *
 */
@Component("oldVmPool")
public class OldVersionOperateVmPool implements OperateVmPool {

    private static Logger logger = Logger.getLogger(OldVersionOperateVmPool.class);
    /**
     * sdkFactory
     */
    @Resource
    SdkFactory sdkFactory;
    @Override
    public Boolean startVMs(String vmIds, String ecenterId) throws ClientProtocolException, ServerException, IOException {
        return true;
    }

    @Override
    public Boolean shutDownVMs(String vmIds, String ecenterId) throws ClientProtocolException, ServerException, IOException {
        return true;
    }

測試用例

    @Test
    public void testPropertiryFactory(){
        Operate o = PropertiesOperateFactory.getOperateByClassKey("old");
        try {
            o.operateVM().startVM("09618bed-f116-4eca-8e29-e47d1b5210ec", "22");
//          o.operateVmPool().startVMs("", "");
        } catch (ServerException | IOException e) {
            e.printStackTrace();
        }

    }