Title: Issues in Dependency Injection article · Issue #172 · java/devjava-content · GitHub
Open Graph Title: Issues in Dependency Injection article · Issue #172 · java/devjava-content
X Title: Issues in Dependency Injection article · Issue #172 · java/devjava-content
Description: The article on Dependency Injection will turn one year tomorrow. That being said, there are a few issues I see with that article: The last codeblock at the end of the article declares an BeanFactory beanFactory = BeanFactory.INSTANCE; wh...
Open Graph Description: The article on Dependency Injection will turn one year tomorrow. That being said, there are a few issues I see with that article: The last codeblock at the end of the article declares an BeanFactor...
X Description: The article on Dependency Injection will turn one year tomorrow. That being said, there are a few issues I see with that article: The last codeblock at the end of the article declares an BeanFactor...
Opengraph URL: https://github.com/java/devjava-content/issues/172
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Issues in Dependency Injection article","articleBody":"The [article on Dependency Injection](https://dev.java/learn/reflection/dependency-injection/) will turn one year tomorrow.\n\nThat being said, there are a few issues I see with that article:\n- The last codeblock at the end of the article declares an `BeanFactory beanFactory = BeanFactory.INSTANCE;` which is not used since it uses `BeanFactory.INSTANCE.getInstanceOf(...)` as opposed to `beanFactory.getInstanceOf(...)`.\n- In the \"Creating Singletons\" section, the text mentions \"Here is the class.\" but there are 6 paragraphs (not counting the \"Here is the class.\" paragraph) until the class actually starts.\n- (more of a suggestion) While the \"Creating Singletons\" section mentions that this approach could create the multiple objects of a singleton (can it really be called a singleton if the DI framework allows creating multiple instances of it even if only one is actually used), this problem could be avoided by using [`computeIfAbsent`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/ConcurrentMap.html#computeIfAbsent(K,java.util.function.Function)) which ensures that the lambda is not executed concurrently.\n- The same section also contains \"For that, you can use a registry, implemented by a ConcurrentMap, that is a thread-safe _extension_ of the Map interface.\" - I think it should use _implementation_ instead of _extension_.\n- The code in the article introduces a potentially confusing side effect which is not mentioned at all: It is possible to create singleton instances with constructor parameters by calling the `getInstanceOf()` method with these parameters and these instances can then be used by later `@Inject`s. However, `@Inject` cannot use constructor parameters leading to the following issues:\n - Assuming the singleton class has a constructor with arguments but no no-args constructor: If `getInstanceOf()` is called with the parameters before creating the objects, it can be used by `@Inject` but if the `@Inject` is executed first, it throws a `NoSuchMethodException` because the constructor is not found. This is dependent on the order of calls (and it's supposed to be thread-safe!).\n - If the singleton class has both a no-args constructor and a parameterized constructor that's called via `getInstanceOf(parameters, here)` which is also used by `@Inject`, the called constructor depends on the number of arguments. This can lead to issues that are hard to debug (wrong constructor sometimes called), especially in multithreaded environments.","author":{"url":"https://github.com/danthe1st","@type":"Person","name":"danthe1st"},"datePublished":"2025-07-24T15:08:09.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/172/devjava-content/issues/172"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:5a26891d-4150-a6c5-4275-9e8bd705b7d9 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | D030:392C64:16720:1DD84:6977BA4D |
| html-safe-nonce | 9b5347e11fc49da42caed337c83c86835ace6a4450533e0cdfc31128cf7f6950 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEMDMwOjM5MkM2NDoxNjcyMDoxREQ4NDo2OTc3QkE0RCIsInZpc2l0b3JfaWQiOiI2MjQ4ODM0MDU2Mjg4OTc1NDM3IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 761132c8eb8771fde5688ef704dc604c71317725389857cba8595ab9eb28f6b3 |
| hovercard-subject-tag | issue:3260251237 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/java/devjava-content/172/issue_layout |
| twitter:image | https://opengraph.githubassets.com/f58c400bcd3b4835cc36e3e999fa4b73dad6e19a96a99876f3d5448abcd7793f/java/devjava-content/issues/172 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/f58c400bcd3b4835cc36e3e999fa4b73dad6e19a96a99876f3d5448abcd7793f/java/devjava-content/issues/172 |
| og:image:alt | The article on Dependency Injection will turn one year tomorrow. That being said, there are a few issues I see with that article: The last codeblock at the end of the article declares an BeanFactor... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | danthe1st |
| hostname | github.com |
| expected-hostname | github.com |
| None | 831218810e1b66a41a0626c8c15f7f47625846d9a7516c7f43cfc2c61effad83 |
| turbo-cache-control | no-preview |
| go-import | github.com/java/devjava-content git https://github.com/java/devjava-content.git |
| octolytics-dimension-user_id | 126123820 |
| octolytics-dimension-user_login | java |
| octolytics-dimension-repository_id | 614090520 |
| octolytics-dimension-repository_nwo | java/devjava-content |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 614090520 |
| octolytics-dimension-repository_network_root_nwo | java/devjava-content |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | b37ffa89d073c0d4a6f07ff42d59120741a74955 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width