基于xml管理bean以及依赖注入

105 阅读2分钟

2.2.1,搭建子模块spring6-ioc-xml

在父工程目录下新建一个子工程,

并将所需的 spring-context , junit,log4j2 等相关依赖引入父工程的pom文件

遇到的问题: maven侧边栏父工程报错红色波浪线,相关子工程也报错

解决: 检查maven是否开启离线模式,删除相关依赖,重新导入或更新依赖版本

2.2.2,实验一 :获取bean

方式一:根据id获取

由于id属性指定了bean的唯一标识,所以根据bean标签属性的id属性可以精确获取到一个组件对象

public class TestUser {
public static void main(String[] args) {
     ApplicationContext context=
        new ClassPathXmlApplicationContext("bean.xml");
    //根据id获取bean
     User user = (User) context.getBean("user");
     System.out.printf("根据id获取bean:"+user);
    }
}

方式二:根据类型获取bean

类.class

//根据类型获取bean
User user2 = context.getBean(User.class);
System.out.print("根据类型获取bean:"+user2);

方式三:根据id和类型获取bean

id和类型组合

//根据id和类型获取bean
User user3 = context.getBean("user",User.class);
System.out.print("根据类型获取bean:"+user3);

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

如果IOC容器一个配置了两个

那么根据类型获取时就会抛出异常 !

ioc容器期望是单实例对象。

扩展:

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

可以,前提是bean唯一

如果一个接口有多个实现类,这些实现类都配置了bean,可以根据接口类型获取bean吗?

不行,因为bean不唯一!

结论

1.类有属性,创建对象过程中,向属性设置值

第一种方式:基于set方法完成

第二种方式:基于构造器完成

*set方法注入

第一步:创建类,定义属性,生产属性set方法

第二步:在spring配置文件配置

bean-di.xml

<bean id="book" class="com.atguigu.spring.ioc.di.Book">
	<property name="bname" value="前端开发"></property>
    <property name="author" value="尚硅谷"></property>
</bean>

book类

public class Book {
    private String bname;
    private String author;

    public String getBname() {
        return bname;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bname='" + bname + ''' +
                ", author='" + author + ''' +
                '}';
    }

    public void setBname(String bname) {
        this.bname = bname;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

测试类:

public class TestBook {
    @Test
    public void testSeetter(){
        ApplicationContext context=
                new ClassPathXmlApplicationContext("bean-di.xml");
        Book book=context.getBean("book",Book.class);
        System.out.println(book);
    }
}

输出:

"C:\Program Files\Java\jdk-17\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1\lib\idea_rt.jar=55090:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\31074.m2\repository\org\junit\platform\junit-platform-launcher\1.6.3\junit-platform-launcher-1.6.3.jar;C:\Users\31074.m2\repository\org\junit\platform\junit-platform-engine\1.6.3\junit-platform-engine-1.6.3.jar;C:\Users\31074.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.6.3\junit-jupiter-engine-5.6.3.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2023.1\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2023.1\plugins\junit\lib\junit5-rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2023.1\plugins\junit\lib\junit-rt.jar;D:\JavaProject\spring6\spring6-ioc-xml\target\classes;C:\Users\31074.m2\repository\org\springframework\spring-context\6.0.2\spring-context-6.0.2.jar;C:\Users\31074.m2\repository\org\springframework\spring-aop\6.0.2\spring-aop-6.0.2.jar;C:\Users\31074.m2\repository\org\springframework\spring-beans\6.0.2\spring-beans-6.0.2.jar;C:\Users\31074.m2\repository\org\springframework\spring-core\6.0.2\spring-core-6.0.2.jar;C:\Users\31074.m2\repository\org\springframework\spring-jcl\6.0.2\spring-jcl-6.0.2.jar;C:\Users\31074.m2\repository\org\springframework\spring-expression\6.0.2\spring-expression-6.0.2.jar;C:\Users\31074.m2\repository\org\junit\jupiter\junit-jupiter-api\5.6.3\junit-jupiter-api-5.6.3.jar;C:\Users\31074.m2\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;C:\Users\31074.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\31074.m2\repository\org\junit\platform\junit-platform-commons\1.6.3\junit-platform-commons-1.6.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 com.atguigu.spring.ioc.di.TestBook,testSeetter
Book{bname='前端开发', author='尚硅谷'}

Process finished with exit code 0

*构造器方法注入

第一步:创建类,定义属性,生成有参数构造方法

第二步:进行配置