Autowiring Modes

You have learnt how to declare beans using the <bean> element and inject <bean> with

using <constructor-arg> and <property> elements in XML configuration file. The Spring container can autowire relationships between collaborating beans without using <constructor-arg> and <property> elements which helps cut down on the amount of XML configuration you write for a big Spring based application.

There are following autowiring modes which can be used to instruct Spring container to use autowiring for dependency injection. You use the autowire attribute of the <bean/> element to specify autowire mode for a bean definition.

Mode

Description

 

This is default setting which means no autowiring and you should use explicit bean reference for wiring. You have nothing to do special for this wiring. This is what you already have seen in Dependency Injection chapter.

no

 
 

Autowiring by property name. Spring container looks at the properties of the beans on which autowire attribute is set to byName in the XML configuration file. It then tries to match and wire its properties with the beans defined by the same names in the configuration file.

byName

 
 

Autowiring by property datatype. Spring container looks at the properties of the beans on which autowire attribute is set to byType in the XML configuration file. It then tries to match and wire a property if
its typematches with exactly one of the beans name in configuration file.
If more than one such beans exists, a fatal exception is thrown.

byType

 
 

Similar to byType, but type applies to constructor arguments. If there is

constructor

not exactly one bean of the constructor argument type in the container, a
fatal error is raised.

 
 

Spring first tries to wire using autowire by constructor, if it does not work,
Spring tries to autowire by byType.

autodetect

 

You can use byType or constructor autowiring mode to wire arrays and other typed-collections.

Limitations with autowiring

Autowiring works best when it is used consistently across a project. If autowiring is not used in
general, it might be confusing to developers to use it to wire only one or two bean definitions.
Though, autowiring can significantly reduce the need to specify properties or constructor
arguments but you should consider the limitations and disadvantages of autowiring before using
them.

Limitations

Description

 

You can still specify dependencies using <constructor-arg> and
<property> settings which will always override autowiring.

Overriding possibility

 
 

You cannot autowire so-called simple properties such as primitives,

Primitive data types

Strings, and Classes.

 
 

Autowiring is less exact than explicit wiring, so if possible prefer using
explict wiring.

Confusing nature

 
 

Spring Autowiring 'byName'

This mode specifies autowiring by property name. Spring container looks at the beans on
which auto-wire attribute is set to byName in the XML configuration file. It then tries to match and
wire its properties with the beans defined by the same names in the configuration file. If matches
are found, it will inject those beans otherwise, it will throw exceptions.

For example, if a bean definition is set to autowire byName in configuration file, and it contains
aspellChecker property (that is, it has a setSpellChecker(...) method), Spring looks for a bean
definition named spellChecker, and uses it to set the property. Still you can wire remaining
properties using <property> tags. Following example will illustrate the concept.

Let us have working Eclipse IDE in place and follow the following steps to create a Spring
application:

Step

Description

 

Create a project with a name SpringExample and create a
package com.tutorialspoint under the src folder in the created project.

1

 
 

Add required Spring libraries using Add External JARs option as explained in the Spring
Hello World Example chapter.

2

 
 

Create Java classes TextEditor, SpellChecker and MainApp under
the com.tutorialspointpackage.

3

 

4

Create Beans configuration file Beans.xml under the src folder.

 

The final step is to create the content of all the Java files and Bean Configuration file and
run the application as explained below.

5

 

Here is the content of TextEditor.java file:

package com.tutorialspoint;
public class TextEditor {
private SpellChecker spellChecker;
private String name;
   public void setSpellChecker( SpellChecker spellChecker ){
this.spellChecker = spellChecker;
   }
public SpellChecker getSpellChecker() {
      return spellChecker;
}
   public void setName(String name) {
this.name = name;
   }
public String getName() {
      return name;
}
   public void spellCheck() {
spellChecker.checkSpelling();

} }

Following is the content of another dependent class file SpellChecker.java: package com.tutorialspoint;

public class SpellChecker {
public SpellChecker() {
      System.out.println("Inside SpellChecker constructor." );
}
   public void checkSpelling() {
System.out.println("Inside checkSpelling." );

} }

Following is the content of the MainApp.java file: package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
      ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
      TextEditor te = (TextEditor) context.getBean("textEditor");
te.spellCheck();

} }

Following is the configuration file Beans.xml in normal condition: <?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.tutorialspoint.TextEditor">
<property name="spellChecker" ref="spellChecker" />
<property name="name" value="Generic Text Editor" />

</bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
</bean>

</beans>

But if you are going to use autowiring 'byName', then your XML configuration file will become as follows:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.tutorialspoint.TextEditor"
autowire="byName">
<property name="name" value="Generic Text Editor" />

</bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
</bean>

</beans>

Once you are done with creating source and bean configuration files, let us run the application. If everything is fine with your application, this will print the following message:

Inside SpellChecker constructor.
Inside checkSpelling.

Spring Autowiring 'byType'

