简单工厂模式请移步 设计模式学习-简单工厂类
最近做一个通用查询类接口,想到用工厂模式来实现,实现的时候出现了一个问题,就是我的具体执行类中需要 注入 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,解决问题!