دليل مطور Java لـ Azure Functions

يحتوي هذا الدليل على معلومات مفصلة من شأنها مساعدتك على النجاح في تطوير Azure Functions باستخدام Java.

بصفتك مطور Java، إذا كنت جديدا على Azure Functions، ففكر في قراءة إحدى المقالات التالية أولا:

الشروع في العمل المفاهيم السيناريوهات/ العينات

أساسيات وظيفة Java

وظيفة Java هي أسلوب public، مزود بالتعليق التوضيحي @FunctionName. هذا الأسلوب يُعرّف الإدخال لوظيفة Java، وهو فريد في حزمة معينة. يمكن أن تحتوي الحزمة على فئات متعددة بأساليب عامة متعددة مزودة بتعليق توضيحي يشير إلى @FunctionName. يتم توزيع حزمة واحدة إلى تطبيق وظائف في Azure. في Azure، يوفر تطبيق الوظائف سياق النشر والتنفيذ والإدارة لوظائف Java الفردية.

نموذج البرمجة

مفاهيم المشغّلات والروابط من أساسيات Azure Functions. تبدأ المشغّلات تنفيذ التعليمة البرمجية. وتتيح لك الروابط إمكانية تمرير البيانات إلى أي وظيفة دون الحاجة إلى كتابة تعليمة برمجية مخصصة للوصول إلى البيانات.

إنشاء وظائف Java

لتسهيل إنشاء وظائف Java، توجد أدوات ونماذج أصلية تستخدم قوالب Java المعرّفة مسبقاً لمساعدتك في إنشاء مشاريع باستخدام مشغّل وظيفة محدد.

الأدوات المستندة إلى Maven

تحتوي بيئات المطور التالية على أداة Azure Functions التي تتيح لك إنشاء مشاريع وظائف Java:

توضح لك هذه المقالات كيفية إنشاء وظائفك الأولى باستخدام IDE الذي تختاره.

دعم المشروع

إذا كنت تفضل تطوير سطر الأوامر من Terminal، فإن أبسط طريقة لدعم مشاريع الوظيفة المستندة إلى Java هي استخدام النماذج الأصلية Apache Maven. يتم نشر النموذج الأصلي Java Maven لـ Azure Functions تحت groupId التالي:artifactId: com.microsoft.azure:azure-functions-archetype.

يؤدي الأمر التالي إلى إنشاء مشروع وظيفة Java جديد باستخدام هذا النموذج الأصلي:

mvn archetype:generate \
    -DarchetypeGroupId=com.microsoft.azure \
    -DarchetypeArtifactId=azure-functions-archetype

لبدء استخدام هذا النموذج الأصلي، راجع التشغيل السريع لـ Java.

بنية المجلد

فيما يلي بنية المجلد لمشروع Azure Functions Java:

FunctionsProject
 | - src
 | | - main
 | | | - java
 | | | | - FunctionApp
 | | | | | - MyFirstFunction.java
 | | | | | - MySecondFunction.java
 | - target
 | | - azure-functions
 | | | - FunctionApp
 | | | | - FunctionApp.jar
 | | | | - host.json
 | | | | - MyFirstFunction
 | | | | | - function.json
 | | | | - MySecondFunction
 | | | | | - function.json
 | | | | - bin
 | | | | - lib
 | - pom.xml

يمكنك استخدام ملف host.json مشترك لتكوين تطبيق الوظائف. كل وظيفة لها ملف التعليمات البرمجية الخاصة بها (.java) وملف تكوين الربط (function.json).

يمكنك وضع أكثر من وظيفة واحدة في مشروع. تجنب وضع وظائفك في أماكن منفصلة. يتم توزيع FunctionApp الموجود في الدليل المستهدف إلى تطبيق الوظائف في Azure.

المشغّلات والتعليقات التوضيحية

يتم استدعاء Functions بواسطة مشغّل، مثل طلب HTTP أو مؤقت أو تحديث للبيانات. تحتاج الوظيفة إلى معالجة هذا المشغّل وأي مدخلات أخرى لإنتاج مخرج واحد أو أكثر.

استخدم تعليقات Java التوضيحية المضمنة في حزمة com.microsoft.azure.functions.annotation.* لربط المدخلات والمخرجات بأساليبك. للحصول على مزيد من المعلومات، راجع ⁧⁩⁧الوثائق المرجعية لـ Java⁩.