This mode specifies autowiring by property type. Spring container looks at the beans on which autowireattribute is set to byType in the XML configuration file. It then tries to match and wire a property if its typematches with exactly one of the beans name in configuration file. If matches are found, it will inject those beans otherwise, it will throw exceptions.

For example, if a bean definition is set to autowire byType in configuration file, and it contains aspellChecker property of SpellChecker type, Spring looks for a bean definition named SpellChecker, and uses it to set the property. Still you can wire remaining properties using <property> tags. Following example will illustrate the concept where you will find no difference with above example except XML configuration file has been changed.

Here is the content of TextEditor.java file:

package com.tutorialspoint;
public class TextEditor {
private SpellChecker spellChecker;
private String name;
   public void setSpellChecker( SpellChecker spellChecker ) {
this.spellChecker = spellChecker;
   }
public SpellChecker getSpellChecker() {
      return spellChecker;
}
   public void setName(String name) {
this.name = name;
   }
public String getName() {
      return name;
}
   public void spellCheck() {
spellChecker.checkSpelling();

} }

Following is the content of another dependent class file SpellChecker.java: package com.tutorialspoint;

public class SpellChecker {
public SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
}
   public void checkSpelling() {
System.out.println("Inside checkSpelling." );

}

}

Following is the content of the MainApp.java file: package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
      ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
      TextEditor te = (TextEditor) context.getBean("textEditor");
te.spellCheck();

} }

Following is the configuration file Beans.xml in normal condition: <?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.tutorialspoint.TextEditor">
<property name="spellChecker" ref="spellChecker" />
<property name="name" value="Generic Text Editor" />

</bean>

   <!-- Definition for spellChecker bean -->
   <bean id="spellChecker" class="com.tutorialspoint.SpellChecker">
</bean>

</beans>

But if you are going to use autowiring 'byType', then your XML configuration file will become as follows:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
   <!-- Definition for textEditor bean -->
   <bean id="textEditor" class="com.tutorialspoint.TextEditor"
autowire="byType">
<property name="name" value="Generic Text Editor" />

</bean>

   <!-- Definition for spellChecker bean -->
   <bean id="SpellChecker" class="com.tutorialspoint.SpellChecker">
</bean>

</beans>

Once you are done with creating source and bean configuration files, let us run the application. If everything is fine with your application, this will print the following message:

Inside SpellChecker constructor.
Inside checkSpelling.

Spring Autowiring by Constructor

This mode is very similar to byType, but it applies to constructor arguments. Spring container looks at the beans on which autowire attribute is set to constructor in the XML configuration file. It then tries to match and wire its constructor's argument with exactly one of the beans name in configuration file. If matches are found, it will inject those beans otherwise, it will throw exceptions.

For example, if a bean definition is set to autowire by constructor in configuration file, and it has a constructor with one of the arguments of SpellChecker type, Spring looks for a bean definition namedSpellChecker, and uses it to set the constructor's argument. Still you can wire remaining arguments using <constructor-arg> tags. Following example will illustrate the concept.

Let us have working Eclipse IDE in place and follow the following steps to create a Spring application:

 

Step

Description

 

Create a project with a name SpringExample and create a
package com.tutorialspoint under the src folder in the created project.

1

 
 

Add required Spring libraries using Add External JARs option as explained in the Spring
Hello World Example chapter.

2

 
 

Create Java classes TextEditor, SpellChecker and MainApp under
the com.tutorialspointpackage.

3

 

4

Create Beans configuration file Beans.xml under the src folder.

 

The final step is to create the content of all the Java files and Bean Configuration file and
run the application as explained below.

5

 

Here is the content of TextEditor.java file:

package com.tutorialspoint;
public class TextEditor {
private SpellChecker spellChecker;
private String name;
   public TextEditor( SpellChecker spellChecker, String name ) {
this.spellChecker = spellChecker;
this.name = name;
   }
public SpellChecker getSpellChecker() {
      return spellChecker;
   }
public String getName() {
      return name;
}
   public void spellCheck() {
spellChecker.checkSpelling();

} }

Following is the content of another dependent class file SpellChecker.java: package com.tutorialspoint;

public class SpellChecker {
public SpellChecker(){
      System.out.println("Inside SpellChecker constructor." );
}
   public void checkSpelling()
{
      System.out.println("Inside checkSpelling." );
}

}

Following is the content of the MainApp.java file: package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
      ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
      TextEditor te = (TextEditor) context.getBean("textEditor");
te.spellCheck();

} }

Following is the configuration file Beans.xml in normal condition: <?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-

3.0.xsd">
<!-- Definition for textEditor bean -->

TUTORIALS POINT

Simply Easy Learning Page 64

<bean id="textEditor" class="com.tutorialspoint.TextEditor">
<constructor-arg ref="spellChecker" />
<constructor-arg value="Generic Text Editor"/>

</bean>

   <!-- Definition for spellChecker bean -->

<bean id="spellChecker" class="com.tutorialspoint.SpellChecker">

   </bean>
</beans>

But if you are going to use autowiring 'by constructor', then your XML configuration file will become as follows:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-

