diff --git a/src/Attribute/ResourceFieldEnhancer.php b/src/Attribute/ResourceFieldEnhancer.php
new file mode 100644
index 0000000000000000000000000000000000000000..f409d52061d35c80f341f896b3ce348b8e4e51ce
--- /dev/null
+++ b/src/Attribute/ResourceFieldEnhancer.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Drupal\jsonapi_extras\Attribute;
+
+use Drupal\Component\Plugin\Attribute\Plugin;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+
+/**
+ * Defines a Plugin annotation object for resource field enhancers.
+ *
+ * @see \Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerInterface
+ */
+#[\Attribute(\Attribute::TARGET_CLASS)]
+class ResourceFieldEnhancer extends Plugin {
+
+  /**
+   * Constructs a ResourceFieldEnhancer attribute.
+   *
+   * @param string $id
+   *   The plugin ID.
+   * @param \Drupal\Core\StringTranslation\TranslatableMarkup $label
+   *   The human-readable name of the formatter type.
+   * @param \Drupal\Core\StringTranslation\TranslatableMarkup $description
+   *   A short description of the formatter type.
+   * @param array $dependencies
+   *   The name of modules that are required for this Field Enhancer to be usable.
+   */
+  public function __construct(
+    public readonly string $id,
+    public readonly TranslatableMarkup $label,
+    public readonly TranslatableMarkup $description,
+    public readonly array $dependencies = [],
+  ) {
+  }
+
+}
diff --git a/src/Plugin/ResourceFieldEnhancerManager.php b/src/Plugin/ResourceFieldEnhancerManager.php
index 4123d17e42405c3a7a1529e736853562a0db9b4e..063057073b6b178f6aca552a1ba79a6a530891a7 100644
--- a/src/Plugin/ResourceFieldEnhancerManager.php
+++ b/src/Plugin/ResourceFieldEnhancerManager.php
@@ -22,13 +22,18 @@ class ResourceFieldEnhancerManager extends DefaultPluginManager {
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
    *   The module handler to invoke the alter hook with.
    */
-  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
+  public function __construct(
+    \Traversable $namespaces,
+    CacheBackendInterface $cache_backend,
+    ModuleHandlerInterface $module_handler,
+  ) {
     parent::__construct(
       'Plugin/jsonapi/FieldEnhancer',
       $namespaces,
       $module_handler,
       'Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerInterface',
-      'Drupal\jsonapi_extras\Annotation\ResourceFieldEnhancer'
+      'Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer',
+      'Drupal\jsonapi_extras\Annotation\ResourceFieldEnhancer',
     );
 
     $this->alterInfo('resource_field_enhancer_info');
diff --git a/src/Plugin/jsonapi/FieldEnhancer/DateTimeEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/DateTimeEnhancer.php
index 26382d0a1081da0b7e3fedfca8e699e7fba856e1..9aa20999ecd5c23a886715ba35631a2ec7a0d329 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/DateTimeEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/DateTimeEnhancer.php
@@ -3,19 +3,20 @@
 namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
 use Drupal\Core\Datetime\DrupalDateTime;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\DateTimeEnhancerBase;
 use Shaper\Util\Context;
 
 /**
  * Perform additional manipulations to timestamp fields.
- *
- * @ResourceFieldEnhancer(
- *   id = "date_time",
- *   label = @Translation("Date Time (Timestamp field)"),
- *   description = @Translation("Formats a date based the configured date format for timestamp fields."),
- *   dependencies = {"datetime"}
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'date_time',
+  label: new TranslatableMarkup('Date Time (Timestamp field)'),
+  description: new TranslatableMarkup('Formats a date based the configured date format for timestamp fields.'),
+  dependencies: ['datetime'],
+)]
 class DateTimeEnhancer extends DateTimeEnhancerBase {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/DateTimeFromStringEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/DateTimeFromStringEnhancer.php
index 4c4f3b42c5b35fb30a7a8d6260b136d40b06537e..c48d4b23be81ba53bf3a2725e25041d05b09e482 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/DateTimeFromStringEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/DateTimeFromStringEnhancer.php
@@ -2,20 +2,21 @@
 
 namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
+use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\DateTimeEnhancerBase;
 use Shaper\Util\Context;
 
 /**
  * Perform additional manipulations to datetime fields.
- *
- * @ResourceFieldEnhancer(
- *   id = "date_time_from_string",
- *   label = @Translation("Date Time (Date Time field)"),
- *   description = @Translation("Formats a date based the configured date format for date fields."),
- *   dependencies = {"datetime"}
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'date_time_from_string',
+  label: new TranslatableMarkup('Date Time (Date Time field)'),
+  description: new TranslatableMarkup('Formats a date based the configured date format for date fields.'),
+  dependencies: ['datetime'],
+)]
 class DateTimeFromStringEnhancer extends DateTimeEnhancerBase {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/JSONFieldEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/JSONFieldEnhancer.php
index 327ffccc58c17e13246081b563def91de392a099..05c6c2ab389a8e8a8ac6cf4beba99f32fa0bb528 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/JSONFieldEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/JSONFieldEnhancer.php
@@ -4,19 +4,20 @@ namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
 use Drupal\Component\Serialization\Json;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerBase;
 use Shaper\Util\Context;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Perform additional manipulations to JSON fields.
- *
- * @ResourceFieldEnhancer(
- *   id = "json",
- *   label = @Translation("JSON Field"),
- *   description = @Translation("Render JSON Field has real json")
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'json',
+  label: new TranslatableMarkup('JSON Field'),
+  description: new TranslatableMarkup('Render JSON Field has real json'),
+)]
 class JSONFieldEnhancer extends ResourceFieldEnhancerBase implements ContainerFactoryPluginInterface {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/ListFieldEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/ListFieldEnhancer.php
index 4db984454e4a1f27606c005b02ed9114ce601c10..acc6ca291bb93e17092aea43b6077374deaab183 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/ListFieldEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/ListFieldEnhancer.php
@@ -2,19 +2,20 @@
 
 namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerBase;
 use Drupal\options\Plugin\Field\FieldType\ListItemBase;
 use Shaper\Util\Context;
 
 /**
  * Perform additional manipulations to list fields.
- *
- * @ResourceFieldEnhancer(
- *   id = "list",
- *   label = @Translation("List Field"),
- *   description = @Translation("Formats a list field based on labels and values.")
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'list',
+  label: new TranslatableMarkup('List Field'),
+  description: new TranslatableMarkup('Formats a list field based on labels and values.'),
+)]
 class ListFieldEnhancer extends ResourceFieldEnhancerBase {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php
index c712bf5736e8072206334f064ce8552d507c2644..16f83d3b814deff1b43446678001c9099a303398 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php
@@ -2,18 +2,19 @@
 
 namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerBase;
 use Shaper\Util\Context;
 
 /**
  * Perform additional manipulations to date fields.
- *
- * @ResourceFieldEnhancer(
- *   id = "nested",
- *   label = @Translation("Single Nested Property"),
- *   description = @Translation("Extracts or wraps nested properties from an object.")
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'nested',
+  label: new TranslatableMarkup('Single Nested Property'),
+  description: new TranslatableMarkup('Extracts or wraps nested properties from an object.'),
+)]
 class SingleNestedEnhancer extends ResourceFieldEnhancerBase {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php
index 9566d57504a09493e76ba87976fec0281b6627e2..03be2839c2839c9cd544c479249f9bf5329846b6 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php
@@ -6,7 +6,9 @@ use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Logger\LoggerChannelFactoryInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\Core\Url;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerBase;
 use Drupal\serialization\Normalizer\CacheableNormalizerInterface;
 use Shaper\Util\Context;
@@ -14,13 +16,12 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Add URL aliases to links.
- *
- * @ResourceFieldEnhancer(
- *   id = "url_link",
- *   label = @Translation("URL for link (link field only)"),
- *   description = @Translation("Use Url for link fields.")
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'url_link',
+  label: new TranslatableMarkup('URL for link (link field only)'),
+  description: new TranslatableMarkup('Use Url for link fields.'),
+)]
 class UrlLinkEnhancer extends ResourceFieldEnhancerBase implements ContainerFactoryPluginInterface {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php
index 5c0383c0a1a1407aa8308e76476a6f3df56db8ba..bd366f6c73fdec42ffac99c0645c988266ac77dd 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php
@@ -4,19 +4,20 @@ namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerBase;
 use Shaper\Util\Context;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Use UUID for internal link field value.
- *
- * @ResourceFieldEnhancer(
- *   id = "uuid_link",
- *   label = @Translation("UUID for link (link field only)"),
- *   description = @Translation("Use UUID for internal link field.")
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'uuid_link',
+  label: new TranslatableMarkup('UUID for link (link field only)'),
+  description: new TranslatableMarkup('Use UUID for internal link field.'),
+)]
 class UuidLinkEnhancer extends ResourceFieldEnhancerBase implements ContainerFactoryPluginInterface {
 
   /**