1

次の 2 つのオプションを検討してください。

オプション #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

2 番目のオプションは、クリーンで、高速で、安全です。基本的にファサードパターンを使用しています。

コード ビジネス コードを UI レイヤーの外側、つまりそれが属するサービス レイヤーに移動するため、よりクリーンになります。

すべてが同じトランザクションで行われるため、トランザクションの開始と終了が保存され、トランザクションキャッシュの恩恵を受けるため、より高速になります (ORM を使用して必要なデータを取得すると仮定します)。もちろん、UI レイヤーとサービス レイヤーが別の JVM 上にある場合は、さらに高速になります。

すべてが同じトランザクション内にあるため、各サービスは同じ一貫したデータベース「スナップショット」からデータを取得するため、より安全です。最初のオプションでは、2 番目のサービスが呼び出されたときに、最初のメソッドがもう存在しない foo を返すようにすることができます。もちろん、これはデータベースのトランザクション分離レベルに依存しますが、複数のトランザクションで行うより常に安全です。

于 2013-03-10T09:34:40.570 に答える