هام

يجب تكوين حساب Azure Storage في local.settings.json لتشغيل Azure Blob storage أو Azure Queue storage أو مشغلات Azure Table storage محلياً.

مثال:

public class Function {
    public String echo(@HttpTrigger(name = "req", 
      methods = {HttpMethod.POST},  authLevel = AuthorizationLevel.ANONYMOUS) 
        String req, ExecutionContext context) {
        return String.format(req);
    }
}

فيما يلي المطابقة function.json التي تم إنشاؤها بواسطة azure-functions-maven-plugin:

{
  "scriptFile": "azure-functions-example.jar",
  "entryPoint": "com.example.Function.echo",
  "bindings": [
    {
      "type": "httpTrigger",
      "name": "req",
      "direction": "in",
      "authLevel": "anonymous",
      "methods": [ "GET","POST" ]
    },
    {
      "type": "http",
      "name": "$return",
      "direction": "out"
    }
  ]
}

إصدارات Java

يتم تحديد إصدار Java الذي يتم تشغيل تطبيقك عليه في Azure في ملف pom.xml. ينشئ النموذج الأصلي لـ Maven حالياً ملف pom.xml لـ Java 8، والذي يمكنك تغييره قبل النشر. يجب أن يتطابق إصدار Java في pom.xml مع الإصدار الذي قمت بتطوير تطبيقك واختباره محليا.

الإصدارات المدعومة

يعرض الجدول التالي إصدارات Java المدعمة الحالية لكل إصدار رئيسي من وقت تشغيل Functions، حسب نظام التشغيل:

إصدار الدوال إصدارات Java (Windows) إصدارات Java (Linux)
4.x 17
11
8
21 (معاينة)
17
11
8
3.x 11
8
11
8
2.x 8 غير متوفر

إذا لم تحدد إصدار Java ليتم توزيعه، فإن النموذج الأصلي لـ Maven سيُعين بشكل افتراضي على Java 8 أثناء التوزيع إلى Azure.

تحديد إصدار التوزيع

يمكنك التحكم في إصدار Java المستهدف من قبل النموذج الأصلي لـ Maven باستخدام المعلّمة -DjavaVersion. يمكن أن تكون قيمة هذه المعلمة إما 8أو 11أو 1721.

ينشئ النموذج الأصلي لـ Maven ملف pom.xml يستهدف إصدار Java المحدد. تشير العناصر التالية في pom.xml إلى إصدار Java المطلوب استخدامه:

العنصر قيمة Java 8 قيمة Java 11 قيمة Java 17 قيمة Java 21 (معاينة، Linux) ‏‏الوصف
Java.version 1.8 11 17 21 نسخة من Java المستخدم من قبل maven-compiler-plugin.
JavaVersion 8 11 17 21 إصدار Java المستضاف من قبل تطبيق الوظائف في Azure.

تعرض الأمثلة التالية إعدادات Java 8 في المقاطع ذات الصلة بملف pom.xml:

Java.version

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <azure.functions.maven.plugin.version>1.6.0</azure.functions.maven.plugin.version>
    <azure.functions.java.library.version>1.3.1</azure.functions.java.library.version>
    <functionAppName>fabrikam-functions-20200718015742191</functionAppName>
    <stagingDirectory>${project.build.directory}/azure-functions/${functionAppName}</stagingDirectory>
</properties>

JavaVersion

<runtime>
    <!-- runtime os, could be windows, linux or docker-->
    <os>windows</os>
    <javaVersion>8</javaVersion>
    <!-- for docker function, please set the following parameters -->
    <!-- <image>[hub-user/]repo-name[:tag]</image> -->
    <!-- <serverId></serverId> -->
    <!-- <registryUrl></registryUrl>  -->
</runtime>

هام

يجب أن يكون تكون متغيرات البيئة JAVA_HOME معينة بشكل صحيح على الدليل JDK المستخدم أثناء تجميع التعليمات البرمجية باستخدام Maven. تأكد من أن إصدار JDK على الأقل على نفس مستوى إعداد Java.version.

تحديد نظام تشغيل التوزيع

يسمح لك Maven أيضاً بتحديد نظام التشغيل الذي تريد تشغيل تطبيق الوظائف في Azure عليه. استخدم العنصر os لاختيار نظام التشغيل.

