Java反射生成物件注入spring(結合工廠模式)
阿新 • • 發佈:2019-01-04
利用工廠模式進行程式碼擴充套件,而不用修改原來程式碼。在配置檔案配置要生成的類,通過反射交由工廠生成物件,並將此物件交給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();
}
}