模块化
跨文件(模块)import
Java只能import Class。Java的变量和函数不能脱离Class存在。File - Class - Var/Func
Python/JS/Go可以 import 变量。Class是可选的,封装逻辑的工具。File - Var/Func
- java每个文件都定义类
- 根本没有独立于类,在类加载阶段就初始化的变量
- 所以java不能import变量
Dagger:
- 设计模式(Design Patterns):工厂模式的例子:
- 用一个工厂类根据参数创建不同产品
- 封装复杂对象的内部部件创建和组装过程
- Dagger主要省去手动注入的麻烦,单例/复用只是附带功能。
- 默认
@Inject
每次调用都建新的实例,需要@Singleton
实现单例。
- 默认
- 一个类型C可以被@Inject或者@Provides变为可自动注入
- 之后不论是用@Inject或者@Provides变为可自动注入的类,可以相互任意嵌套
Java Dagger @inject只有三种写法:类构造函数,类字段,类方法
1 写在构造函数上的@inject实现了两个功能,自动填充 [可注入类型] 参数,声明新 [可注入类型]
2 写在类字段或者方法上的@inject则只实现了,自动填充 [可注入类型] 字段/参数
- 如果一个Class作为了@Provides的返回类,就可以被直接注入到其它类了。
- 如果一个Class作为了@Provides的返回类,就可以被当作Component的返回类了。
- 如果一个Class的构造函数被@Inject,就可以被直接注入到其它类了。
- 如果一个Class的构造函数被@Inject,就可以被当作Component的返回类了。
- 一个Class被作为两个@Provides的返回类,会报错。
@Inject
放权给框架填写,@component
声明工厂的接口。然后你就会获得一个工厂。@Inject
表示这个 [构造函数的参数|声明的变量] 由框架填写,框架应该有全部所需信息。
- 如果有String等框架无法决定的类型,则报错。这种更复杂的情况要用
@Module
- 解耦了“手动new”和“手动传入”的过程。
@Module
+@Provides
,新建一个Wrapper,解决需要传入参数/第三方库场景无法使用@Inject
的问题。class NetworkClient { public NetworkClient(String baseUrl) { ... } } @Module class NetworkModule { @Provides NetworkClient provideClient() { return new NetworkClient("https://api.example.com"); } } @Component(modules = {NetworkModule.class}) interface AppComponent { NetworkClient client(); }
Lambda & Dagger
1 最简单的lambda,就是CDK → Handler类(实现了RequestHandler接口)
2 使用 @Inject时,由于Handler类需要参数,改为暴露一个@Component中返回Handler的方法。[@LambdaHandler]
[x] [HandlerWrapper是自动生成的]3 如果不使用[ @LambdaHandler],只能CDK → HandlerWrapper类(实现RequestHandler)
HandlerWrapper将消息转发给component.handler。
!使用[ @LambdaHandler] 会自动生成HandlerWrapper,直接CDK→LambdaHandler就好。
handler:'com.amazon.offshoreitempartneradapterhandlerlambda.lambda.handler.ProcessHandlerWrapper::handleRequest',
JavaScript两种模块化方式:
CommonJS
- 使用
require
来引入模块,module.exports
来导出模块。
- 主要用于 Node.js 环境。<--webpack默认方式
- 同步加载,适用于服务器端。
// 导出
module.exports = [];
// 引入
const myModule = require('./myModule');
ES Modules (ESM):
- 使用
import
和export
来进行模块的引入和导出。
- 浏览器
- ES Modules 是异步加载
// 导出
export function greet() {
}
// 引入
import { greet } from './myModule';