العنصر Windows Linux Docker
os windows linux docker

يوضح المثال التالي إعداد نظام التشغيل في مقطع runtime لملف pom.xml:

<runtime>
    <!-- runtime os, could be windows, linux or docker-->
    <os>windows</os>
    <javaVersion>8</javaVersion>
    <!-- for docker function, please set the following parameters -->
    <!-- <image>[hub-user/]repo-name[:tag]</image> -->
    <!-- <serverId></serverId> -->
    <!-- <registryUrl></registryUrl>  -->
</runtime>

توفر وقت تشغيل JDK والدعم

يتم توفير إصدارات Microsoft و Adoptium من OpenJDK ودعمها على Functions ل Java 8 (Adoptium) وJava 11 و17 و21 (MSFT). يتم توفير هذه الثنائيات كتوزيع مجاني ومتعدد الأنظمة الأساسية وجاهز لإنتاج OpenJDK لنظام Azure. وهي تحتوي على جميع المكونات لبناء وتشغيل تطبيقات Java SE.

للتطوير المحلي أو الاختبار، يمكنك تنزيل إصدار Microsoft من ثنائيات OpenJDK أو Adoptium Temurin مجانًا. يتوفر دعم Azure لمشكلات JDKs وتطبيقات الوظائف مع خطة دعم مؤهلة.

إذا كنت ترغب في الاستمرار في استخدام ثنائيات Zulu ل Azure على تطبيق الوظائف، فكون تطبيقك وفقا لذلك. يمكنك الاستمرار في استخدام ثنائيات Azul لموقعك. ومع ذلك، لا تتوفر أي تصحيحات أو تحسينات أمان إلا في الإصدارات الجديدة من OpenJDK. ولهذا السبب، يجب عليك في النهاية إزالة هذا التكوين بحيث تستخدم تطبيقاتك أحدث إصدار متوفر من Java.

تخصيص JVM

تتيح لك Functions تخصيص جهاز Java الظاهري (JVM) المستخدم لتشغيل وظائف Java. يتم استخدام خيارات JVM التالية بشكل افتراضي:

  • -XX:+TieredCompilation
  • -XX:TieredStopAtLevel=1
  • -noverify
  • -Djava.net.preferIPv4Stack=true
  • -jar

يمكنك توفير وسيطات أخرى إلى JVM باستخدام أحد إعدادات التطبيق التالية، اعتمادا على نوع الخطة:

نوع الخطة اسم الإعداد تعليق
خطة الاستهلاك languageWorkers__java__arguments يزيد هذا الإعداد من أوقات البدء الباردة لوظائف Java التي تعمل في خطة Consumption.
خطة متميزة
خطة مخصصة
JAVA_OPTS

توضح لك الأقسام التالية كيفية إضافة هذه الإعدادات. لمعرفة المزيد حول العمل مع إعدادات التطبيق، راجع قسم العمل مع إعدادات التطبيق.

مدخل Azure

في مدخل Microsoft Azure، استخدم علامة التبويب Application الإعدادات لإضافة الإعداد languageWorkers__java__arguments أو JAVA_OPTS .

Azure CLI

يمكنك استخدام الأمر az functionapp config appsettings set لإضافة هذه الإعدادات، كما هو موضح في المثال التالي للخيار -Djava.awt.headless=true :

az functionapp config appsettings set \
    --settings "languageWorkers__java__arguments=-Djava.awt.headless=true" \
    --name <APP_NAME> --resource-group <RESOURCE_GROUP>

هذا المثال يمكّن وضع بدون أجهزة ملحقة. اجعل اسم تطبيق الوظائف يحل محل <APP_NAME>، وضع اسم مجموعة الموارد محل <RESOURCE_GROUP>.

مكتبات الجهات الخارجية

تدعم Azure Functions استخدام مكتبات الجهات الخارجية. بشكل افتراضي، يتم تجميع كل التبعيات المحددة في ملف مشروع pom.xml تلقائياً أثناء هدف mvn package. بالنسبة إلى المكتبات غير المحددة كتبعيات في ملف pom.xml، فيمكن وضعها في دليل lib في الدليل الجذر للوظيفة. تُضاف التبعيات في دليل lib إلى أداة تحميل فئة النظام في وقت التشغيل.

