使用Spring由构造方法自动装配

Spring由构造方法自动装配

在Spring中,可以使用“通过构造自动装配”,实际上是按构造函数的参数 类型自动装配。 这意味着,如果一个bean的数据类型与其他bean的构造器参数的数据类型是相同的,那么将自动装配。

下面看看Spring构造函数自动装配的一个完整例子。

1. Beans

这里有两个 beans, 分别是:developer 和 language

public class Developer {
 private Language language;
 public Language getLanguage() {
  return language;
 }

 public void setLanguage(Language language) {
  this.language = language;
 }

 @Override
 public String toString() {
  return "Developer [language=" + language + "]";
 }
}
public class Language {
 private String name;
 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 @Override
 public String toString() {
  return "Language [name=" + name + "]";
 }
}

2. Spring装配

通常情况下,你可以通过构造这样自动装配 Bean:

<?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.xsd">

 <bean id="developer" class="com.ray.common.Developer">
  <constructor-arg>
   <ref bean="language"/>
  </constructor-arg>
 </bean>

 <bean id="language" class="com.ray.common.Language">
  <property name="name" value="Java"/>
 </bean>
</beans>

输出

Developer [language=Language [name=Java]]

随着自动装配用构造函数启用后,你可以不设置构造器属性。Spring会找到兼容的数据类型,并自动装配它。

<?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.xsd">

 <bean id="developer" class="com.ray.common.Developer" autowire="constructor" />

 <bean id="language" class="com.ray.common.Language">
  <property name="name" value="Java"/>
 </bean>
</beans>

输出

Developer [language=Language [name=Java]]

spring的五种自动装配方式

当Spring装配Bean属性时,有时候非常明确,就是需要将某个Bean的引用装配给指定属性。

先写两个类

public class UserServcie {
    private UserDao userDao;
    public UserServcie(UserDao userDao){}
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    public UserDao getUserDao(){
        return userDao;
    }
}
public class UserDao {
}

例如:在UserServcie中注入UserDao需要显式的手动装配

<bean id="userDao" class="com.beans.UserDao"></bean>
<bean id="userService" class="com.beans.UserServcie">
   <property name="userDao" ref="userDao"></property>
</bean>

这种写法会是开发效率变慢。

因此出现了spring的自动装配方式:五种自动装配方式 no、byName、byType、constructor、default。

1、no

当使用autowire="no"时,不使用自动装配,依然需要手动装配,需要显式指定某个bean的引用。

<bean id="userService" class="com.beans.UserServcie" autowire="no">
     <property name="userDao" ref="userDao"></property>
</bean>

2、byName

使用autowire="byName"装配方式时,就是使用名字装配,不需要显式指定某个bean的引用,此时使用的是setter方式注入。此时要注意需要被注入的bean的id和注入的bean的属性名之间的匹配,否则失败注入不成功。

例如:UserService中需要注入UserDao, private UserDao userDao,当byName注入时,spring会在ioc容器中寻找id="userDao"的对象,找到注入成功,找不到注入失败。

public class UserServcie {
    private UserDao userDao;
    public UserServcie(UserDao userDao){}
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    public UserDao getUserDao(){
        return userDao;
    }
}

此时的配置文件为

<bean id="userDao" class="com.beans.UserDao"></bean>
<bean id="userService" class="com.beans.UserServcie" autowire="byName"></bean>

3、byType

使用autowire="byType"装配方式时,就是使用类型装配,不需要显式指定某个bean的引用,此时使用的是setter方式注入。此时需要注意ioc容器中不允许出现同一个类型的两个及以上个数量的实例,否则失败报异常。

此时的配置文件为

<bean id="userDao" class="com.beans.UserDao"></bean>
<bean id="userService" class="com.beans.UserServcie" autowire="byType"></bean>

4、constructor

使用autowire="constructor "装配方式时,默认也是使用byType方式装配,只是不同的是按照构造器参数的类型进行装配,构造器方式注入。

<bean id="userDao" class="com.beans.UserDao"></bean>
<bean id="userService" class="com.beans.UserServcie" autowire="constructor"></bean>

5、default

使用autowire="default"装配方式时,是使用父级标签的默认装配方式,我们这里也就是指<bean/>的父级标签<beans>的默认装配方式进行装配。例如:

<beans default-autowire="byType"
       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.xsd">

    <bean id="userDao" class="com.beans.UserDao"></bean>
    <bean id="userService1" class="com.beans.UserServcie" autowire="default"></bean>
    <bean id="userService2" class="com.beans.UserServcie" autowire="byName"></bean>
