专栏首页数据分析与挖掘spring之自动装配的三种方式

spring之自动装配的三种方式

springIOC容器可以自动装配Bean,需要做的仅仅是在<bean>中的autowire属性里指定自动装配的方式。

ByType:根据类型自动装配。若IOC容器中有多个目标Bean类型一致的bean,在这种情况下,spring将无法判定那个bean最适合该属性,所以不能执行自动装配。

ByName:根据名称自动装配,必须将目标Bean的名称和属性名设置完全相同。

contructor:通过构造器自动装配,当Bean中存在多个构造器时,此种自动装配方式将会很复杂,不推荐使用,

Car.java

package com.gong.spring.beans.autowire;

public class Car {
    
    public Car() {
    }

    public Car(String name) {
        this.name = name;
    }
    private String name;

    public String getName() {
        return name;
    }

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

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

Address.java

package com.gong.spring.beans.autowire;

public class Address {
    private String street;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

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

Student.java

package com.gong.spring.beans.autowire;
import java.util.List;
import java.util.Map;

public class Student {
    
    private String name;
    private int age;
    private double score;
    private Car car;
    private Address address;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", score=" + score + ", car=" + car + ", address=" + address
                + "]";
    }
    
    
}

beans-autowire.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"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="car" class="com.gong.spring.beans.autowire.Car" p:name="baoma"></bean>
    <bean id="address" class="com.gong.spring.beans.autowire.Address" p:street="络南街道"></bean>
    <bean id="address2" class="com.gong.spring.beans.autowire.Address" p:street="珞狮街道"></bean>
    <!-- 
    <bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom"
    p:age="12" p:score="99.00" p:address-ref="address" p:car-ref="car"></bean>
     -->
    <!-- 使用byName时,要装配的bean的名字要和类文件中的setter方法中的名字保持一致,若没有匹配的,则不装配 
    <bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom"
    p:age="12" p:score="99.00" autowire="byName"></bean>
    -->
    <!-- byType根据bean的类型和当前Bean的属性自动装配,若IOC容器中有一个以上的bean可以匹配,则会抛出异常 -->
    <bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom"
    p:age="12" p:score="99.00" autowire="byName"></bean>
</beans>

Main.java

package com.gong.spring.beans.autowire;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        //1.创建spring的IOC容器对象
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml");
        //2.从容器中获取Bean实例
        Student student = (Student) ctx.getBean("student"); 
        System.out.println(student.toString());
    }
}

XML配置里自动装配的缺点:

(1)自动装配将会装配Bean的所有属性,然而只需要装配个别属性时,自动装配就不够灵活;

(2)要么根据类型,要么根据名称自动装配,不能两者兼顾;

(3)一般而言,在实际项目中很少使用自动装配,因为与自动装配功能带来的好处相比,明确清晰的配置方式更有说服力;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring之配置单例的集合bean,以供多个bean进行引用

    这种情况下,是在一个bean的里面进行配置的,假设现在我们有另外一个bean,也需要使用List集合里的bean,那么应该怎么做呢?

    绝命生
  • 【python-leetcode57-区间合并】插入区间

    在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

    绝命生
  • spring之为级联集合属性进行赋值

    主要是将car变为Map<String,Car>类型,然后新加getter和setter方法。

    绝命生
  • Spring系列第11篇:bean中的autowire-candidate又是干什么的?

    上一篇文章Spring系列第10篇:primary可以解决什么问题?中遇到的问题我们再来回顾一下,当容器中某种类型的bean存在多个的时候,此时如果我们从容器中...

    路人甲Java
  • Android 天气APP(五)天气预报、生活指数的数据请求与渲染

    天气预报是预测未来几天的天气,常用列表显示,实现这个功能的业务逻辑是:访问API、获取返回值、列表配置、数据渲染。首先是API接口。

    晨曦_LLW
  • Spring 自动装配模式之byType

    Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 byType。然后,如果它的 type 恰好与配置文件...

    Jerry Wang
  • 通过扩展让ASP.NET Web API支持JSONP

    同源策略(Same Origin Policy)的存在导致了“源”自A的脚本只能操作“同源”页面的DOM,“跨源”操作来源于B的页面将会被拒绝。同源策略以及跨域...

    蒋金楠
  • 句子成分(主干部分)

    白胡杨同学
  • Spring、Spring Boot和TestNG测试指南 - 共享测试配置

    我们可以将测试配置放在一个@Configuration里,然后在测试@SpringBootTest或ContextConfiguration中引用它。

    颇忒脱
  • 30分钟泛型教程

    一、泛型入门: 我们先来看一个最为常见的泛型类型List<T>的定义 (真正的定义比这个要复杂的多,我这里删掉了很多东西) [Serializable] pub...

    liulun

扫码关注云+社区

领取腾讯云代金券