تتوفر تبعية com.microsoft.azure.functions:azure-functions-java-libraryعلى classpath بشكل افتراضي، ولا تحتاج إلى تضمينها في دليل lib. يضيف azure-functions-java-worker أيضًا التبعيات الواردة هنا إلى classpath.

دعم نوع البيانات

يمكنك استخدام عناصر Plain old Java (POJOs) أو الأنواع المعرفة في azure-functions-java-library أو أنواع البيانات الأولية مثل السلسلة و العدد الصحيح لربطها بروابط الإدخال أو الإخراج.

POJOs

لتحويل بيانات الإدخال إلى POJO، يستخدم azure-functions-java-worker مكتبة gson. يجب أن تكون أنواع POJO المستخدمة كإدخالات للوظائف public.

بيانات ثنائية

يمكنك ربط المدخلات أو المخرجات الثنائية بـ byte[]، عن طريق تعيين الحقل dataType في function.json على binary:

   @FunctionName("BlobTrigger")
    @StorageAccount("AzureWebJobsStorage")
     public void blobTrigger(
        @BlobTrigger(name = "content", path = "myblob/{fileName}", dataType = "binary") byte[] content,
        @BindingName("fileName") String fileName,
        final ExecutionContext context
    ) {
        context.getLogger().info("Java Blob trigger function processed a blob.\n Name: " + fileName + "\n Size: " + content.length + " Bytes");
    }

إذا كنت تتوقع قيم فارغة، فاستخدم Optional<T>.

Bindings

توفر روابط الإدخال والإخراج طريقة توضيحية للاتصال بالبيانات من داخل التعليمات البرمجية. يمكن أن تحتوي الوظيفة على روابط إدخال وإخراج متعددة.

مثال ربط الإدخال

package com.example;

import com.microsoft.azure.functions.annotation.*;

public class Function {
    @FunctionName("echo")
    public static String echo(
        @HttpTrigger(name = "req", methods = { HttpMethod.PUT }, authLevel = AuthorizationLevel.ANONYMOUS, route = "items/{id}") String inputReq,
        @TableInput(name = "item", tableName = "items", partitionKey = "Example", rowKey = "{id}", connection = "AzureWebJobsStorage") TestInputData inputData,
        @TableOutput(name = "myOutputTable", tableName = "Person", connection = "AzureWebJobsStorage") OutputBinding<Person> testOutputData
    ) {
        testOutputData.setValue(new Person(httpbody + "Partition", httpbody + "Row", httpbody + "Name"));
        return "Hello, " + inputReq + " and " + inputData.getKey() + ".";
    }

    public static class TestInputData {
        public String getKey() { return this.rowKey; }
        private String rowKey;
    }
    public static class Person {
        public String partitionKey;
        public String rowKey;
        public String name;

        public Person(String p, String r, String n) {
            this.partitionKey = p;
            this.rowKey = r;
            this.name = n;
        }
    }
}

يمكنك استدعاء هذه الوظيفة بطلب HTTP.

  • يتم تمرير البيانات الأساسية لطلب HTTP باعتباره String للوسيطة inputReq.
  • يتم استرداد إدخال واحد من Table storage، ويتم تمريره باعتباره TestInputData إلى الوسيطة inputData.

لاستقبال مجموعة إدخالات، يمكنك ربطها بـ String[] أو POJO[] أو List<String> أو List<POJO>.

@FunctionName("ProcessIotMessages")
    public void processIotMessages(
        @EventHubTrigger(name = "message", eventHubName = "%AzureWebJobsEventHubPath%", connection = "AzureWebJobsEventHubSender", cardinality = Cardinality.MANY) List<TestEventData> messages,
        final ExecutionContext context)
    {
        context.getLogger().info("Java Event Hub trigger received messages. Batch size: " + messages.size());
    }
    
    public class TestEventData {
    public String id;
}

يتم تشغيل هذه الدالة كلما كانت هناك بيانات جديدة في مركز الأحداث المكون. بما أن cardinality مُعيّناً على MANY، فستتلقى الوظيفة مجموعة من الرسائل من مركز الحدث. يتم تحويل EventData من مركز الأحداث إلى TestEventData لتنفيذ الوظيفة.

مثال ربط الإخراج

يمكنك ربط رابط إخراج بقيمة الإرجاع باستخدام $return.

package com.example;

import com.microsoft.azure.functions.annotation.*;

