SpringIOC容器与如何注入组件以及给各种各样的复杂类型赋值

什么是Spring配置文件

Spring 配置文件是 XML 文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。但是,XML 配置文件冗长且更加干净。如果没有正确规划和编写,那么在大项目中管理变得非常困难。

什么是springIOC容器

Spring 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。Spring 容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指
令。该元数据可以通过 XML,Java 注解或 Java 代码提供。

导入依赖

<!--导入Spring的核心jar包-->
      <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.1.7.RELEASE</version>
      </dependency>
      <!--日志包-->
      <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
      <dependency>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
          <version>1.2</version>
      </dependency>

测试用的Person类

package com.xzy;

import java.awt.print.Book;
import java.util.List;
import java.util.Map;

public class Person {
    private String name;
    private int age;
    private String gender;
    private String email;
    private Car car;
    List<Book> books;
    private Map<String, Object> maps;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public List<Book> getBooks() {
        return books;
    }

    public void setBooks(List<Book> books) {
        this.books = books;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", email='" + email + '\'' +
                ", car=" + car +
                ", books=" + books +
                ", maps=" + maps +
                '}';
    }
}

类路径下添加配置文件并注册组件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--注册一个Person对象,一个bean注册一个组件-->
    <!--id为组件的唯一标识-->
    <bean id="person01" class="com.xzy.Person">
        <!--property是调用setter方法进行赋值-->
        <property name="name" value="张三"/>
        <property name="age" value="20"/>
        <property name="gender" value=""/>
        <property name="email" value="zhangsan@163.com"/>
    </bean>
<!--    <bean id="person02" class="com.xzy.Person">
        <property name="name" value="李四"/>
        <property name="age" value="26"/>
    </bean>
-->
    <!--必须有这个构造器, 调用有参构造器进行赋值 如果不指定name属性,就得按照构造器的参数顺序 也可以通过index指定索引-->
<!--    <bean id="person03" class="com.xzy.Person">
        <constructor-arg name="name" value="Tom"/>
        <constructor-arg name="age" value="15"/>
        <constructor-arg name="gender" value="man"/>
        <constructor-arg name="email" value="Tom@qq.com"/>
    </bean>
-->

    <!--通过P名称空间为属性赋值,xml中名称空间用来防止标签重复-->
    <bean id="person04" class="com.xzy.Person"
          p:name="名称空间"
          p:gender="no"
          p:age="1000"
          p:email="hello@163.com">
    </bean>
</beans>

编写测试类

package org.example;

import com.xzy.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IocTest {

    @Test
    public void test01(){
        //从类路径下读取配置文件
        ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc.xml");
        //容器帮我们创建对象
        Person person01 = (Person) ioc.getBean("person01");
        System.out.println(person01);
    }
    @Test
    public void test02(){
        ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc.xml");
        Person person = ioc.getBean("person04",Person.class);
        //按照类型去找对应的bean,如果有多个bean就会报错。
        System.out.println(person);
    }

}

运行之后,就会显示出相关组件的信息。这样,spring的简单环境就搭建好了。

为复杂类型的属性赋值

对于复杂属性的复制应该放在property标签体内

    <bean id="person01" class="com.xzy.Person">
        <property name="name" >
            <!--手动对属性进行赋null值-->
            <null/>
        </property>

    </bean>
null值

ioc的xml文件配置


    <bean id="person01" class="com.xzy.Person">
	<!--空值默认为null-->
    </bean>

引用类型

使用ref标签

 </property>
        <!--对其它对象进行赋值 使用引用容器中已经有的组件-->
        <property name="car" ref="car01"/>

在内部创建对象

        <property name="car">
            <!--在property内部创建bean标签进行创建对象-->
            <bean id="car" class="com.xzy.Car">
                <property name="carName" value="mini"/>
                <property name="carColor" value="red"/>
            </bean>
        </property>
List类型
 <property name="books">
            <list>
                <!--引用内部创建的bean-->
                <bean class="com.xzy.Book">
                    <property name="name" value="西游记"/>
                </bean>
                <!--引用外部创建的bean-->
                <ref bean="book01"/>
            </list>
        </property>
Map类型
 <property name="maps">
            <map>
                <!--为Map属性赋值-->
                <entry key="key1" value="Tom"/>
                <entry key="ker2" value-ref="book01"/>
                <entry key="key3">
                    <bean class="com.xzy.Car">
                        <property name="carName" value="公交车"/>
                    </bean>
                </entry>
            </map>
        </property>
    </bean>

测试类

    @Test
    public void test01(){
        ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc2.xml");
        Person person02 = (Person) ioc.getBean("person02");
        System.out.println(person02);
    }

运行结果

Person{name='null', age=0, gender='null', email='null',
 car=null, books=[Book{name='西游记', price=null},
 Book{name='东游记', price=null}], maps={key1=Tom, 
 ker2=Book{name='东游记', price=null}, key04=Car{carName='公交车', carColor='null'}}}

Process finished with exit code 0

引用类型的值为null值,基本类型是默认值。其他的还有数组,properties等类似。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值