概述
企业开发中,表现层和持久层中可替换的技术有很多。而在业务层中,基本都是使用Spring。
- Spring 是轻量级的框架。
轻量级与重量级
1、轻量级是相对于重量级而言的。
轻量级一般就是非入侵性的、所依赖的东西、资源占用非常少、部署简单。
即较容易使用,而重量级正好相反。
2、相比传统的JavaEE项目。(即真正意义上的JavaEE规范,如EJB3.0,JPA,JMX,JMS,JNDI,JSF等)
我们把能直接在Tomcat等,符合Java Servlet规范的Web服务器上,能直接运行的Java应用称为轻量级的JavaEE应用。
一般就意味着以Spring为代表的一些事实上的标准开发框架。
可以说,Spring就是运行在Web服务器中的Application Server。
- Spring的优点
1、低侵入/低耦合(降低组件之间的耦合度,实现软件各层之间的解耦,)
2、声明式事务管理
3、方便集成其他框架
4、降低JavaEE开发难度
5.Spring框架中包括JavaEE 三层的每一层的解决方案 (一站式)
- Spring是一个容器
Spring是一个IoC/DI/AOP容器。容器就是可以装东西的东西。
Spring就是可以装对象的一个集合(容器)。
IoC:inverse of control,控制反转。简单来说,就是将对象的实例化工作交给容器来完成。
- 学习版本
spring-framework-4.0.0.RELEASE
spring-framework-3.0.5.RELEASE-dependencies
Spring的HelloWorld
IHello接口
public interface IHello {
void sayHello();
}
IHello接口的实现类Hello
public class Hello implements IHello{
public void sayHello(){
System.out.println("你好 师姐");
}
}
- 无Spring时的测试代码
public class HelloTest {
private IHello hello ;
public HelloTest(){
hello = new Hello();
}
@Test
public void test(){
hello.sayHello();
}
}
通常情况下,如果A类依赖于B类,则A类需要负责B类的实例化。
如此,便不能做到真正的解耦。
若通过容器完成对象的实例化,应用从容器中获取接口的实现对象,就可完全的实现接口编程。
- Spring HelloWorld
1、jar包
spring-beans-4.0.0.RELEASE.jar
lib/spring-core-4.0.0.RELEASE.jar
com.springsource.org.apache.commons.logging-1.1.1.jar(依赖包)
2、配置文件
文件名:application.xml或applicationContext.xml
配置文件结构:可查询spring-framework-reference.pdf(电子档P48,纸质P24)
<?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">
<bean id="hello" class="com.hanaii.hello.Hello">
</bean>
</beans>
3、测试代码
public class HelloTest {
private IHello hello ;
public HelloTest(){
// 资源文件
ClassPathResource resource = new ClassPathResource("applicationContext.xml");
// 传入资源文件,创建基于XML的BeanFactory容器
BeanFactory bf = new XmlBeanFactory(resource);
// 通过容器获得IHello接口的实现类实例
hello = bf.getBean("hello", Hello.class);
}
@Test
public void test(){
hello.sayHello();
}
}
通过容器获取对象的步骤:
a、创建资源文件(ClassPathResource)
b、创建BeanFactory容器对象。(基于XML,传入资源文件)
c、通过容器对象,根据bean对象的id和类型获取实例。
- 加载过程分析
1、Spring找到配置文件
2、加载配置文件
3、解析所有的<bean>元素,识别id和class属性
4、通过反射创建实例。Class.forName("className").newInstance();
5、id为key,实例为value。保存在BeanFactory容器中。
6、通过getBean方法获取实例。
- 总结
1、Spring的本质:将java代码转移到配置文件。
2、默认管理的bean,需要一个无参构造方法。
3、Spring配置的bean,是一个实例,不是类型。
public class HelloTest {
@Test
public void test(){
ClassPathResource resource = new ClassPathResource("applicationContext.xml");
BeanFactory bf = new XmlBeanFactory(resource);
Hello h1 = bf.getBean("hello", Hello.class);
Hello h2 = bf.getBean("hello", Hello.class);
System.out.println(h1 == h2); // 结果为true
}
}