简单工厂模式-spring注入版

简单工厂模式请移步  设计模式学习-简单工厂类

最近做一个通用查询类接口,想到用工厂模式来实现,实现的时候出现了一个问题,就是我的具体执行类中需要 注入 service服务(取数据库数据),我想用spring的 @Autowired 注解 注入。但是我的工厂中是用反射实现的。例如这样

Class fruit = Class.forName(type);
return (Fruit) fruit.newInstance();

这样就相当于自己 new 了新对象 ,那这个对象就不归spring容器管理,IOC等spring的功能也就无法使用,所以@Autowired 注解是无效的。(要想有效,用@Component 将该类注册到spring容器中)

我就想到 spring本身就是个容器,相当于一个大工厂,里面有一个一个注册的bean(默认单例)。我只要能通过一对一的映射能找到我想要的bean不就行了吗?

下面请看代码:

1、通用返回结果类 QueryResult

public class QueryResult {
	
	private boolean success;
	
	private String message;
	
	private Object result;  


    // get set 方法

}

2、抽象接口 QueryBean

public interface QueryBean {
	
	public QueryResult query(String json);
	
}

3、spring工厂 

@Component
public class QueryFactory {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(QueryFactory.class);
	
	@Autowired
	private Map<String,QueryBean> map;
	
	public QueryBean creatQueryBean(String command) {
		return map.get(command);
	}

}

4、统一接口

@Controller
@RequestMapping("/zewe")
public class QueryController {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(QueryController.class) ;
	
	@Autowired
	private QueryFactory queryFactory;
	
	/**
	 * 统一查询接口  
	 * @param command
	 * @param condition json格式字符串
	 * @return
	 */
	@RequestMapping(value = "/query",method=RequestMethod.POST)
	@ResponseBody
	public QueryResult query(@RequestParam("COMMAND") String command,@RequestParam("CONDITION") String condition) {
		LOGGER.info("in QueryController method query . command: {}; condition: {}",command,condition);
		QueryBean bean = queryFactory.creatQueryBean(command);
		if(null != bean) {
			return bean.query(condition);
		}
		return new QueryResult(false,"内部异常 COMMAND: "+command);	
	}
	

}

5、具体实现类 

5.1  UserQueryBean 注意 @Component中的命名,且Service可注入

@Component("USERQUERYBEAN")
public class UserQueryBean implements QueryBean{
	
	private static final Logger LOGGER = LoggerFactory.getLogger(UserQueryBean.class);
	
	@Autowired
	private UserService userService;

	@Override
	public QueryResult query(String json) {
		JSONObject jsonObj = JSONObject.parseObject(json);
		String code = jsonObj.getString("code");
		LOGGER.info("in UserQueryBean method query. code: {}",code);
		User user = userService.get(code);
		return new QueryResult(true,"",user);
	}
	
	

}

5.2  UserListQueryBean

@Component("USERLISTQUERYBEAN")
public class UserListQueryBean implements QueryBean{
	
	private static final Logger LOGGER = LoggerFactory.getLogger(UserListQueryBean.class);
	@Autowired
	private UserService userService;

	@Override
	public QueryResult query(String json) {
		LOGGER.info("in UserListQueryBean method query. json: {}",json);
		List<User> list = userService.list();
		return new QueryResult(true,"",list);
	}
}

 

执行结果

ok,解决问题!

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值