什么是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等类似。