</beans>

这里beans标签使用的是byType方式,对于userService1 使用的autowire="default",就会使用beans的byType方式装配,而 userService1的autowire="byName"则会使用byName装配。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 彻底搞明白Spring中的自动装配和Autowired注解的使用

    一.自动装配 当Spring装配Bean属性时,有时候非常明确,就是需要将某个Bean的引用装配给指定属性.比如,如果我们的应用上下文中只有一个org.mybatis.spring.SqlSessionFactoryBean类型的Bean,那么任意一个依赖SqlSessionFactoryBean的其他Bean就是需要这个Bean.毕竟这里只有一个SqlSessionFactoryBean的Bean. 为了应对这种明确的装配场景,Spring提供了自动装配(autowiring).与其显式的装配

  • Spring的自动装配Bean的三种方式

    spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>.<constructor-arg>).IOC容器会自动建立javabean之间的关联关系. 如果没有采用自动装配的话,手动装配我们通常在配置文件中进行实现:一下代码就是手动装配: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="ht

  • Spring自动装配之方法、构造器位置的自动注入操作

    Spring自动装配之方法.构造器位置的自动注入 1. 注解定义 @Autowired的定义信息如下: @Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Autowi

  • 详解Spring Boot自动装配的方法步骤

    在<Spring Boot Hello World>中介绍了一个简单的spring boot例子,体验了spring boot中的诸多特性,其中的自动配置特性极大的简化了程序开发中的工作(不用写一行XML).本文我们就来看一下spring boot是如何做到自动配置的. 首先阐明,spring boot的自动配置是基于spring framework提供的特性实现的,所以在本文中,我们先介绍spring framework的相关特性,在了解了这些基础知识后,我们再来看spring boot的自

  • 使用Spring由构造方法自动装配

    Spring由构造方法自动装配 在Spring中,可以使用"通过构造自动装配",实际上是按构造函数的参数 类型自动装配. 这意味着,如果一个bean的数据类型与其他bean的构造器参数的数据类型是相同的,那么将自动装配. 下面看看Spring构造函数自动装配的一个完整例子. 1. Beans 这里有两个 beans, 分别是:developer 和 language public class Developer { private Language language; public L

  • Spring框架学习之Spring @Autowired实现自动装配的代码

    学习自动装配之前,讲一个概念:Component,即组件.组件你也可以理解为bean对象,只不过通常Component的组成会稍微复杂一些,比如,一个组件里面会引用一个或多个别的bean对象,组件的定义方式也不一样.自动装配貌似就是为组件而生的. 自动装配(Autowired)这个概念,如果你已经使用过SpringMVC或者SpringBoot做开发,你会发现@Autowired注解是特别经常使用到的.比如你的Controller.Service相关的类里面就会经常用到.如果你看过@Contro

  • Spring注解实现自动装配过程解析

    在IOC容器中学习相关注解(常用) 1. @Autowireda.作用对象:(官网解释) 1. You can apply the @Autowired annotation to constructors: 2.you can also apply the @Autowired annotation to "traditional" setter methods: 3.You can also apply the annotation to methods with arbitrar

  • Java注解机制之Spring自动装配实现原理详解

    Java中使用注解的情况主要在SpringMVC(Spring Boot等),注解实际上相当于一种标记语言,它允许你在运行时动态地对拥有该标记的成员进行操作.注意:spring框架默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean>标签的autowire属性. 自动装配属性有6个值可选,分别代表不同的含义: byName ->从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找<bean>标签的id属性值.如果

  • Spring注解实现Bean自动装配示例详解

    何为自动装配 自动装配是 Spring 满足 bean 依赖的一种方式. 在使用 Spring 配置 bean 时,我们都要给配置的 bean 的属性设置一个值,如果不手动设置则都是空.而自动的好处就在于,我们不用手动去设置一个值,spring 会在上下文中自动寻找并装配合适的值. 本文主要介绍了Spring注解Bean自动装配的相关内容,下面话不多少了,来一起看看详细的介绍吧 使用须知: 1.导入约束:context约束 2.配置注解的支持: context:annotation-config

  • Spring使用@Autowired注解实现自动装配方式

    目录 Spring支持注解配置 引入注解依赖 启用注解 使用@Autowired注解实现自动装配 1.IOC容器配置 2.实体类使用@Autowired注解注入属性 3.测试结果 @Autowired注解的使用和注入规则 1.使用在变量域上面 2.@Autowired注解使用在构造器上面 Spring支持注解配置 引入注解依赖 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="ht

随机推荐