首页 > 解决方案 > 如果我从“清洁架构”一书中实现架构,谁必须使用包修饰符创建服务

问题描述

我读了鲍勃叔叔的书——“清洁建筑”。西蒙布朗写了一章。他修改了几种类型的架构。他提出将实现封装在包中。

在此处输入图像描述

如果我把包带回来并标记(通过图形淡化)那些可以使访问修饰符更具限制性的类型,那么画面会变得非常有趣(图 34.8)

我用spring DI实现了一种方法:

com.my.service

public interface OrderService {
    List<Order> getOrders();
}

和实施:

com.my.service.impl

@Service
class OrderServiceImpl implements OrderService {
    //...
}

它工作正常,因为 Spring 找到OrderServiceImpl标记的@Service注释。OrderServiceImpl被封装为(图 34.8.)

但是如果没有 Spring 注释配置,我怎么能重复这个呢?例如,如果我使用 Spring java 配置,我应该像这样创建一个 bean:

@Configuration
public class AppConfig {

    @Bean
    OrderService orderService(){
        return new OrderServiceImpl();
    }
}

但是OrderServiceImpl有一个包修饰符。

如果我不使用 Spring,我应该怎么做才能重复这种方法?

标签: javaspringarchitectureclean-architecture

解决方案


我会根据不同的包装类型放置配置。

逐层打包

我会创造

  • WebConfig在为 web 层创建 bean 的 com.mycompany.myapp.web` 包中
  • ServiceConfigcom.mycompany.myapp.service为服务层创建 bean 的包中
  • DataConfigcom.mycompany.myapp.data为数据层创建 bean 的包中

按功能打包

我会创造

  • OrdersConfigcom.mycompany.myapp.orders为订单功能创建 bean 的包中

端口和适配器

我会创造

  • WebPortsConfigcom.mycompany.myapp.web创建 web bean 的包中。
  • OrderConfigcom.mycompany.myapp.domain创建端口和适配器体系结构的域对象的包中。
  • DatabaseAdapersConfigcom.mycompany.myapp.database其中创建数据库适配器 bean。

按组件打包

我会创造

  • WebConfigcom.mycompany.myapp.web为 Web 内容创建所有 bean 的包中。
  • OrdersConfigcom.mycompany.myapp.orders为订单组件创建所有 bean 的包中。

部署单位

如果弹簧配置在同一个包中,则事件不能在同一个部署单元或模块中。

例如,您可以创建 aservice.jar和 aservice-config.jar以将纯应用程序与框架内容分开。

service.jar
+- com
   +- mycompany
      +- myapp
         +- service
            +- OrderService.class
            +- OrderServiceImpl.class


service-config.jar
+- com
   +- mycompany
      +- myapp
         +- service
            +- ServiceConfig.class

然后,您只需将两个 jar 放在类路径中,您可以com.mycompany.myapp.service在主类中添加到组件扫描中,也可以直接引用ServiceConfig.


推荐阅读