Phân tích XMLConfigBuilder trong MyBatis

Lớp XMLConfigBuilder nằm trong gói org.apache.ibatis.builder.xml, kế thừa từ BaseBuilder. Đúng như tên gọi, lớp này chịu trách nhiệm phân tích và xây dựng cấu hình MyBatis từ tệp XML.

Lớp này quản lý 4 thuộc tính chính:

private boolean isParsed; // đánh dấu đã phân tích chưa
private XPathParser xmlParser;
private String activeEnv;
private ReflectorFactory reflectorFactory = new DefaultReflectorFactory();

Có tổng cộng 6 constructor công khai, tất cả đều chuyển tiếp về một constructor riêng tư duy nhất:

public XMLConfigBuilder(Reader configReader) {
    this(configReader, null, null);
}

public XMLConfigBuilder(Reader configReader, String env) {
    this(configReader, env, null);
}

public XMLConfigBuilder(Reader configReader, String env, Properties customProps) {
    this(new XPathParser(configReader, true, customProps, new XMLMapperEntityResolver()), env, customProps);
}

public XMLConfigBuilder(InputStream configStream) {
    this(configStream, null, null);
}

public XMLConfigBuilder(InputStream configStream, String env) {
    this(configStream, env, null);
}

public XMLConfigBuilder(InputStream configStream, String env, Properties customProps) {
    this(new XPathParser(configStream, true, customProps, new XMLMapperEntityResolver()), env, customProps);
}

private XMLConfigBuilder(XPathParser parser, String env, Properties props) {
    super(new Configuration());
    ErrorContext.instance().resource("MyBatis Configuration");
    configuration.setVariables(props);
    this.isParsed = false;
    this.activeEnv = env;
    this.xmlParser = parser;
}

Constructor riêng tư khởi tạo đối tượng Configuration thông qua lớp cha, sau đó gán các giá trị đầu vào cho các thuộc tính tương ứng.

Phương thức trọng tâm là parse(), được gọi bởi SqlSessionFactoryBuilder để lấy cấu hình toàn cục:

public Configuration parse() {
    if (isParsed) {
        throw new BuilderException("Mỗi XMLConfigBuilder chỉ được dùng một lần.");
    }
    isParsed = true;
    processRootNode(xmlParser.evalNode("/configuration"));
    return configuration;
}

private void processRootNode(XNode rootNode) {
    try {
        Properties globalSettings = extractSettings(rootNode.evalNode("settings"));
        loadExternalProperties(rootNode.evalNode("properties"));
        initializeVfs(globalSettings);
        registerTypeAliases(rootNode.evalNode("typeAliases"));
        applyPlugins(rootNode.evalNode("plugins"));
        configureObjectFactory(rootNode.evalNode("objectFactory"));
        configureWrapperFactory(rootNode.evalNode("objectWrapperFactory"));
        configureReflectorFactory(rootNode.evalNode("reflectorFactory"));
        applySettings(globalSettings);
        setupEnvironments(rootNode.evalNode("environments"));
        setupDatabaseIdProvider(rootNode.evalNode("databaseIdProvider"));
        registerTypeHandlers(rootNode.evalNode("typeHandlers"));
        loadMapperDefinitions(rootNode.evalNode("mappers"));
    } catch (Exception ex) {
        throw new BuilderException("Lỗi khi phân tích cấu hình MyBatis: " + ex.getMessage(), ex);
    }
}

Mỗi phương thức con trong processRootNode sẽ xử lý một phần tử XML cụ thể và cập nhật vào đối tượng Configuration. Chi tiết về lớp Configuration sẽ được trình bày ở bài tiếp theo.

Tóm lại, XMLConfigBuilder đóng vai trò trung tâm trong việc đọc tệp mybatis-config.xml, phân tích cú pháp XML, và ánh xạ nội dung vào cấu trúc đối tượng Configuration để MyBatis sử dụng trong suốt vòng đời ứng dụng.

Thẻ: mybatis XMLConfigBuilder Configuration XPathParser Java

Đăng vào ngày 17 tháng 6 lúc 20:52