Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Standard Bean Injection vs. Autowiring

As far as I understand When Using Dependency Injection all bean are initializing on Start.

<bean id="userPreferences" class="com.foo.UserPreferences">
  </bean>
  <!-- a singleton-scoped bean injected to the above bean -->
  <bean id="userService" class="com.foo.SimpleUserService">

      <!-- a reference to the userPreferences bean -->
      <property name="userPreferences" ref="userPreferences"/>
  </bean>

and the configuration above means that userService and userPreferences created when application starts. Is it correct?

When using Autowiring and using <context:component-scan>

public class SimpleUserService{

@Autowired
UserPreferences userPreferences;

//omitted
} 

1) Is userPreference created on Application init?

2) What is the default scope for bean injected by autowire and how can we change it?

3) How affects bean creation and bean injection?

Hope I made myself clear.

like image 809
danny.lesnik Avatar asked May 04 '11 22:05

danny.lesnik


People also ask

What is the difference between @autowired and @inject?

@Inject and @Autowired both annotations are used for autowiring in your application. @Inject annotation is part of Java CDI which was introduced in Java 6, whereas @Autowire annotation is part of spring framework. Both annotations fulfill same purpose therefore, anything of these we can use in our application.

What is the difference between @autowired and bean?

@Bean is just for the metadata definition to create the bean(equivalent to tag). @Autowired is to inject the dependancy into a bean(equivalent to ref XML tag/attribute).

What is difference between @autowired and @resource in Spring?

@Autowired in combination with @Qualifier also autowires by name. The main difference is is that @Autowired is a spring annotation whereas @Resource is specified by the JSR-250. So the latter is part of normal java where as @Autowired is only available by spring.

Why Autowired field injection is not recommended?

The reasons why field injection is frowned upon are as follows: You cannot create immutable objects, as you can with constructor injection. Your classes have tight coupling with your DI container and cannot be used outside of it. Your classes cannot be instantiated (for example in unit tests) without reflection.


2 Answers

First of all you should add @Service or @Component to the SimpleUserService class.

  • 1 Yes, the ONE instance of UserPreferences is created at application intialization
  • 2 Default scope is singleton, You can change it with the @Scope annotation (@See Spring Reference: 3.11.4.4 Specifying bean scope)
  • 3 Component scan and XML configuration work in the same way (life cycle)

Maybe you should spend some time in understanding the Spring life cycle. You need to understand that Spring works a bit in this way (not 100% correct):

  • first it creates a pool of beans
  • then it injects the properties into the beans

But it does NOT work this way: taking a class, look what references it needs creating this references (recursive) and then creating the class.

If you understand this, then you will also understand, that the @Scope of a bean is defined at the bean declaration/class, but not at the references.

like image 192
Ralph Avatar answered Oct 08 '22 00:10

Ralph


1) Is userPreference created on Application init?

In either case userPreferences is initialized when Spring Context is loaded. You can change this behavior by adding lazy-init="true" to the bean configuration.

2) What is the default scope for bean injected by autowire and how can we change it?

The scope of what is injected is all beans loaded into Spring. If you import an XML configuration from another project, it too would be included. I'm not sure if you can limit your scope.

3) How affects bean creation and bean injection?

Whether is autowired, or configured via XML, the behavior should be the same. I prefer explicitly defining dependencies over automatic annotations. Then again I also like strongly typed languages.

like image 31
JustinKSU Avatar answered Oct 08 '22 00:10

JustinKSU