Spring 装配Bean的几种方式

本文详细介绍Spring框架中Bean的装配方式,包括基于XML的属性注入、构造函数注入、Bean间的关系处理等内容,帮助读者掌握Spring Bean的基本配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring 装配Bean 可分为基于XML的配置,基于注解的配置,基于Java类的配置

一 实体类

package com.learn.bean;
public class Car {
    private  String color;
    private  String brand;
    private  String maxSpeed;
    public  Car(){

    }
    public Car(String color,String brand,String maxSpeed){
        this.color = color;
        this.brand =brand;
        this.maxSpeed = maxSpeed;
    }

    public void show(){
        System.out.println("car:color" + color);
        System.out.println("car:brand" + brand);
        System.out.println("car:maxSpeed" + maxSpeed);
    }


    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getMaxSpeed() {
        return maxSpeed;
    }

    public void setMaxSpeed(String maxSpeed) {
        this.maxSpeed = maxSpeed;
    }
}

Boss类中包含Car类

package com.learn.bean;
public class Boss {
    private Car car;
    public Boss(){

    }
    public Boss(Car car){
        this.car = car;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }
}

一  基于XML的配置

    基于XML的配置可分为基于属性的配置和基于构造函数的配置

   1.1 基于属性的依赖注入

<!--不指定属性值-->
 <bean id="car" class="com.learn.bean.Car"/>
    <bean name="car2" class="com.learn.bean.Car"></bean>
  <bean class="com.learn.bean.Car"></bean>

<!--spring 属性注入 使用属性注入 必须为bean提供一个不带参数的构造函数-->
  <bean id="car3" class="com.learn.bean.Car">
    <property name="brand"><value>200</value></property>
    <property name="color"><value>red</value></property>
    <property name="maxSpeed"><value>1000</value></property>
  </bean>

基于属性依赖注入,需要实体类至少有一个无参的构造函数,其中id不可重复,也可以用name标识。可以简写为如下,如果不指定id和name,则可以通过getBean("类的全局 限定名")方式获得。

   <bean id="car10" class="com.learn.bean.Car">
        <property name="brand" value="111"/>
        <property name="color" value="222"/>
        <property name="maxSpeed" value="333"/>
    </bean>

    1.2  构造函数注入

     构造函数注入是除属性注入以外另一种常用的注入方式

    在前边的Car类中加入 double price 属性,并增加一个构造函数

    public Car(String brand,double price){
        this.brand = brand;
        this.price = price;
    }
    在可以按照以下方式注入 

 <bean id="carnew" class="com.learn.bean.Car">
        <constructor-arg type="java.lang.String">
            <value>宝马</value>
        </constructor-arg>

        <constructor-arg type="double">
            <value>100</value>
        </constructor-arg>

    </bean>
    <constructor-arg>的元素中有一个type属性,它为Spring提供了判断配置项构造函数对应关系的信息。但是如果在Car中定义有多个具有相同入参类型的构造函数,这种方式就是失效了,Spring 提供了一种按照入参索引的方式来确定

<bean id="carnew2" class="com.learn.bean.Car">
       <constructor-arg index="0" type="java.lang.String" value="123"/>
       <constructor-arg index="1" type="java.lang.String" value="123"/>
       <constructor-arg index = "2"  type ="double" value="123"/>
   </bean>
   通过index和type结合的方式Spring容器即可确定需要通过调用哪个构造函数来初始化bean。

    1.3 在Bean中引入其他bean 

     在上面的Boss类中,需要引入一个Car类,可以通过如下构造方法注入

   <bean name="car2" class="com.learn.bean.Car"></bean>
  <bean id="boos" class="com.learn.bean.Boss">
    <constructor-arg index ="0">
      <ref bean="car2"/>
    </constructor-arg>
  </bean>
   或者属性注入 

 <bean name="car2" class="com.learn.bean.Car"></bean>
    <bean id="boos2" class="com.learn.bean.Boss">
      <property name="car" ref="car2"/>
    </bean>
  如果尝试通过配置方式为car的brand属性赋值一个null值则可以通过,
<property name="maxSpeed"><null></null></property>

   的方式进行,等同于setMaxSpeed(null);

 1.4 通过p命名空间简化装配方式

     使用p命名空间可以简化Spring配置文件的xml的配置方式

    在使用p命名空间前,配置文件

 <bean id="carnew2" class="com.learn.bean.Car">
       <constructor-arg index="0" type="java.lang.String" value="123"/>
       <constructor-arg index="1" type="java.lang.String" value="123"/>
       <constructor-arg index = "2"  type ="double" value="123"/>
   </bean>

    <bean name="bossnew" class="com.learn.bean.Boss">\
        <property name="car"  ref="carnew2"/>
    </bean>
   使用p命名空间

  !--使用p命名空间-->

  <bean id="car5" class="com.learn.bean.Car"
    p:maxSpeed="100"
    p:brand="baoma"
    p:color="red"/>

  <bean id="boss3" class="com.learn.bean.Boss"
  p:car-ref="car5"/>

     可以看到配置方式得到大大简化,使用p命名空间需要在beans中引入p命名空间

<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">
  1.5 Bean之间的关系

     <bean>元素标签之间可以建立继承,依赖,引用等关系

    继承关系:

   如果多个<bean>存在相同的配置信息,则Spring允许定义一个父<Bean>,子<bean>将自动继承父<bean>的配置信息,写法如下

   <bean id="abstraceCar" class="com.learn.bean.Car" p:brand="baoma" p:color="red" p:maxSpeed="100"
    p:price="1000" abstract="true"/>
    <bean id="car7"  p:color="black" parent="abstraceCar"/>
    <bean id="car8"  p:color="blue" parent="abstraceCar"/>
     abstract=“true”表示这个父<bean>不实例化为一个bean,如果没有指定,则Spring会实例化一个名为abstraceCar的bean

   依赖关系:

    如果要保证一个类中另一个类之前初始化,可以通过<bean>的depends-on属性,写法如下

    <bean name="bossnew1" class="com.learn.bean.Boss" depends-on="car11"/>
    <bean name="car11" class="com.learn.bean.Car"/>
   这样即可保证car11在bossnew1 之前初始化

    

   

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值