Spring bean 依赖注入的三种方式

前言

上一篇我们学习了如何建立spring项目,接下来我们学习spring bean的配置,这篇我们主要学习:

1、在 Spring IOC 容器里配置 Bean

2、IOC 容器中获取 Bean

3、依赖注入的方式

一、在 Spring IOC 容器里配置 Bean

xml 文件中通过 bean 节点来配置 bean

如图id:就是Bean的名称值得注意的是,id在 IOC 容器中必须是唯一的,若id没有指定,Spring自动将权限定性类名作为Bean的名字,当然,id可以指定多个名字,名字之间可用逗号、分号、或空格分隔。

Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用。Spring 提供了两种类型的 IOC 容器实现:

BeanFactory: IOC 容器的基本实现.

ApplicationContext: 提供了更多的高级特性. BeanFactory 的子接口.

总结:BeanFactory Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory,无论使用何种方式, 配置文件时相同的。

二、从 IOC 容器中获取 Bean

调用 ApplicationContext getBean() 方法,具体的查看我们上一篇test类中的代码:

public class test {
    public static void main(String args[]){
        //1创建String的IOC容器
        //ApplicationContext 代表IOC 容器接口
        //ClassPathXmlApplicationContext:ApplicationContext接口的实现类,该实现类从路径下加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2从IOC容器中获取Bean实例
        person person= (person) context.getBean("person");
        //3调用方法
        System.out.println(person.toString());
    }
}

 三、依赖注入的方式

Spring 支持 3 种依赖注入的方式:

1、属性注入

2、构造器注入

3、工厂方法注入(很少使用,不推荐)

1、属性注入

属性注入即通过setter方法注入Bean 的属性值或依赖的对象

属性注入使用<property>元素, 使用 name 属性指定 Bean 的属性名称,value属性或 <value>子节点指定属性值

属性注入是实际应用中最常用的注入方式,我们上一篇里面用的就是属性注入。

    <!-- 属性注入bean的依赖对象-->
    <bean id="person"
          class="entity.person">
        <property name="name" value="张三"></property>
        <property name="age" value="18"></property>
    </bean>

2、构造器注入

通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。

构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中没有 name 属性,

我们在之前的项目添加一个对象car类,在类里面添加一个构造器。

完整代码如下:

package entity;

public class car {
    private String brand;
    private String corp;
    private double price;
    private int maxSpeed;
    public car(String brand,String corp,double price){
        super();
        this.brand=brand;
        this.corp=corp;
        this.price=price;
    }
    
    @Override
    public String toString(){
        return "Car[brand ="+brand+",corp ="+corp+ ",price ="+price+",maxSpeed ="+maxSpeed+"]";
    }
}

然后在applicationContext.xml中插入:

    <!-- 构造器注入bean的依赖对象-->
    <bean id="car" class="entity.car">
        <constructor-arg value="Audi"></constructor-arg>
        <constructor-arg value="shanghai"></constructor-arg>
        <constructor-arg value="23" ></constructor-arg>
    </bean>

然后再test中加入:

car car=(car) context.getBean("car");
System.out.println(car.toString());

最后运行结果:

使用构造器注入属性值可以指定参数的位置和类型。以区分重载的构造器!

我们来实验一把,在car类中加入一个构造器:

    public car(String brand,String corp,int maxSpeed)
    {
        super();
        this.brand=brand;
        this.corp=corp;
        this.maxSpeed=maxSpeed;
    }

然后在applicationContext.xml中插入:

    <!-- 构造方法注入bean的依赖对象-->
    <bean id="car" class="entity.car">
        <constructor-arg value="Audi"></constructor-arg>
        <constructor-arg value="shanghai"></constructor-arg>
        <constructor-arg value="23" type="double"></constructor-arg>
    </bean>
    <!--  使用构造器注入属性值可以指定参数的位置和参数的类型!以区分重载的构造器!-->
    <bean id="car2" class="entity.car">
        <constructor-arg value="Baoma" index="0"></constructor-arg>
        <constructor-arg value="shanghai" index="1"></constructor-arg>
        <constructor-arg value="190" type="int"></constructor-arg>
    </bean>

在测试类中加入:

  car=(car) context.getBean("car2");
  System.out.println(car.toString());

最后运行结果:

3、工厂方法注入

虽然工厂注入方式不常用,但是有时候,静态工厂方法是实例化对象的唯一方法

新建一个类:

public class DBUtil {
    //构造方法私有化
    private DBUtil(){}
    //创建一个对象实例
    private static DBUtil instance = new DBUtil();  

    //获取对象
    public static DBUtil getInstance(){
        return instance;
    }
    public void test(){
        System.out.println("调用DBUtil的test方法");
    }
}

然后在applicationContext.xml中插入:

<bean id="dbUtils" class="entity.DBUtil" factory-method="getInstance"></bean>

在测试类中加入:

DBUtil dbUtil  = context.getBean("dbUtils",DBUtil.class);
dbUtil.test();

运行结果:

结语

因为是边学边写的,如有错误的地方,希望大家能指导一下,一起学习进步!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值