简单工厂模式-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,解决问题!

发布了73 篇原创文章 · 获赞 78 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/SHIYUN123zw/article/details/88413592