Config: via XML
or Annotation
XML配置文件的每一个bean对应Annotation方式每一个java类,property name对应类字段,ref对应引用的其他类
XML配置和注解本质上相同,创建容器时用不同的应用上下文: ClassPathXmlApplicationContext
和AnnotationConfigApplicationContext
, 传递参数分别为: XML文件 和 类对象
XML
config.xml
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?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-4.0.xsd ">
<bean id="course" class="com.ssm.chap9.pojo.Course">
<property name="module" ref="module" />
</bean>
<bean id="module" class="com.ssm.chap9.pojo.Module">
<property name="assignment" ref="assignment" />
</bean>
<bean id="assignment" class="com.ssm.chap9.pojo.Assignment" />
</beans>
main
:1
2
3
4
5
6
7public class DemoCourse {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("config.xml");
Course course = ctx.getBean(Course.class);
course.getName();
}
}
Annotation
AppContextCourse.java
: 基于java配置和上面XML达到和上面XML相同的效果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppContextCourse {
@Bean
public Course course() {
Course course = new Course();
course.setModule("someModule");
return course;
}
@Bean
public Module module() {
Module module = new Module();
module.setAssignment("someAssignment");
return module;
}
@Bean
public Assignment assignment() {
return new Assignment();
}
}
main
:1
2
3
4
5
6
7public class DemoCourse {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppContextCourse.class);
Course course = ctx.getBean(Course.class);
course.getName();
}
}
突然的感悟
Spring IoC的本质:
实际上是用XML配置文件控制javaBean的生产,而不用改java代码; “不写java代码”这一点,对应不用new主动创建对象而是用配置文件配置对应被动地生成对象,就是“控制反转”说法的来历;相当于“即插即拔”
而实际上,用java代码注解配置更多:annotation; 但是本质没有变: 没有用”new”创建Bean对象,所以用XML或者注解并没有影响IoC的实现
VVV below: not important
3 classes:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38public class Assignment {
}
public class Module {
private String assignment;
public String getAssignment() {
return assignment;
}
public void setAssignment(String assignment) {
this.assignment = assignment;
}
}
public class Course {
private String module;
private String name; // course name
public String getModule() {
return module;
}
public void setModule(String module) {
this.module = module;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}