详解Java的Spring框架下bean的自动装载方式_java

Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的<constructor-arg>和<property>元素。

自动装配模式:
有下列自动装配模式,可用于指示Spring容器使用自动装配依赖注入。使用<bean/>元素的autowire属性为一个bean定义中指定自动装配模式。

byName模式
这种模式规定由自动装配属性名称。Spring容器在外观上自动线属性设置为byName的XML配置文件中的bean。然后,它尝试匹配和接线其属性与配置文件中相同的名称定义的Bean。如果找到匹配项,它会注入这些bean,否则,它会抛出异常。

例如,如果一个bean定义设置为自动装配byName的配置文件,它包含aspellChecker属性(即,它有一个 setSpellChecker(...)方法),Spring就会查找名为拼写检查一个bean定义,并用它来设置该属性。仍然可以使用的<property>标签连线其余属性。下面的例子将说明这个概念。

来创建一个Spring应用程序:
这里是TextEditor.java文件的内容:

package com.yiibai;

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();
  }
}

下面是另外一个相关的类文件SpellChecker.java内容:

package com.yiibai;

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

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

}

以下是MainApp.java文件的内容:

package com.yiibai;

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();
  }
}

以下是在正常情况下的配置文件beans.xml文件:

<?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.yiibai.TextEditor">
   <property name="spellChecker" ref="spellChecker" />
   <property name="name" value="Generic Text Editor" />
  </bean>

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

</beans>

但是,如果要使用自动装配“byName”,那么XML配置文件将如下:

<?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.yiibai.TextEditor"
   autowire="byName">
   <property name="name" value="Generic Text Editor" />
  </bean>

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

</beans>

创建源代码和bean配置文件完成后,让我们运行应用程序。如果一切顺利,这将打印以下信息:

Inside SpellChecker constructor.
Inside checkSpelling.

byType模式
式规定由自动装配属性类型。Spring容器在外观上autowire属性设置为byType的XML配置文件中的bean。然后,它尝试匹配和连接一个属性,如果它的类型有完全相同的豆子名称的一个匹配的配置文件。如果找到匹配项,它会注入这些bean,否则,它会抛出异常。

例如,如果一个bean定义设置为自动装配byType的配置文件,它包含拼写检查类型的aspellChecker属性,春季查找名为拼写检查一个bean定义,并用它来设置该属性。仍然可以使用<property>标签接线其余属性。下面的例子将说明这个概念,会发现和上面的例子没有什么区别,除了XML配置文件已被更改。

同样,来创建一个Spring应用程序说明:
这里是TextEditor.java文件的内容:

package com.yiibai;

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();
  }
}

下面是另外一个相关的类文件SpellChecker.java内容:

package com.yiibai;

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

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

}

以下是MainApp.java文件的内容:

package com.yiibai;

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();
  }
}

以下是在正常情况下的配置文件beans.xml文件:

<?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.yiibai.TextEditor">
   <property name="spellChecker" ref="spellChecker" />
   <property name="name" value="Generic Text Editor" />
  </bean>

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

</beans>

但是,如果要使用自动装配“byType”,那么XML配置文件将如下:

<?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.yiibai.TextEditor"
   autowire="byType">
   <property name="name" value="Generic Text Editor" />
  </bean>

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

</beans>

当创建源代码和bean配置文件完成后,让我们运行应用程序。如果一切顺利,这将打印以下信息:

Inside SpellChecker constructor.
Inside checkSpelling.

由构造函数自动装配
这种模式是非常相似byType,但它应用于构造器参数。 Spring容器在外观上autowire属性被设置XML配置文件中bean的。然后,它尝试匹配和连线它的构造函数的参数与bean名称的配置文件只有一个。如果找到匹配项,它会注入这些bean,否则,它会抛出异常。

例如,如果一个bean定义设置为通过构造配置文件自动装配,它具有与拼写检查类型的参数之一的构造函数,春天寻找一个bean定义namedSpellChecker,并用它来设置构造函数的参数。仍然可以使用<constructor-arg>标签连线剩余的参数。下面的例子将说明这个概念。
这里是TextEditor.java文件的内容:

package com.yiibai;

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();
  }
}

下面是另外一个相关的类文件SpellChecker.java内容:

package com.yiibai;

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

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

}

以下是MainApp.java文件的内容:

package com.yiibai;

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();
  }
}

以下是在正常情况下的配置文件beans.xml文件:

<?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.yiibai.TextEditor">
   <constructor-arg ref="spellChecker" />
   <constructor-arg value="Generic Text Editor"/>
  </bean>

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

</beans>

但是,如果要使用由“构造函数”自动装配,那么XML配置文件将如下:

<?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.yiibai.TextEditor"
   autowire="constructor">
   <constructor-arg value="Generic Text Editor"/>
  </bean>

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

</beans>

创建源代码和bean配置文件完成后,让我们运行应用程序。如果一切顺利,这将打印以下信息:

Inside SpellChecker constructor.
Inside checkSpelling.

