基础架构
创建Java项目
由于我们这里只是单独测试Spring的某些功能,所以普通的Java项目即可了,不用创建web app之类的项目!
演示使用的是Intellij IDEA,也强烈建议您使用IDEA,当您熟悉后,相信您一定会爱上他的!
创建新的Java项目
选择项目位置:
新建lib目录:
lib目录与默认的src目录同级!
导入jar包
1、
我们需要导入4个Spring核心包:spring-beans-5.2.3.RELEASE.jar
、spring-context-5.2.3.RELEASE.jar
、spring-core-5.2.3.RELEASE.jar
、spring-expression-5.2.3.RELEASE.jar
以上4个jar包在“Spring包的下载”章节已经介绍过如何下载,请看此章节!
2、
除了spring的核心包,我们还需要一个Apache的日志包, Apache Commons Logging
Tips:
对于新手用户,我们严重不建议使用Maven管理依赖,应该从基础开始学习!
所以此时,lib目录下应该是:
选中,添加到库:
Tips:
对于Eclipse用户,请将其添加到Build Path!
建立配置
建立配置目录
在src同级下,新建conf
目录,并右键:
建立spring配置文件
在conf目录下,建立配置文件:spring-ioc.xml
以后关于类的管理,我们都在此文件里面配置给spring了!
Student 类
在src目录下,新建一个包(名:bean),包下新建一个类:
public class Student {
private String name;
private String sno;
public Student() {
}
public Student(String name, String sno) {
this.name = name;
this.sno = sno;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sno='" + sno + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
}
配置spring-ioc.xml
新增一个bean,管理Student类:
<!-- 注册一个Student类-->
<bean id="student01" class="com.misiai.bean.Student">
<!--class告诉容器bean注册的是类的全限定类名,需要根据自己的包名更改-->
<property name="name" value="kuan"/>
<property name="sno" value="10001"/>
<!--property为属性赋值-->
</bean>
新建test
新建test包
教程中的包的结构:
新建test包,然后创建Test01类。
添加Junit
如果我们直接在方法上添上@Test
注释,会报错!
这时候,光标移到错误上,按住Alt+Enter
,出现如上图的提示,然后到如classpath
然后我们的Lib下,多了一个包:
也不报红啦:
Tips:
这就是IDEA的强大之处,该Jar包是idea从Maven上帮我们下载的!
测试
/**
* Spring的基础测试
*/
@Test
public void test01() {
/*该类是属于:org.springframework.context包下的,代表IOC容器,*/
ApplicationContext ap = new ClassPathXmlApplicationContext("spring-ioc.xml");
/*spring-iox.xml是我们之前编写的配置文件*/
Student student01 = (Student) ap.getBean("student01");
/*student01是我们之前bean下定义的id*/
System.out.println(student01.getName());
}
结果:
测试成功!
几个问题
-
我们之前是把conf(spring-ioc.xml所在的目录)目录标记为Resource ROOT了,不然可能是报错的!
原因是我们在
ClassPathXmlApplicationContext("spring-ioc.xml");
是直接写的spring-ioc.xml的文件名,可没给他路径!!! -
commons-logging包是需要我们手动下载的,然后倒入Lib目录,再标记为类库!
-
Junit包是我们通过IDEA在Maven自动下载到lib目录的,我们也可以手动下载该Junit包,然后进行和2一样的步骤!
Junit是我们进行单元测试所需要的包,其实我们也可以直接在main方法里面测试。
几个细节
-
ApplicationContext:有两个实现类:
即:
FileSystemXmlApplicationContext
和ClassPathXmlApplicationContext
顾名思义,FileSystem是要给出配置文件的在文件系统下的路径,而ClassPath只需要给出类目录下的路径。
在上面的案例中,我们的
spring-ioc.xml
是在类路径的根下,所以我们只写了配置文件的文件名!这点可以在构建了的目录下,可以确定:
-
Student对象什么时候创建完毕?
我们知道,现在对象由Spring的容器帮我们创建,那么他什么时候创建完毕了的?
我们为Student的无参构造输出一句话:
public Student() { System.out.println("Student的无参构造!"); }
修改单元测试函数:
@Test public void test01() { /*该类是属于:org.springframework.context包下的,代表IOC容器,*/ ApplicationContext ap = new ClassPathXmlApplicationContext("spring-ioc.xml"); /*spring-iox.xml是我们之前编写的配置文件*/ System.out.println("在getBean之前输出这句话"); Student student01 = (Student) ap.getBean("student01"); /*student01是我们之前bean下定义的id*/ System.out.println("在student01.getName之前输出这句话"); System.out.println(student01.getName()); System.out.println(student01); }
结果:
结论:
在Spring的容器创建的时候,就创建了Student类!
-
单例还是多例
@Test public void test01() { /*该类是属于:org.springframework.context包下的,代表IOC容器,*/ ApplicationContext ap = new ClassPathXmlApplicationContext("spring-ioc.xml"); /*spring-iox.xml是我们之前编写的配置文件*/ // System.out.println("在getBean之前输出这句话"); Student st1 = (Student) ap.getBean("student01"); Student st2 = (Student) ap.getBean("student01"); System.out.println(st1 == st2); /*student01是我们之前bean下定义的id*/ // System.out.println("在student01.getName之前输出这句话"); // System.out.println(student01.getName()); // System.out.println(student01); }
结论:是单例的!
-
没有配置该类呢?
报错:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'student03' available
-
JavaBean的property属性名由什么决定?
由setter方法名决定(去掉set)
如果我修改为
setLame
:那么配置文件里面:
报红!!!
结束
好啦,第一个Spring个测试就结束啦!