public class Function {
    @FunctionName("copy")
    @StorageAccount("AzureWebJobsStorage")
    @BlobOutput(name = "$return", path = "samples-output-java/{name}")
    public static String copy(@BlobTrigger(name = "blob", path = "samples-input-java/{name}") String content) {
        return content;
    }
}

إذا كان هناك عدة روابط إخراج، فاستخدم قيمة الإرجاع لواحد منها فقط.

لإرسال قيم إخراج متعددة، استخدم OutputBinding<T> المعرّف في حزمة azure-functions-java-library.

@FunctionName("QueueOutputPOJOList")
    public HttpResponseMessage QueueOutputPOJOList(@HttpTrigger(name = "req", methods = { HttpMethod.GET,
            HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            @QueueOutput(name = "itemsOut", queueName = "test-output-java-pojo", connection = "AzureWebJobsStorage") OutputBinding<List<TestData>> itemsOut, 
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");
       
        String query = request.getQueryParameters().get("queueMessageId");
        String queueMessageId = request.getBody().orElse(query);
        itemsOut.setValue(new ArrayList<TestData>());
        if (queueMessageId != null) {
            TestData testData1 = new TestData();
            testData1.id = "msg1"+queueMessageId;
            TestData testData2 = new TestData();
            testData2.id = "msg2"+queueMessageId;

            itemsOut.getValue().add(testData1);
            itemsOut.getValue().add(testData2);

            return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + queueMessageId).build();
        } else {
            return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("Did not find expected items in CosmosDB input list").build();
        }
    }

     public static class TestData {
        public String id;
    }

يمكنك استدعاء هذه الدالة على كائن HttpRequest . إنه يكتب قيم متعددة على تخزين Queue storage.

HttpRequestMessage وHttpResponseMessage

وهي معرّفة في azure-functions-java-library. إنها أنواع مساعدة للعمل مع وظائف HttpTrigger.

نوع متخصص استهداف الاستخدام المعتاد
HttpRequestMessage<T> مشغل HTTP إحضار الأسلوب أو العناوين أو الاستعلامات
HttpResponseMessage ربط إخراج HTTP إرجاع الحالة بخلاف 200

بيانات التعريف

تقوم بعض المشغّلات بإرسال بيانات تعريف مشغّل مع بيانات الإدخال. يمكنك استخدام التعليق التوضيحي @BindingName لربطه وتشغيل بيانات التعريف.

package com.example;

import java.util.Optional;
import com.microsoft.azure.functions.annotation.*;


public class Function {
    @FunctionName("metadata")
    public static String metadata(
        @HttpTrigger(name = "req", methods = { HttpMethod.GET, HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) Optional<String> body,
        @BindingName("name") String queryValue
    ) {
        return body.orElse(queryValue);
    }
}

في المثال السابق، يرتبط queryValue بمعلّمة سلسلة الاستعلام name في عنوان URL طلب HTTP، http://{example.host}/api/metadata?name=test. فيما يلي مثال آخر يوضح كيفية الربط بـ Id من بيانات تعريف مشغّل قائمة الانتظار.

 @FunctionName("QueueTriggerMetadata")
    public void QueueTriggerMetadata(
        @QueueTrigger(name = "message", queueName = "test-input-java-metadata", connection = "AzureWebJobsStorage") String message,@BindingName("Id") String metadataId,
        @QueueOutput(name = "output", queueName = "test-output-java-metadata", connection = "AzureWebJobsStorage") OutputBinding<TestData> output,
        final ExecutionContext context
    ) {
        context.getLogger().info("Java Queue trigger function processed a message: " + message + " with metadaId:" + metadataId );
        TestData testData = new TestData();
        testData.id = metadataId;
        output.setValue(testData);
    }

إشعار

يجب أن يتطابق الاسم الموجود في التعليق التوضيحي مع خاصية بيانات التعريف.

سياق التنفيذ

يحتوي ExecutionContext، المعرف في azure-functions-java-library على أساليب مساعدة للاتصال بوقت تشغيل الوظائف. للحصول على مزيد من المعلومات، راجع المقالة المرجعية ExecutionContext.

المسجل

استخدم getLogger، المُعرّف في ExecutionContext، لكتابة سجلات من التعليمة البرمجية للوظيفة.

مثال:


import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;

public class Function {
    public String echo(@HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) String req, ExecutionContext context) {
        if (req.isEmpty()) {
            context.getLogger().warning("Empty request body received by function " + context.getFunctionName() + " with invocation " + context.getInvocationId());
        }
        return String.format(req);
    }
}

عرض السجلات والتتبع

يمكنك استخدام Azure CLI لدفق Java stdout وتسجيل stderr وتسجيل التطبيقات الأخرى.

فيما يلي كيفية تكوين تطبيق الوظائف لكتابة سجل التطبيقات باستخدام Azure CLI:

az webapp log config --name functionname --resource-group myResourceGroup --application-logging true

لدفق السجل المخرج لتطبيق الوظائف باستخدام Azure CLI، افتح موجه أوامر جديد أوجلسة عمل Terminal أو Bash وأدخل الأمر التالي:

az webapp log tail --name webappname --resource-group myResourceGroup

يتضمن الأمر az webapp log tail خيارات تصفية الإخراج باستخدام الخيار --provider.

لتنزيل ملفات السجل كملف ZIP واحد باستخدام Azure CLI افتح موجه أوامر جديد أو جلسة عمل Terminal أو Bash ثم أدخل الأمر التالي:

az webapp log download --resource-group resourcegroupname --name functionappname

يجب تمكين سجل لنظام الملفات في مدخل Azure أو Azure CLI قبل تشغيل هذا الأمر.

متغيرات البيئة

في Functions، يتم عرض إعدادات التطبيق، مثل سلاسل اتصال الخدمة، كمتغيرات بيئة أثناء التنفيذ. يمكنك الوصول إلى هذه الإعدادات باستخدام System.getenv("AzureWebJobsStorage").

يوضح المثال التالي إعداد تطبيق مع المفتاح المسمى myAppSetting:


public class Function {
    public String echo(@HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) String req, ExecutionContext context) {
        context.getLogger().info("My app setting value: "+ System.getenv("myAppSetting"));
        return String.format(req);
    }
}

