diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82975-DeprecateUsageOfInjectWithNonPublicProperties.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82975-DeprecateUsageOfInjectWithNonPublicProperties.rst
new file mode 100644
index 0000000000000000000000000000000000000000..cd0bd3d3e1253ffd0c46e4d74a20226890be18b1
--- /dev/null
+++ b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82975-DeprecateUsageOfInjectWithNonPublicProperties.rst
@@ -0,0 +1,58 @@
+.. include:: ../../Includes.txt
+
+===========================================================================
+Deprecation: #82975 - Deprecate usage of @inject with non-public properties
+===========================================================================
+
+See :issue:`82975`
+
+Description
+===========
+
+When using private or protected properties for Dependency Injection via :php:`@inject`, Extbase needs to
+use the object reflection API to make these properties settable from the outside,
+which is quite slow and cannot be cached in any way. Therefore property injection should
+only work for public properties.
+
+
+Impact
+======
+
+Using :php:`@inject` with a non-public property will trigger a deprecation warning and will
+not work any longer in TYPO3 version 10.
+
+
+Affected Installations
+======================
+
+All installations, that use property injection via :php:`@inject` with non-public properties
+
+
+Migration
+=========
+
+You have the following options to migrate:
+
+ - Introduce an explicit :php:`inject*()` method (e.g. :php:`injectMyProperty()`)
+ - Use constructor injection
+ - Make the property public (think about whether this is desired in terms of software design)
+
+
+An inject method would look like this:
+
+.. code-block:: php
+
+   /**
+    * @var MyFancyProperty $myFancyProperty
+    */
+   private $myFancyProperty;
+
+   /**
+    * @param MyFancyProperty $myFancyProperty
+    */
+   public function injectMyFancyProperty(MyFancyProperty $myFancyProperty): void
+   {
+      $this->myFancyProperty = $myFancyProperty;
+   }
+
+.. index:: PHP-API, ext:extbase, NotScanned
diff --git a/typo3/sysext/extbase/Classes/Reflection/ClassSchema.php b/typo3/sysext/extbase/Classes/Reflection/ClassSchema.php
index 580638693b9aae33f4aee410e00887aa232c2c30..fc36ebdf9154c6636dceee7399d8ee739af37085 100644
--- a/typo3/sysext/extbase/Classes/Reflection/ClassSchema.php
+++ b/typo3/sysext/extbase/Classes/Reflection/ClassSchema.php
@@ -194,6 +194,13 @@ class ClassSchema
                     $this->properties[$propertyName]['annotations']['type'] = ltrim($varValues[0], '\\');
                     $this->properties[$propertyName]['annotations']['dependency'] = ltrim($varValues[0], '\\');
 
+                    if (!$reflectionProperty->isPublic()) {
+                        trigger_error(
+                            'Using @inject with non-public properties is deprecated since TYPO3 v9.0 and will stop working in TYPO3 v10.0.',
+                            E_USER_DEPRECATED
+                        );
+                    }
+
                     $this->injectProperties[] = $propertyName;
                 } catch (\Exception $e) {
                 }