【SSM】13-Spring中实现依赖注入的两种方式(xml和注解)

本文详细介绍了Spring中实现依赖注入的两种方式,包括XML配置和注解方式。XML方式涉及set注入、构造注入及引用类型的自动注入;注解方式包括@Component、@Value、@Autowired和@Resource注解的使用。文章对比了XML和注解的优缺点,并强调了自动注入的常见应用场景。
摘要由CSDN通过智能技术生成

目录

前言

1、Bean的装配

1.1 默认的装配方式

1.2 Bean的作用域

2、基于xml的依赖注入

2.1 set注入(也叫设值注入)

2.1.1 简单类型

2.1.2 引用类型

2.2 构造注入

2.3 引用类型的自动注入

2.3.1 ByName 自动注入

2.3.2 ByType 自动注入

2.4 Spring多配置文件

3、基于注解的依赖注入

3.1 定义Bean的注解@Component

3.2 简单类型属性注入@value

3.3 byType自动注入@AutoWired

3.4 byName自动注入@AutoWired和@Qualifier

3.5 JDK注解@Resource自动注入

4、XML和注解两种方式的对比

5、小结


前言

声明:本专栏文章均为观看动力节点王鹤老师三大框架的视频所撰写的笔记,笔者实力有限,内容如有错误欢迎各位小伙伴在评论区指出。

视频链接:SSM-Spring

👉上文说到利用控制反转的思想可以将创建对象的任务交给Spring容器去执行,对象创建好了以后,自然就要去考虑如何给我们的对象赋值的问题,这同样是Spring容器应该考虑并解决的问题。那么Spring是如何做的呢?首先,Spring使用依赖注入(Dependency Injection),简称DI,实现了控制反转,在此基础上,分别基于xml文件和注解解决了给对象赋值的问题,这就相当于给类的私有属性暴露出两种公共访问方法供人进行属性设置一样,具体如何操作,闲话少说,大家往下看!


1、Bean的装配

Bean的概念:

Bean的英文含义是小豆子的意思,Spring非常形象的将我们需要用到的各种Java对象,比如实体类对象、容器对象、操作接口实现类对象等,都比喻成一颗颗小豆子,然后存放在自己的容器中。

1.1 默认的装配方式

所谓默认装配方式就是指当我们使用ApplicationContext容器创建对象的时候,他会读取配置文件中<bean>并默认调用的是该对象的无参构造方法进行实例化。

1.2 Bean的作用域

除了对象的创建以及对象属性赋值意外,关于类还有一个重要的属性需要关注,那就是对象的作用范围。java基础当中,利用四种不同的访问修饰符可以在类中的使控制其方法变量的使用范围,类似的,关于容器中bean的使用范围,Spring在<bean>标签中提供了一种属性,Scope属性,进行使用范围也就是作用域的指定。

scope属性值 作用域
singleton(单例模式) 作用于整个 Spring 容器中,使用 singleton 定义的 Bean 将是单例的,叫这个名称的对象只有一个实例
prototype(原型模式) 作用域每一个调用它的方法中,每次使用 getBean 方法获取的同一个的实例都是一个 新的实例
request 作用于每一个请求中,对于每次 HTTP 请求,都将会产生一个不同的 Bean 实例;该作用域仅适用于web的Spring WebApplicationContext环境
session 对于每个不同的 HTTP session,都将产生一个不同的 Bean 实例;

2、基于xml的依赖注入

bean实例在调用无参构造器创建对象后,就要对bean对象的属性进行初始化。初始化是由容器自动完成的,称为注入。 根据注入方式的不同,常用的有两类:set注入、构造注入

2.1 set注入(也叫设值注入)

set注入也叫设值注入是指,通过setter方法传入被调用者的实例。这种注入方式简单、直观,因而在Spring的依赖注入中大量使用。 

2.1.1 简单类型set注入

Spring中规定java中的基本数据类型和String类型都是简单类型。

创建学生类:

package com.bjpowernode.ba01;

public class Student {

    private String name;
    private int age;

    public Student() {
        System.out.println("spring会调用类的无参数构造方法创建对象");
    }

    public void setName(String name) {
        System.out.println("setName:"+name);
        this.name = name.toUpperCase();
    }

    public void setAge(int age) {
        System.out.println("setAge:"+age);
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 spring配置文件spring.xml中声明Student类的bean:

<bean id="myStudent" class="com.bjpowernode.ba01.Student" >
        <property name="name" value="李四" /><!--setName("李四")-->
        <property name="age" value="22" /><!--setAge(21)-->
</bean>

 单元测试:

@Test
    public void test01(){
       System.out.println("=====test01========");
       String config="ba01/applicationContext.xml";
       ApplicationContext ac = new ClassPathXmlApplicationContext(config);

       //从容器中获取Student对象
       Student myStudent =  (Student) ac.getBean("myStudent");
       System.out.println("student对象="+myStudent);

   }

2.1.2 引用类型set注入

当指定bean的某属性值为另一bean的实例时,属性值不是设置value而是通过ref指定它们间的引用关系。ref的值必须为某bean的id值。 例如上述学生类的属性中增加一个学校信息。

创建学校类:

package com.bjpowernode.ba02;

public class School {

    private String name;
    private String address;

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

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

Student类中添加School属性,修改如下:

package com.bjpowernode.ba02;

public class Student {

    private String name;
    private int age;

    //声明一个引用类型
    private School school;


    public Student() {
        System.out.println("spring会调用类的无参数构造方法创建对象");
    }

    // 包名.类名.方法名称
    // com.bjpowernode.ba02.Student.setName()
    public void se
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值