3.0.xsd">

   <!-- Definition for textEditor bean -->

<bean id="textEditor" class="com.tutorialspoint.TextEditor" autowire="constructor">
<constructor-arg value="Generic Text Editor"/>

</bean>

   <!-- Definition for spellChecker bean -->

<bean id="SpellChecker" class="com.tutorialspoint.SpellChecker">

   </bean>
</beans>

Once you are done with creating source and bean configuration files, let us run the application. If everything is fine with your application, this will print the following message:

Inside SpellChecker constructor.
Inside checkSpelling.

[转载]Spring Beans Auto-Wiring的更多相关文章

  1. spring beans源码解读

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...

  2. spring beans源码解读之--总结篇

    spring beans下面有如下源文件包: org.springframework.beans, 包含了操作java bean的接口和类.org.springframework.beans.anno ...

  3. 如何在servlet取得spring beans (autowired)(转)

    在应用中一般普通的JavaPojo都是由Spring来管理的,所以使用autowire注解来进行注入不会产生问题,但是有两个东西是例外的,一个是 Filter,一个是Servlet,这两样东西都是由S ...

  4. spring beans源码解读之--Bean的注解(annotation)

    随着spring注解的引入,越来越多的开发者开始使用注解,这篇文章将对注解的机制进行串联式的讲解,不求深入透彻,但求串起spring beans注解的珍珠,展示给大家. 1. spring beans ...

  5. spring beans的写入工具——spring-beans-writer

    spring-beans-writer是我曾经为动态生成spring beans配置文件做的一个写入工具,托管地址: https://github.com/bluejoe2008/spring-bea ...

  6. spring beans 源码解读

    从把spring下下来,导入到eclipse,花了几个小时的时间. 本来壮志雄心的说要,满满深入学习研读spring源码,现在看来还是不太现实,太难懂了,各种依赖,说明都是英文,整个串起来理解,深入研 ...

  7. Spring Boot学习一之Spring Beans和依赖注入

    你可以自由地使用任何标准的Spring框架技术去定义beans和它们注入的依赖.简单起见,我们经常使用 @ComponentScan 注解搜索beans,并结合 @Autowired 构造器注入. 如 ...

  8. Spring Boot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解

    一.关于Spring beans 和 依赖注入(Dependency Injection) spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的 ...

  9. 什么是Spring beans?

    Spring beans 是那些形成Spring应用的主干的java对象.它们被Spring IOC容器初始化,装配,和管理.这些beans通过容器中配置的元数据创建.比如,以XML文件中 的形式定义 ...

随机推荐

  1. hdu 2057 A+B Again

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2057 题目分析:涉及到16进制内的加法,可以用%I64x直接来处理,要注意到16进制中负数是用补码来表 ...

  2. bzoj 1042 HAOI2008 硬币购物

    这道题思路是在是神. 先dp出没有限制时候的方案数. dp的时候注意 先循环 1..4 再循环 1..maxs 防止重复.边界是f[0] = 1. 这么基础的背包都忘记了=_= 接下来处理有重复的问题 ...

  3. Bootstrap轮播获取当前活动的焦点对象

        在项目中使用了Bootstrap的轮播,需求是轮播下方有一个已读按钮,当点击已读按钮时,隐藏掉当前的焦点的轮播内容: 如图所示: 所以要获取当前的焦点是哪一条: 下方代码是在网络上找到的一个方 ...

  4. ▲教你如何轻易的做linux计划任务▲——小菜一碟

    一次性计划任务的安排: at :安排作业在某一时刻执行一次(一般都是用它) batch:安排作业在系统负载不重时执行一次 第一步: #service atd start  开启一次性计划任务   at ...

  5. 安装php-posix

      1.安装php-posix 1 yum -y install php-process 2.验证是否安装上了 1 php -m|grep posix 1 posix  

  6. APUE习题8.7

    看书的时候发现这个习题没有答案,于是就想把自己做的结果贴上来,和大家分享分享! 首先把题目贴上来吧: /*********** 8.10节中提及POSIX.1要求在调用exec时关闭打开的目录流.按下 ...

  7. ADO.NET笔记——利用Command对象的ExecuteScalar()方法返回一个数据值

    相关知识: 有些SQL操作,例如SUM,只会从数据库返回一个数据值,而不是多行数据 尽管也可以使用ExecuteReader()返回一个DataReader对象,代表该数据值,但是使用Command对 ...

  8. Js操作Select大全(取值、设置选中)

    Js操作Select是很常见的,也是比较实用的. jquery操作select(取值,设置选中) 每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<s ...

  9. ios 录音

    http://code4app.com/ios/%E5%BD%95%E9%9F%B3%E5%92%8C%E6%92%AD%E6%94%BE/51ba821b6803fa6901000000

  10. Android Error:You must supply a layout_width attribute……

    出现这种情况的可能原因目前本人碰到的有: 1:在xml文件中某个属性名或者属性值写错,请务必仔细检查你有没有写错某个拼写. 2:当你在,比如TextView中,没有声明layout_width,经测试 ...