Spring【三】核心API学习

举报
周棋洛 发表于 2022/07/10 22:33:45 2022/07/10
【摘要】 主页:查看更多文章 专栏:订阅专栏 ✅ 关键:Spring 核心API Spring 框架对与 Java 👨‍💻,重要性不言而喻,本专栏将系统学习框架核心思想和实现原理,理论和实践相结...

主页:查看更多文章
专栏:订阅专栏 ✅
关键:Spring 核心API

在这里插入图片描述

Spring 框架对与 Java 👨‍💻,重要性不言而喻,本专栏将系统学习框架核心思想和实现原理,理论和实践相结合,帮助刚学习框架的小伙伴摆脱困境重拾自信,原创不易,如果觉得文章对你有帮助,记得点赞收藏呀。

1. 知识清单

以下是本文将要学习的知识清单。

在这里插入图片描述

2. 环境配置

首先,创建Maven模块,再pom中引入以下依赖

<dependencies>
    <!--Spring IoC容器,负责实例化、配置和组装bean-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.10.RELEASE</version>
    </dependency>
    <!--lombok 自动生成标准Java类-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>
    <!--单元测试框架-->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

然后在main.ava.dao包下创建User实体类,使用lombok快速生成标准Java类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int id;
    private String name;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在main.resources包下创建Spring配置文件application.xml,将实体类User交由Spring IoC容器管理

<?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 唯一标识 class 类全限定名-->
    <bean id="user" class="dao.User"/>

</beans>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

好,准备工作就完成了,准备学习核心API

3. getBean(String name)

在main包下新建Spring启动类MainApplication,编写代码

返回Object对象,需要进行强制类型转换

@Test
public void Test1() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/application.xml");
    /**
     * String name 一个参数,直接传入配置文件bean唯一标识,即id
     * 返回Object对象,需要进行强制类型转换
     */
    User user = (User) context.getBean("user");
    user.setId(1);
    user.setName("小张");
    System.out.println(user);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

执行结果:

User(id=1, name=小张)

  
 
  • 1

4. getBean(String var1, Class var2)

直接返回字节码的类型,无需强制转换

@Test
public void Test2() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/application.xml");
    /**
     * getBean(String var1, Class<T> var2)
     * var1: bean id
     * var2: bean class
     * 直接返回字节码的类型,无需强制转换
     */
    User user = context.getBean("user", User.class);
    user.setId(2);
    user.setName("小刘");
    System.out.println(user);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

执行结果:

User(id=2, name=小刘)

  
 
  • 1

5. getBean(Class var1)

@Test
public void Test3() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/application.xml");
    User user = context.getBean(User.class);
    user.setId(2);
    user.setName("小刘");
    System.out.println(user);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

执行结果:

User(id=2, name=小刘)

  
 
  • 1

修改配置文件,现在有两个User类bean标签,id不同,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 唯一标识 class 类全限定名-->
    <bean id="user" class="dao.User"/>
    <bean id="user1" class="dao.User"/>

</beans>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

但是,因为这个API传入的是类类型,它发现有两个这样的类型,不知道到底要给你创建哪一个,就会报错了,需要注意哦

@Test
public void Test3() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/application.xml");
    /**
     * getBean(Class<T> var1)
     * 一个参数var1:直接传入类类型
     * 一旦配置文件有两个id不同的类型,需要注意,这时就会报错
     * 因为Spring不知道,你想要创建哪一个id的类实例,
     */
    User user = context.getBean(User.class);
    user.setId(2);
    user.setName("小刘");
    System.out.println(user);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

报错

org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type 'dao.User' available: expected single matching bean but found 2: user,user1

  
 
  • 1
  • 2

6. getBeanDefinitionNames()

获取Spring工厂配置文件所有bean标签id的值

@Test
public void Test4() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/application.xml");
    /**
     * getBeanDefinitionNames()
     * 获取Spring工厂配置文件所有bean标签id的值
     */
    String[] names = context.getBeanDefinitionNames();
    for (String name : names) {
        System.out.println(name);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

因为工厂只配置了一个user,所以返回了一个

user

  
 
  • 1

7. getBeanNamesForType()

根据类型获取配置文件中所有bean标签id的值

@Test
public void Test5() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/application.xml");
    /**
     * getBeanNamesForType()
     * 根据类型获取配置文件中所有bean标签id的值
     */
    String[] names = context.getBeanNamesForType(User.class);
    for (String name : names) {
        System.out.println(name);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

因为我要返回所有的User类型的,配置文章只有一个User类型的,所以只有一个user

user

  
 
  • 1

8. containsBeanDefinition()

用于判断工厂中是否存在指定id的bean

@Test
public void Test6() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/application.xml");
    /**
     * containsBeanDefinition()
     * 用于判断工厂中是否存在指定id的bean
     */
    System.out.println(context.containsBeanDefinition("user"));
    System.out.println(context.containsBeanDefinition("person"));
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
true
false

  
 
  • 1
  • 2

本节学习了IoC容器的相关API,我们下期再见。

文章来源: blog.csdn.net,作者:王子周棋洛,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/m0_53321320/article/details/125700182

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。