除此之外,还有autodetect和默认方式,这里就不再细讲。
自动装配的局限性:
自动装配最好效果是它始终在一个项目中使用。如果自动装配不一般的使用,它可能会被混淆为开发人员可以使用它来连接只有一个或两个bean定义。不过,自动装配可以显著减少需要指定属性或构造器参数,但你应该使用它们之前考虑自动装配的局限性和缺点。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
spring
spring 框架装载bean、spring 装载bean、spring bean.xml详解、spring bean配置详解、spring bean 详解,以便于您获取更多的相关知识。

时间: 2024-09-23 18:30:35

详解Java的Spring框架下bean的自动装载方式_java的相关文章

详解Java的Spring框架中bean的定义以及生命周期_java

bean的定义形成应用程序的骨干是由Spring IoC容器所管理的对象称为bean.bean被实例化,组装,并通过Spring IoC容器所管理的对象.这些bean由容器提供,例如,在XML的<bean/>定义,已经看到了前几章的形式配置元数据创建. bean定义包含所需要的容器要知道以下称为配置元数据的信息: 如何创建一个bean Bean 生命周期的详细信息 Bean 依赖关系 上述所有配置元数据转换成一组的下列属性构成每个bean的定义. Spring配置元数据 Spring IoC容

详解Java的Spring框架中bean的注入集合_java

使用value属性和使用<property>标签的ref属性在你的bean配置文件中的对象引用,这两种情况下可以处理单值到一个bean,如果你想通过多元值,如Java Collection类型List, Set, Map 及 Properties.要处理这种情况,Spring提供了四种类型的如下集合的配置元素: 可以使用<list> 或<set> 来连接任何实现java.util.Collection或数组. 会遇到两种情况(a)将收集的直接的值及(b)传递一个bean

详解Java的Struts2框架的结构及其数据转移方式_java

Struts2的结构 1.为什么要使用框架? (1)框架自动完成了很多琐屑的任务 对于Struts2来说,它帮助我们方便地完成了数据类型转换.数据验证.国际化等等 Web开发中常见的任务.还有Spring中大量使用的Template模式,都是在让我们的开发 过程更加自动化.智能化.使用框架就是避免重新发明轮子,重新复制这些模板代码. 框架让我们将精力更多地放在更高级别的问题上,而不是常见工作流和基础任务上. (2)使用框架就是优雅地继承了框架背后的架构 框架背后的架构通常定义了一系列的工作流程,

详解Java的Spring框架中的事务管理方式_java

数据库事务是被当作单个工作单元的操作序列.这些操作要么全部完成或全部不成功.事务管理是面向企业应用程序,以确保数据的完整性和一致性RDBMS中的重要组成部分.事务的概念可以用下面的描述为ACID四个关键属性来描述: 原子性: 一个事务应该被视为单个操作单元表示的操作的任一整个序列是成功的或不成功的. 一致性: 这代表了数据库的参照完整性,在桌等唯一主键的一致性 隔离性: 可能有很多事务处理相同的数据集的同时,每个事务都应由他人隔离,以防止数据损坏. 持久性: 一旦事务完成,本次事务的结果必须作出

详解Java的Spring框架中的注解的用法_java

1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现: class UserManagerImpl implements UserManager { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } ... } 配置文件: <bean id="userManagerImpl" class="com.

详解Java的Hibernate框架中的搜索工具的运用_java

hibernate提供了全文索引功能,非常棒,这里简要介绍下它的用法, 1. 在pom.xml引入包依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-search-orm</artifactId> <version>${hibernate-search.version}</version> </dependency> &

详解Java的Hibernate框架中的缓存与二级缓存_java

缓存 今天我们就来讲一下hibernate中实体状态和hibernate缓存.  1)首先我们先来看一下实体状态:  实体状态主要分三种:transient,persitent,detached.  看英文应该就大概明白了吧.  transient:是指数据还没跟数据库中的数据相对应.  persistent:是指数据跟数据库中的数据相对应,它的任何改变都会反映到数据库中.  detached:是指数据跟数据库中的数据相对应,但由于session被关闭,它所做的修改不会对数据库的记录造成影响.

Java的Spring框架下的AOP编程模式示例_java

Spring框架的关键组件是面向方面编程(AOP)框架.面向方面的编程不仅打破程序逻辑分成不同的部分称为所谓的担忧.跨越多个点的应用程序的功能被称为横切关注点和这些横切关注点是从应用程序的业务逻辑概念上区分开来.还有像日志记录,审计,声明性事务,安全性和高速缓存等方面的各种常见的好例子 模块化的OOP中的关键单元是类,而在AOP中模块化的单元则是切面.依赖注入可以帮助你从对方解耦应用程序对象和AOP可以帮助你从他们影响的对象分离横切关注点. AOP是一样的编程语言如Perl,.NET,Java和

详解Java的Struts框架中上传文件和客户端验证的实现_java

文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的目录,以确保数据不丢失. 请注意,服务器有一个安全策略可能会禁止写到目录以外的临时目录和属于web应用的目录. 在Struts中的文件上传是通过预先定义的拦截文件上传拦截器这是可通过org.apache.struts2.interceptor.FileUploadInterceptor类的defaultStack