1

考虑以下两个选项:

选项 #1:在控制器中自动装配所需的服务

@Controller
@RequestMapping(value="/foo")
public class FooController {
    @Autowired
    private FooService fooService;

    @Autowired
    private BarService barService;

    @Autowired
    private BazService bazService;

    @RequestMapping(method=RequestMethod.GET)
    public String getFoo(...) {
        Foo foo = fooService.getFooInstance(...);

        List<Foo> foos = fooService.getFooList(foo);
        List<Bar> bars = barService.getBarList(foo);
        Baz baz        = bazService.getBaz(foo);

        ...

        return "view/foo/index.jsp";
    }
}

选项 #2:在特定服务中为 UoW 自动装配依赖服务

@Controller
@RequestMapping(value="/foo")
public class FooController {
    @Autowired
    private FooService fooService;

    @RequestMapping(method=RequestMethod.GET)
    public String getFoo(...) {
        Foo foo = fooService.getFooInstance(...);

        FooDTO fooInfo = fooService.getFooAllInformation(foo);

        List<Foo> foos = fooInfo.getFoos();
        List<Bar> bars = fooInfo.getBars();
        Baz baz        = fooInfo.getBaz();
        ...

        return "view/foo/index.jsp";
    }
}


@Service
public class FooServiceImpl implements FooService {
    @Autowired
    private FooRepository fooRepository;

    @Autowired
    private BarService barService;

    @Autowired
    private BazService bazService;

    ...

    @Override
    @Transactional
    public FooDTO getFooAllInformation(Foo foo) {
        List<Foo> foos = getFooList(foo);
        List<Bar> bars = barService.getBarList(foo);
        Baz baz        = bazService.getBaz(foo);

        ...
    }
}

好吧,目前我正在使用选项#1,一切正常。但我想知道这种方法是否足够好。它们中的任何一个比另一个有任何显着优势吗?我应该提到我知道服务@TransactionalINSERT一部分(我在这里省略了)。但是仅仅读取数据呢。

4

1 回答 1

4

第二种选择更清洁、更快、更安全。它基本上是使用外观模式。

更干净,因为它将代码业务代码移到 UI 层之外,在它所属的服务层中。

更快,因为由于一切都在同一个事务中进行,您将保存事务的打开和关闭,并从事务缓存中受益(假设您使用 ORM 来获取所需的数据)。如果 UI 和服务层位于单独的 JVM 上,它当然会更快。

更安全,因为因为一切都在同一个事务中,每个服务将从同一个一致的数据库“快照”中获取数据。在第一个选项中,您可以让第一个方法返回一个在调用第二个服务时不再存在的 foo。当然,这取决于数据库的事务隔离级别,但它总是比在多个事务中进行更安全。

于 2013-03-10T09:34:40.570 回答