www.baeldung.com
Open in
urlscan Pro
2606:4700:3108::ac42:28f8
Public Scan
URL:
https://www.baeldung.com/spring-autowire
Submission: On September 15 via api from US — Scanned from DE
Submission: On September 15 via api from US — Scanned from DE
Form analysis
1 forms found in the DOMPOST https://www.getdrip.com/forms/15866254/submissions
<form method="post" action="https://www.getdrip.com/forms/15866254/submissions"><input type="hidden" value="https://www.getdrip.com/forms/15866254/submissions">
<div>
<div style="padding-top: 20px;">
<input class="input-email" name="fields[email]" id="drip-email" type="email" placeholder="Your Email" value="" label="Email Address">
</div>
<div><input name="website" id="website" type="text" placeholder="website" value="" label="Website" style="display:none"></div>
<div style="padding-top: 20px;"><button type="submit">FOLLOW THE SPRING</button></div>
</div>
</form>
Text Content
WE VALUE YOUR PRIVACY We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products. With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners’ processing as described above. Alternatively you may access more detailed information and change your preferences before consenting or to refuse consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to this website only. You can change your preferences at any time by returning to this site or visit our privacy policy. MORE OPTIONSAGREE * * * Start Here * Courses ▼▲ * REST WITH SPRING The canonical reference for building a production grade API with Spring * LEARN SPRING SECURITY ▼▲ THE unique Spring Security education if you’re working with Java today * LEARN SPRING SECURITY CORE Focus on the Core of Spring Security 5 * LEARN SPRING SECURITY OAUTH Focus on the new OAuth2 stack in Spring Security 5 * LEARN SPRING From no experience to actually building stuff * LEARN SPRING DATA JPA The full guide to persistence with Spring Data JPA * Guides ▼▲ * PERSISTENCE The Persistence with Spring guides * REST The guides on building REST APIs with Spring * SECURITY The Spring Security guides * About ▼▲ * FULL ARCHIVE The high level overview of all the articles on the site. * BAELDUNG EBOOKS Discover all of our eBooks * ABOUT BAELDUNG About Baeldung. * * GUIDE TO SPRING @AUTOWIRED Last updated: September 14, 2023 Written by: baeldung * Spring+ * Spring Core Basics * Spring DI Course – LS (cat=Spring) GET STARTED WITH SPRING 5 AND SPRING BOOT 2, THROUGH THE REFERENCE LEARN SPRING COURSE: >> LEARN SPRING 1. OVERVIEW Starting with Spring 2.5, the framework introduced annotations-driven Dependency Injection. The main annotation of this feature is @Autowired. It allows Spring to resolve and inject collaborating beans into our bean. FURTHER READING: SPRING COMPONENT SCANNING Learn about the mechanism behind Spring component scanning, and how you can tweak it to your own needs Read more → INTRO TO INVERSION OF CONTROL AND DEPENDENCY INJECTION WITH SPRING A quick introduction to the concepts of Inversion of Control and Dependency Injection, followed by a simple demonstration using the Spring Framework Read more → In this tutorial, we’ll first take a look at how to enable autowiring and the various ways to autowire beans. Afterward, we’ll talk about resolving bean conflicts using @Qualifier annotation, as well as potential exception scenarios. 2. ENABLING @AUTOWIRED ANNOTATIONS The Spring framework enables automatic dependency injection. In other words, by declaring all the bean dependencies in a Spring configuration file, Spring container can autowire relationships between collaborating beans. This is called Spring bean autowiring. To use Java-based configuration in our application, let’s enable annotation-driven injection to load our Spring configuration: @Configuration @ComponentScan("com.baeldung.autowire.sample") public class AppConfig {}Copy Alternatively, the <context:annotation-config> annotation is mainly used to activate the dependency injection annotations in Spring XML files. Moreover, Spring Boot introduces the @SpringBootApplication annotation. This single annotation is equivalent to using @Configuration, @EnableAutoConfiguration, and @ComponentScan. Let’s use this annotation in the main class of the application: @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }Copy As a result, when we run this Spring Boot application, it will automatically scan the components in the current package and its sub-packages. Thus it will register them in Spring’s Application Context, and allow us to inject beans using @Autowired. 3. USING @AUTOWIRED After enabling annotation injection, we can use autowiring on properties, setters, and constructors. 3.1. @AUTOWIRED ON PROPERTIES Let’s see how we can annotate a property using @Autowired. This eliminates the need for getters and setters. First, let’s define a fooFormatter bean: @Component("fooFormatter") public class FooFormatter { public String format() { return "foo"; } }Copy Then, we’ll inject this bean into the FooService bean using @Autowired on the field definition: @Component public class FooService { @Autowired private FooFormatter fooFormatter; }Copy As a result, Spring injects fooFormatter when FooService is created. 3.2. @AUTOWIRED ON SETTERS Now let’s try adding @Autowired annotation on a setter method. In the following example, the setter method is called with the instance of FooFormatter when FooService is created: public class FooService { private FooFormatter fooFormatter; @Autowired public void setFormatter(FooFormatter fooFormatter) { this.fooFormatter = fooFormatter; } } Copy 3.3. @AUTOWIRED ON CONSTRUCTORS Finally, let’s use @Autowired on a constructor. We’ll see that an instance of FooFormatter is injected by Spring as an argument to the FooService constructor: public class FooService { private FooFormatter fooFormatter; @Autowired public FooService(FooFormatter fooFormatter) { this.fooFormatter = fooFormatter; } }Copy 4. @AUTOWIRED AND OPTIONAL DEPENDENCIES When a bean is being constructed, the @Autowired dependencies should be available. Otherwise, if Spring cannot resolve a bean for wiring, it will throw an exception. Consequently, it prevents the Spring container from launching successfully with an exception of the form: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.autowire.sample.FooDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}Copy To fix this, we need to declare a bean of the required type: public class FooService { @Autowired(required = false) private FooDAO dataAccessor; }Copy 5. AUTOWIRE DISAMBIGUATION By default, Spring resolves @Autowired entries by type. If more than one bean of the same type is available in the container, the framework will throw a fatal exception. To resolve this conflict, we need to tell Spring explicitly which bean we want to inject. 5.1. AUTOWIRING BY @QUALIFIER For instance, let’s see how we can use the @Qualifier annotation to indicate the required bean. First, we’ll define 2 beans of type Formatter: @Component("fooFormatter") public class FooFormatter implements Formatter { public String format() { return "foo"; } }Copy @Component("barFormatter") public class BarFormatter implements Formatter { public String format() { return "bar"; } }Copy Now let’s try to inject a Formatter bean into the FooService class: public class FooService { @Autowired private Formatter formatter; }Copy In our example, there are two concrete implementations of Formatter available for the Spring container. As a result, Spring will throw a NoUniqueBeanDefinitionException exception when constructing the FooService: Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.autowire.sample.Formatter] is defined: expected single matching bean but found 2: barFormatter,fooFormatter Copy We can avoid this by narrowing the implementation using a @Qualifier annotation: public class FooService { @Autowired @Qualifier("fooFormatter") private Formatter formatter; }Copy When there are multiple beans of the same type, it’s a good idea to use @Qualifier to avoid ambiguity. Please note that the value of the @Qualifier annotation matches with the name declared in the @Component annotation of our FooFormatter implementation. 5.2. AUTOWIRING BY CUSTOM QUALIFIER Spring also allows us to create our own custom @Qualifier annotation. To do so, we should provide the @Qualifier annotation with the definition: @Qualifier @Target({ ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface FormatterType { String value(); }Copy Then we can use the FormatterType within various implementations to specify a custom value: @FormatterType("Foo") @Component public class FooFormatter implements Formatter { public String format() { return "foo"; } }Copy @FormatterType("Bar") @Component public class BarFormatter implements Formatter { public String format() { return "bar"; } }Copy Finally, our custom Qualifier annotation is ready to use for autowiring: @Component public class FooService { @Autowired @FormatterType("Foo") private Formatter formatter; } Copy The value specified in the @Target meta-annotation restricts where to apply the qualifier, which in our example is fields, methods, types, and parameters. 5.3. AUTOWIRING BY NAME Spring uses the bean’s name as a default qualifier value. It will inspect the container and look for a bean with the exact name as the property to autowire it. Hence, in our example, Spring matches the fooFormatter property name to the FooFormatter implementation. Therefore, it injects that specific implementation when constructing FooService: public class FooService { @Autowired private Formatter fooFormatter; }Copy 6. CONCLUSION In this article, we discussed autowiring and the different ways to use it. We also examined ways to solve two common autowiring exceptions caused by either a missing bean or an ambiguous bean injection. The source code of this article is available on the GitHub project. Course – LS (cat=Spring) GET STARTED WITH SPRING 5 AND SPRING BOOT 2, THROUGH THE LEARN SPRING COURSE: >> THE COURSE res – REST with Spring (eBook) (everywhere) Learning to build your API with Spring? Download the E-book Comments are closed on this article! res – REST with Spring (eBook) (everywhere) Building a REST API with Spring 5? Download the E-book COURSES * All Courses * All Bulk Courses * All Bulk Team Courses * The Courses Platform SERIES * Java “Back to Basics” Tutorial * Jackson JSON Tutorial * Apache HttpClient Tutorial * REST with Spring Tutorial * Spring Persistence Tutorial * Security with Spring * Spring Reactive Tutorials ABOUT * About Baeldung * The Full Archive * Editors * Jobs * Our Partners * Partner with Baeldung * Terms of Service * Privacy Policy * Company Info * Contact Follow the Spring Category Follow the Spring category to get regular info about the new articles and tutorials we publish here. FOLLOW THE SPRING