准备工作
配置Maven依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.2</version>
</dependency>
<!--日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<!--单元测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
引入顶层的依赖,它包含的依赖也会被一并引入
创建实体类
User类文件结构如下
User类的内容如下:
public class User {
private String name;
private int age;
private String location;
public User(String name) {
this.name = name;
}
public User(String name, String location) {
this.name = name;
this.location = location;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", location='" + location + '\'' +
'}';
}
}
创建spring配置文件
在资源目录下创建spring config的XML文件,idea会自动写好必备的编码配置和命名空间如下:
<?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">
实验
1. 配置User类,让IOC容器管理
<!--id的值可以随意取,class是实体类User在类路径java下的全路径-->
<!--这种方式下是spring调用User的无参构造器创建的对象,因此User类要有无参构造器-->
<bean id="user1" class="com.rolin.xml.entity.User"/>
测试:
@Test
public void test1() {
//ApplicationContext接口类是Spring提供的IOC的实现方式,继承自BeanFactory(Spring内部使用的类,不提供给开发人员使用)
//ClassPathXMLApplicationContext通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//"user1"与xml文件中的id值对应,表示根据"user1"去IOC容器中检索对象,User.class设定返回类型为User
User user1 = context.getBean("user1", User.class); //User.class设定返回类型为User
System.out.println(user1);
//当配置文件中只有一个<bean>节点的class值是User的全路径时可以不传id值
//User user2 = context.getBean(User,class);
//System.out.println(user2);
}
运行结果如下,没有设置属性值,所以都是默认值:
2. IOC调用set方法注入属性值
<!--这种方式下是spring调用User的无参构造器创建的对象,因此User类要有无参构造函数-->
<bean id="user2" class="com.rolin.xml.entity.User">
<!--name为User中属性名,value为要set进去的值-->
<property name="location" value="GZ"/>
<property name="name" value="rolling"/>
</bean>
结果如下,name和location被赋值:
对于空值和一些特殊符号(如<,>)要特殊处理,如下:
<bean id="user2" class="com.rolin.xml.entity.User">
<property name="location">
<!-- null值写法-->
<null/>
</property>
<property name="name">
<!-- 有特殊符号时的写法-->
<value><![CDATA[<<angel>>]]></value>
</property>
</bean>
3. IOC调用有参构造方法注入属性值
<!--容器会根据参数个数和名字调用对应的构造函数-->
<bean id="user3" class="com.rolin.xml.entity.User">
<constructor-arg name="name" value="bbb"/>
<!-- index指参数列表的第二个参数,这种方式用的少-->
<constructor-arg index="1" value="Shanghai"/>
</bean>
4. p名称空间(不常见)
p名称空间是另一种用set方法注入属性值的写法,要在命名空间中加上一条:
xmlns:p="http://www.springframework.org/schema/p"
<bean id="user4" class="com.rolin.xml.entity.User" p:name="fahaxiki" p:age="10"/>
5. 外部bean注入属性
当要注入的属性是一个自定义类时我们可以采用waibean或者内部bean的方式注入,外部bean写法如下:
假设有如下两个类UserDAO和UserService,关系如下:
public class UserDAO{
public void getUp(){
System.out.println("User get up!");
}
}
public class UserService{
private UserDAO userDAO;
public void getUp(){
userDAO.getUp();
}
}
要往UserService的属性注入依赖,首先配置UserDAO的bean节点,然后再配置Userservice的bean节点,在<property>节点中添加映射关系,这种方式使得userDAO这个节点可以被映射多次:
<bean id="userDAO" class="com.rolin.entity.UserDAO"/>
<bean id="userService" class="com.rolin.entity.UserService">
<!--name是UserService类中的属性名,ref是对应的依赖即对应到id="userDAO"的bean节点,将它的对象注入到userService的属性userDAO中-->
<property name="userDAO" ref="userDAO"/>
</bean>
6. 内部bean注入属性
作为<property>的子节点<bean>来实现属性注入,这种方式使这个bean节点与包裹它的节点绑定,不能被多次映射到其他bean节点上,如图:
<bean id="userService" class="com.rolin.entity.UserService">
<!--属性名-->
<property name="userDAO">
<bean class="com.rolin.entity.UserDAO"/>
</property>
</bean>
7. 数组、list、map、set类型的属性注入
设有如下Student类和Prize类
public class Prize {
private String prizeName;
public Prize() {
}
public void setPrizeName(String prizeName) {
this.prizeName = prizeName;
}
@Override
public String toString() {
return "Prize{" +
"prizeName='" + prizeName + '\'' +
'}';
}
}
public class Student {
private String[] hobbies;
private List<String> schedule;
private Map<String, Integer> marks;
private Set<Prize> prizes; //存储的类型为Prize
public Student() {
}
public String[] getHobbies() {
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public List<String> getSchedule() {
return schedule;
}
public void setSchedule(List<String> schedule) {
this.schedule = schedule;
}
public Map<String, Integer> getMarks() {
return marks;
}
public void setMarks(Map<String, Integer> marks) {
this.marks = marks;
}
public void setPrizes(Set<Prize> prizes) {
this.prizes = prizes;
}
@Override
public String toString() {
return "Student{" +
"hobbies=" + Arrays.toString(hobbies) +
", schedule=" + schedule +
", marks=" + marks +
", prizes=" + prizes +
'}';
}
}
<bean id="stu1" class="com.rolin.xml.entity.Student">
<property name="hobbies">
<array>
<value>sleeping</value>
<value>eating</value>
</array>
</property>
<property name="schedule">
<list>
<value>study</value>
<value>learn</value>
</list>
</property>
<property name="marks">
<map>
<entry key="CS" value="100"/>
<entry key="NoSQL" value="100"/>
</map>
</property>
<!-- 注入对象-->
<property name="prizes">
<set>
<ref bean="prizes1"/>
<ref bean="prizes2"/>
</set>
</property>
</bean>
<bean id="prizes1" class="com.rolin.xml.entity.Prize">
<property name="prizeName" value="first"/>
</bean>
<bean id="prizes2" class="com.rolin.xml.entity.Prize">
<property name="prizeName" value="second"/>
</bean>
资料参考
尚硅谷