استخدام إدخال التبعية في وظائف Java

تدعم Azure Functions Java نمط تصميم برنامج حقن التبعية (DI)، وهو أسلوب لتحقيق عكس التحكم (IoC) بين الفئات وتبعياتها. توفر وظائف Java Azure ربطا للتكامل مع أطر عمل إدخال التبعية الشائعة في تطبيقات الوظائف الخاصة بك. تحتوي Azure Functions Java SPI على واجهة FunctionInstanceInjector. من خلال تنفيذ هذه الواجهة، يمكنك إرجاع مثيل من فئة الدالة وسيتم استدعاء الدالات الخاصة بك على هذا المثيل. وهذا يعطي أطر عمل مثل Spring و Quarkus و Google Guice و Dagger وما إلى ذلك القدرة على إنشاء مثيل الوظيفة وتسجيله في حاوية IOC الخاصة بهم. وهذا يعني أنه يمكنك استخدام أطر عمل إدخال التبعية هذه لإدارة وظائفك بشكل طبيعي.

إشعار

أنواع Microsoft Azure Functions Java SPI (azure-function-java-spi) هي حزمة تحتوي على جميع واجهات SPI للجهات الخارجية للتفاعل مع وقت تشغيل وظائف Microsoft Azure.

حقن مثيل الدالة لحقن التبعية

يحتوي azure-function-java-spi على واجهة FunctionInstanceInjector

package com.microsoft.azure.functions.spi.inject; 

/** 

 * The instance factory used by DI framework to initialize function instance. 

 * 

 * @since 1.0.0 

 */ 

public interface FunctionInstanceInjector { 

    /** 

     * This method is used by DI framework to initialize the function instance. This method takes in the customer class and returns 

     * an instance create by the DI framework, later customer functions will be invoked on this instance. 

     * @param functionClass the class that contains customer functions 

     * @param <T> customer functions class type 

     * @return the instance that will be invoked on by azure functions java worker 

     * @throws Exception any exception that is thrown by the DI framework during instance creation 

     */ 

    <T> T getInstance(Class<T> functionClass) throws Exception; 

} 

لمزيد من الأمثلة التي تستخدم FunctionInstanceInjector للتكامل مع أطر إدخال التبعية، راجع هذا المستودع.

الخطوات التالية

للحصول على مزيد من المعلومات حول Azure Functions Java، راجع الموارد التالية: