Wiring in Spring
Tags: spring, springboot, java
Published: 2023-06-14 14:48:30

## Context
Bean is most fundamental unit in spring framework which we have seen in previous posts. Bean creation may include creating the normal object which dose not have any dependency on other objects they solely can be created from the primitive data types.

But most of the objects we create they depends on other objects either developer created or library objects. 

Now with bean we give control to spring framework how to create and manage the java objects in application. When there is dependency between the Objects, spring framework should understand and construct the dependent objects (beans) as well.

## Wiring 

So to enable the framework to create dependent beans objects and inject them on runtime whenever required this concept is called as **"wiring"**. 
Here spring framework process the connection between the objects & make sure required objects are created and injected.

## Ways to wire a bean

Spring provides multiple ways to wire a bean, by dependency injection, annotation based wiring, xml-based wiring, java-based configuration wiring, component scanning.

> Springboot provides the `@Autowired` annotation to automatically wire the dependent objects.

> Similarly java has `@Inject` annotation which more general dose can be used without spring, to wire the dependent objects.

> The `@Inject` annotation is part of the Java Dependency Injection (JSR-330) standard, which is supported by frameworks like Spring

## Ways to use @Autowired annotation

Annotation `@Autowired` used with multiple ways via field injection, constructor injection, setter injection, optional dependency & with `@Qualifier` annotation.

### Field injection

To inject the dependent object in bean, we can put `@Autowired` annotation on the class fields, which then framework detects and injects the appropriate dependency.

```java

@Autowired 
private ExampleBean someBean;

```

### Constructor injection

While creating the bean, we can provide the constructor param as `@Autowired` to inject the required object. Spring will automatically pass the require Object as param in constructor.

```java

@Autowired
public ExampleBean(DependentBean dependentBean){
   this.dependentBean = dependentBean;
}

```

### Setter injection

Another way to inject the dependency is to use the setter method annotated with `@Autowired`, So spring can use it to inject the required dependency.

```java

@Autowired 
public void setDependentBean(DependeentBean bean){
   this.dependentBean = bean;
}

```

### Optional Dependency injection

Sometimes the dependency on object is optional, as with some objects can be created without depending on all the objects. This can be achieved using the `Optional` and `required=false` in the `@Autowired`. 
> By default the `@Autowired` is not optional & always injects the dependency.

```java

@Autowired(required = false)
private Optional<DependentBean> bean;

```

## Use of Qualifiers with Autowiring

Sometime we have multiple beans in our context, now if we only specify the `@Autowired` on the field, constructor, setter Spring frameworks get confused on which exact dependency to inject as there are multiple objects of same type are available in context.

To remove ambiguity and provide exact dependent object to inject we use `@Qualifier` with `value` to specify the which exact bean to use for this dependency injection.

```java

@Autowired 
@Qualifier(value = "someSpecificBean")
private DependentBean bean;

```

> `@Inject` can also be used similar to `@Autowired` annotation, with slight difference.

-----

<meta name="keywords" content="Autowiring, Dependency Injection, Spring Framework, Bean Wiring, Inversion of Control, Component Scanning, Constructor Injection, Setter Injection, Autowired Annotation, Bean Configuration, Spring Bean Lifecycle, Qualifiers and Primary Beans, Autowire by Type, Autowire by Name, Autowire by Qualifier, Autowire by Annotation, Autowire vs. Explicit Wiring, Benefits of Autowiring, Common Autowiring Pitfalls">