在最近面试的单位好像使用Spring的比较多,我还是在入职之前先再次的回顾一下Spring这个框架的相关原理以及使用方法。
照例我们还是以应用为驱动,先了解我们该怎么应用这个Spring来完成我们的功能。
Spring对于我们来说基本上是控制反转和依赖注入用的比较多,所以我们这里我们先从这个控制反转进行最基础的学习。
所以我们就新建一个项目导入spring的相关JAR包
关于这些jar包我只是将spring-framework下载下来的文件夹中的lib一下的jar包都做了导入即可。
然后我们创建一个新的Test类以及相关JUNITjar包的导入。
之后我们需要在src文件夹下面创建一个spring-config.xml的文件,具体的内容可以从spring下载的时候的或者是网上下一个,我们只需要保留最基础的beans的节点即可,然后可以直接删除中间包含的部分,再用我们自己写的替代。
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<bean id = "firstBean" class = "test.bean.FirstBean"></bean>
</beans>
然后我们来看我们创建的两个测试类
package test.bean;
public class FirstBean {
public void test(){
System.out.println("zhengfang.sun test");
}
}
以及我们的测试入口类
package test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import test.bean.FirstBean;
public class SpringTest {
@Test
public void test001(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-config.xml");
FirstBean firstBean = (FirstBean)ctx.getBean("firstBean");
firstBean.test();
}
}
我们运行测试入口类可以获得如下的结果,zhengfang.sun test
有了一个实例然后我们再反过来讲讲我们测试类的原理,其实我们通过查看这个测试本身有三个文件。两个java文件以及一个xml文件,其中我们在SpringTest中通过java代码读取我们的spring配置文件然后我们再根据我们的“firstBean”的beanId通过我们的配置文件获取到了一个FirstBean的实例。
接下来我们就要考虑一个问题了,就是我们获取的这个FirstBean是不是一个单例,这个是个比较严肃的问题,因为在我们的应用中这个特点决定了我们对于这个方式获取Bean实例的使用方法,测试的方法也比较简单,我们只要通过多次获取查看是不是同一个引用即可。
@Test
public void test002(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-config.xml");
FirstBean firstBean = (FirstBean)ctx.getBean("firstBean");
FirstBean firstBean1 = (FirstBean)ctx.getBean("firstBean");
System.out.println(" firstBean1 == firstBean = "+(firstBean == firstBean1));
}
然后我们发现输出的结果如下情况:
firstBean1 == firstBean = true
显而易见的我们其实在这里获取的是同一个Bean,在获知了这个信息的基础下我们可以判断到这个Bean的创建时间是在我们第一次请求获取这个Bean的时间或者之前,我们通过稍微修改我们的test002然后我们再Debug一下我们可以清晰的发现我们这个Bean的创建是在xml读取完成之后。
package test.bean;
public class FirstBean {
{
System.out.println("Bean created");
}
public void test(){
System.out.println("zhengfang.sun test");
}
}
也就是说我们这个测试的基本过程为如下情况
1,通过spring读取配置文件创建单例Bean
2,我们通过spring以及我们配置在配置文件中的BeanId获取我们需要的Bean实例
3,调用bean实例的方法