在genericDao中,可能没有n变量@Autowired

时间:2019-02-18 22:11:56

标签: java spring hibernate

基于以下内容,我正在尝试使用尽可能少的代码来创建CRUD:我有几个问题:

  1. 有一种方法可以不为数据库中的每个表创建变量:userService,phoneService,数千个表
  2. 如果不可能的话。我如何从字符串中获取这些变量以调用Dao的函数?

Controller

String model = "phone"
Class<?> abc = model+"Service"; ??
Class<?> def = model; ??
abc.read(def, 1);

??

Dao

public interface GenericDao<E, K> {
 public E read(Class<E> type, K id);
}

@Repository
public class GenericDaoImpl<E, K extends Serializable> implements GenericDao<E, K> {
 @Autowired
 private SessionFactory sessionFactory;
 @Override
 public E read(Class<E> type, K id) {
  return currentSession().get(type, id);
 }
}

服务

public interface GenericService<E, K> {
 public List<E> read(Class<E> type);
}

@Service
@Transactional
public class GenericServiceImpl<E, K> implements GenericService<E, K> {
 @Autowired
 private GenericDao<E, K> dao;
 @Override
 public E read(Class<E> type, K id) {
  return dao.read(type, id);
 }
}

控制器

@RestController
@RequestMapping("/{model}")
public class CrudController extends Controller {
 @Autowired
 protected GenericService<User, Integer> userService;
 @Autowired
 protected GenericService<Phone, Integer> phoneService;
 @GetMapping("/{id}")
 public ResponseEntity<Object> read(@PathVariable String model, @PathVariable Integer id) {
  Object object = phoneService.read(Phone.class, id);
  return ResponseEntity.ok(object);
 }
}

1 个答案:

答案 0 :(得分:0)

在我以前的工作之一中,我曾研究过Eclipse RCP桌面应用程序。它是一个ERP,因此请考虑它必须处理的大量数据库表以及所有可能的参数化。

该架构完全是泛型,我的意思是每个 view 都基于某些元数据表示。虽然该方法乍看起来似乎不错,但它只是马马虎虎。强大的泛化意味着总体设计中的许多折衷,泛化意味着在调试时会发疯,因为一切都在这里进行!
泛化意味着在维护代码时会发疯。那么特定的用例呢?您需要以某种方式处理。

典型的Web应用程序没有那么大,它不能处理数百个表。因此,不要害怕重复相同的 Controller-Service-Repository 模式。这就是所谓的关注点分离,甚至是数据和行为的封装。

保持您的包裹井井有条,一切都会好起来的。