Spring-基于XML管理bean

1. 导入依赖

pom.xml

<dependencies>
<!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.1</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
</dependencies>

2. 创建类

HelloWorld.java

public class HelloWorld {
    public void sayHello(){
        System.out.println("hello,spring");
    }
}

3. 创建Spring的配置文件并配置bean

applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
   
    <bean id="helloWorld" class="com.spring.pojo.HelloWorld"></bean>
</beans>

  配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理通过bean标签配置IOC容器所管理的bean.

bean:配置一个bean对象,将对象交给IOC容器管理
 属性:
           id:bean的唯一标识,不能重复
       class:设置bean对象所对应的类型

4. 创建测试类测试 

public class HelloWorldTest {
    @Test
    public void test(){
        //获取IOC容器
        ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取ioc容器中的bean对象
        HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloWorld");
        helloWorld.sayHello();

    }
}

5. Spring如何创建对象

  Spring 根据当前配置的bean标签来创建对象(class属性知道了对象的类型),而在Spring IOC中可以配置多个bean,所以类型是不确定的,在不确定的情况下,IOC使用反射技术和工厂模式来创建对象。

  Spring 底层默认通过反射技术调用组件类的无参构造器来创建组件对象。

  通过 Class.forName().getNewInstance() 创建实例对象

6. 获取bean的三种方式

(1)通过bean的id来获取  :

  HelloWorld helloWorld = (HelloWorld) ioc.getBean("helloWorld");   

(helloWorld 表示 bean 的 id )

(2)根据bean的类型获取:

 注意:根据类型获取bean时,要求IOC容器中有且只有一个类型匹配的bean

 若没有任何一个类型匹配的bean,此时抛出异常:NoSuchBeanDefinitionException

 若有多个类型匹配的bean,此时抛出异常:NoUniqueBeanDefinitionException

     HelloWorld helloWorld = ioc.getBean(HelloWorld.class);

(类的class对象,若在ioc容器中有多个类型匹配的bean,就获取不到)

(3)根据bean的id和类型获取

扩展:

如果组件类实现了接口,根据接口类型可以获取 bean

<bean id="helloWorld" class="com.spring.pojo.HelloWorld"></bean>
//类
public class HelloWorld implements Hello{
    public void sayHello(){
        System.out.println("hello,spring");
    }
}
//实现
Hello hello = ioc.getBean(Hello.class);

   如果一个接口有多个实现类,这些实现类都配置了 bean,根据接口类型不能获取 bean。

  根据类型来获取bean时,在满足bean唯一性的前提下,其实只是看:『对象 instanceof 指定的类型』的返回结果,只要返回的是true就可以认定为和类型匹配,能够获取到。

即通过bean的类型、bean所继承的类的类型、bean所实现的接口的类型都可以获取bean。

posted @   浑浑噩噩一只小迷七  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示