diff --git a/AUTHORS.rst b/AUTHORS.rst
index 1ad3e9a..84c119e 100644
--- a/AUTHORS.rst
+++ b/AUTHORS.rst
@@ -62,3 +62,4 @@ Contributors (chronological)
 - Bastien Gerard `@bagerard <https://github.com/bagerard>`_
 - Ashutosh Chaudhary `@codeasashu <https://github.com/codeasashu>`_
 - Fedor Fominykh `@fedorfo <https://github.com/fedorfo>`_
+- Colin Bounouar `@Colin-b <https://github.com/colin-b>`_
diff --git a/src/apispec/core.py b/src/apispec/core.py
index 77b876c..e878321 100644
--- a/src/apispec/core.py
+++ b/src/apispec/core.py
@@ -190,19 +190,19 @@ class APISpec:
         self.version = version
         self.openapi_version = OpenAPIVersion(openapi_version)
         self.options = options
+        self.plugins = plugins
 
         # Metadata
         self._tags = []
         self._paths = OrderedDict()
 
+        # Components
+        self.components = Components(self.plugins, self.openapi_version)
+
         # Plugins
-        self.plugins = plugins
         for plugin in self.plugins:
             plugin.init_spec(self)
 
-        # Components
-        self.components = Components(self.plugins, self.openapi_version)
-
     def to_dict(self):
         ret = {
             "paths": self._paths,

Ability to access APISpec.components in plugin init_spec method
Is there a specific reason why components is initialized after plugins init_spec methods are called?

If not, then I am willing to open a PR to solve this issue.
diff --git a/tests/test_core.py b/tests/test_core.py
index 3978632..ce9348f 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -276,6 +276,21 @@ class TestComponents:
         spec.components.schema("Pet", properties=self.properties, enum=enum)
         assert spec.to_dict() == yaml.safe_load(spec.to_yaml())
 
+    def test_components_can_be_accessed_by_plugin_in_init_spec(self):
+        class TestPlugin(BasePlugin):
+            def init_spec(self, spec):
+                spec.components.schema(
+                    "TestSchema",
+                    {"properties": {"key": {"type": "string"}}, "type": "object"},
+                )
+
+        spec = APISpec(
+            "Test API", version="0.0.1", openapi_version="2.0", plugins=[TestPlugin()]
+        )
+        assert get_schemas(spec) == {
+            "TestSchema": {"properties": {"key": {"type": "string"}}, "type": "object"}
+        }
+
 
 class TestPath:
     paths = {

pip install -e .[dev]
parse_log_pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/marshmallow-code/apispec.git@20b5ed34366c720fc5a0f50e0b7546cd526cb178#egg=apispec
attrs==25.3.0
cachetools==5.5.2
certifi==2025.1.31
cfgv==3.4.0
chardet==5.2.0
charset-normalizer==3.4.1
colorama==0.4.6
distlib==0.3.9
entrypoints==0.3
exceptiongroup==1.2.2
filelock==3.18.0
flake8==3.7.9
flake8-bugbear==20.1.4
identify==2.6.9
idna==3.10
iniconfig==2.1.0
jsonschema==4.17.3
jsonschema-spec==0.1.6
lazy-object-proxy==1.10.0
marshmallow==3.26.1
mccabe==0.6.1
mock==5.2.0
nodeenv==1.9.1
openapi-schema-validator==0.4.4
openapi-spec-validator==0.5.7
packaging==24.2
pathable==0.4.4
platformdirs==4.3.7
pluggy==1.5.0
prance==23.6.21.0
pre-commit==2.21.0
pycodestyle==2.5.0
pyflakes==2.1.1
pyproject-api==1.9.0
pyrsistent==0.20.0
pytest==8.3.5
PyYAML==6.0.2
requests==2.32.3
rfc3339-validator==0.1.4
ruamel.yaml==0.18.10
ruamel.yaml.clib==0.2.12
six==1.17.0
tomli==2.2.1
tox==4.25.0
typing_extensions==4.13.0
urllib3==2.3.0
virtualenv==20.29.3

name: apispec
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==25.3.0
      - cachetools==5.5.2
      - certifi==2025.1.31
      - cfgv==3.4.0
      - chardet==5.2.0
      - charset-normalizer==3.4.1
      - colorama==0.4.6
      - distlib==0.3.9
      - entrypoints==0.3
      - exceptiongroup==1.2.2
      - filelock==3.18.0
      - flake8==3.7.9
      - flake8-bugbear==20.1.4
      - identify==2.6.9
      - idna==3.10
      - iniconfig==2.1.0
      - jsonschema==4.17.3
      - jsonschema-spec==0.1.6
      - lazy-object-proxy==1.10.0
      - marshmallow==3.26.1
      - mccabe==0.6.1
      - mock==5.2.0
      - nodeenv==1.9.1
      - openapi-schema-validator==0.4.4
      - openapi-spec-validator==0.5.7
      - packaging==24.2
      - pathable==0.4.4
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - prance==23.6.21.0
      - pre-commit==2.21.0
      - pycodestyle==2.5.0
      - pyflakes==2.1.1
      - pyproject-api==1.9.0
      - pyrsistent==0.20.0
      - pytest==8.3.5
      - pyyaml==6.0.2
      - requests==2.32.3
      - rfc3339-validator==0.1.4
      - ruamel-yaml==0.18.10
      - ruamel-yaml-clib==0.2.12
      - six==1.17.0
      - tomli==2.2.1
      - tox==4.25.0
      - typing-extensions==4.13.0
      - urllib3==2.3.0
      - virtualenv==20.29.3
prefix: /opt/conda/envs/apispec

tests/test_core.py::TestComponents::test_components_can_be_accessed_by_plugin_in_init_spec
tests/test_core.py::TestAPISpecInit::test_raises_wrong_apispec_version tests/test_core.py::TestMetadata::test_openapi_metadata[2.0] tests/test_core.py::TestMetadata::test_openapi_metadata[3.0.0] tests/test_core.py::TestMetadata::test_openapi_metadata_merge_v3[3.0.0] tests/test_core.py::TestTags::test_tag[2.0] tests/test_core.py::TestTags::test_tag[3.0.0] tests/test_core.py::TestTags::test_tag_is_chainable[2.0] tests/test_core.py::TestTags::test_tag_is_chainable[3.0.0] tests/test_core.py::TestComponents::test_schema[2.0] tests/test_core.py::TestComponents::test_schema[3.0.0] tests/test_core.py::TestComponents::test_schema_is_chainable[2.0] tests/test_core.py::TestComponents::test_schema_is_chainable[3.0.0] tests/test_core.py::TestComponents::test_schema_description[2.0] tests/test_core.py::TestComponents::test_schema_description[3.0.0] tests/test_core.py::TestComponents::test_schema_stores_enum[2.0] tests/test_core.py::TestComponents::test_schema_stores_enum[3.0.0] tests/test_core.py::TestComponents::test_schema_discriminator[2.0] tests/test_core.py::TestComponents::test_schema_discriminator[3.0.0] tests/test_core.py::TestComponents::test_schema_duplicate_name[2.0] tests/test_core.py::TestComponents::test_schema_duplicate_name[3.0.0] tests/test_core.py::TestComponents::test_response[2.0] tests/test_core.py::TestComponents::test_response[3.0.0] tests/test_core.py::TestComponents::test_response_is_chainable[2.0] tests/test_core.py::TestComponents::test_response_is_chainable[3.0.0] tests/test_core.py::TestComponents::test_response_duplicate_name[2.0] tests/test_core.py::TestComponents::test_response_duplicate_name[3.0.0] tests/test_core.py::TestComponents::test_parameter[2.0] tests/test_core.py::TestComponents::test_parameter[3.0.0] tests/test_core.py::TestComponents::test_parameter_is_chainable[2.0] tests/test_core.py::TestComponents::test_parameter_is_chainable[3.0.0] tests/test_core.py::TestComponents::test_parameter_duplicate_name[2.0] tests/test_core.py::TestComponents::test_parameter_duplicate_name[3.0.0] tests/test_core.py::TestComponents::test_example[3.0.0] tests/test_core.py::TestComponents::test_example_is_chainable[3.0.0] tests/test_core.py::TestComponents::test_example_duplicate_name[3.0.0] tests/test_core.py::TestComponents::test_security_scheme[2.0] tests/test_core.py::TestComponents::test_security_scheme[3.0.0] tests/test_core.py::TestComponents::test_security_scheme_is_chainable[2.0] tests/test_core.py::TestComponents::test_security_scheme_is_chainable[3.0.0] tests/test_core.py::TestComponents::test_security_scheme_duplicate_name[2.0] tests/test_core.py::TestComponents::test_security_scheme_duplicate_name[3.0.0] tests/test_core.py::TestComponents::test_to_yaml[2.0] tests/test_core.py::TestComponents::test_to_yaml[3.0.0] tests/test_core.py::TestPath::test_path[2.0] tests/test_core.py::TestPath::test_path[3.0.0] tests/test_core.py::TestPath::test_paths_maintain_order[2.0] tests/test_core.py::TestPath::test_paths_maintain_order[3.0.0] tests/test_core.py::TestPath::test_paths_is_chainable[2.0] tests/test_core.py::TestPath::test_paths_is_chainable[3.0.0] tests/test_core.py::TestPath::test_methods_maintain_order[2.0] tests/test_core.py::TestPath::test_methods_maintain_order[3.0.0] tests/test_core.py::TestPath::test_path_merges_paths[2.0] tests/test_core.py::TestPath::test_path_merges_paths[3.0.0] tests/test_core.py::TestPath::test_path_called_twice_with_same_operations_parameters[2.0] tests/test_core.py::TestPath::test_path_called_twice_with_same_operations_parameters[3.0.0] tests/test_core.py::TestPath::test_path_ensures_path_parameters_required[2.0] tests/test_core.py::TestPath::test_path_ensures_path_parameters_required[3.0.0] tests/test_core.py::TestPath::test_path_with_no_path_raises_error[2.0] tests/test_core.py::TestPath::test_path_with_no_path_raises_error[3.0.0] tests/test_core.py::TestPath::test_path_summary_description[2.0] tests/test_core.py::TestPath::test_path_summary_description[3.0.0] tests/test_core.py::TestPath::test_parameter[2.0] tests/test_core.py::TestPath::test_parameter[3.0.0] tests/test_core.py::TestPath::test_invalid_parameter[2.0-parameters0] tests/test_core.py::TestPath::test_invalid_parameter[2.0-parameters1] tests/test_core.py::TestPath::test_invalid_parameter[3.0.0-parameters0] tests/test_core.py::TestPath::test_invalid_parameter[3.0.0-parameters1] tests/test_core.py::TestPath::test_parameter_duplicate[2.0] tests/test_core.py::TestPath::test_parameter_duplicate[3.0.0] tests/test_core.py::TestPath::test_global_parameters[2.0] tests/test_core.py::TestPath::test_global_parameters[3.0.0] tests/test_core.py::TestPath::test_global_parameter_duplicate[2.0] tests/test_core.py::TestPath::test_global_parameter_duplicate[3.0.0] tests/test_core.py::TestPath::test_response[2.0] tests/test_core.py::TestPath::test_response[3.0.0] tests/test_core.py::TestPath::test_response_with_HTTPStatus_code[2.0] tests/test_core.py::TestPath::test_response_with_HTTPStatus_code[3.0.0] tests/test_core.py::TestPath::test_response_with_status_code_range[2.0] tests/test_core.py::TestPath::test_response_with_status_code_range[3.0.0] tests/test_core.py::TestPath::test_path_check_invalid_http_method[2.0] tests/test_core.py::TestPath::test_path_check_invalid_http_method[3.0.0] tests/test_core.py::TestPlugins::test_plugin_factory tests/test_core.py::TestPlugins::test_plugin_schema_helper_is_used[True-2.0] tests/test_core.py::TestPlugins::test_plugin_schema_helper_is_used[True-3.0.0] tests/test_core.py::TestPlugins::test_plugin_schema_helper_is_used[False-2.0] tests/test_core.py::TestPlugins::test_plugin_schema_helper_is_used[False-3.0.0] tests/test_core.py::TestPlugins::test_plugin_parameter_helper_is_used[True-2.0] tests/test_core.py::TestPlugins::test_plugin_parameter_helper_is_used[True-3.0.0] tests/test_core.py::TestPlugins::test_plugin_parameter_helper_is_used[False-2.0] tests/test_core.py::TestPlugins::test_plugin_parameter_helper_is_used[False-3.0.0] tests/test_core.py::TestPlugins::test_plugin_response_helper_is_used[True-2.0] tests/test_core.py::TestPlugins::test_plugin_response_helper_is_used[True-3.0.0] tests/test_core.py::TestPlugins::test_plugin_response_helper_is_used[False-2.0] tests/test_core.py::TestPlugins::test_plugin_response_helper_is_used[False-3.0.0] tests/test_core.py::TestPlugins::test_plugin_path_helper_is_used[True-2.0] tests/test_core.py::TestPlugins::test_plugin_path_helper_is_used[True-3.0.0] tests/test_core.py::TestPlugins::test_plugin_path_helper_is_used[False-2.0] tests/test_core.py::TestPlugins::test_plugin_path_helper_is_used[False-3.0.0] tests/test_core.py::TestPlugins::test_plugin_operation_helper_is_used[2.0] tests/test_core.py::TestPlugins::test_plugin_operation_helper_is_used[3.0.0] tests/test_core.py::TestPluginsOrder::test_plugins_order
AUTHORS.rst src/apispec/core.py
AUTHORS.rst src/apispec/core.py