Spring开源框架
Spring在英语中含义是春天,对于Java EE开发者来说,Spring框架出现确实带来了一股全新的春天的气息。早在2002年,Rod Johson在其编著的《Expert one to one J2EE design and development》书中,对Java EE框架臃肿、低效、脱离现实的种种现状提出了很多质疑,并积极寻求探索革新之道。由他主导编写了interface21框架,从实际需求出发,着眼于轻便、灵巧,易于开发、测试和部署的轻量级开发框架。以interface21框架为基础,并集成了其它许多开源成果,于2004年3月24日,发布了1.0正式版取名为Spring。
1、核心容器(Core)
这是Spring框架最基础的部分,它提供了依赖注入(Dependency Injection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。BeanFactory是工厂模式的一个实现,它使用IoC将应用配置和依赖说明从实际的应用代码中分离出来。
2、AOP模块
AOP即面向切面编程技术,Spring在它的AOP模块中提供了对面向切面编程的丰富支持。AOP允许通过分离应用的业务逻辑与系统级服务(例如安全和事务管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。
3、对象/关系映射集成模块ORM
Hibernate是成熟的ORM产品,Spring并没有自己实现ORM框架而是集成了几个流行的ORM产品如Hibernate、JDO和iBATIS等。可以利用Spring对这些模块提供事务支持等。
4、JDBC抽象和DAO模块
Spring虽然集成了几个ORM产品,但也可以不选择这几款产品,因为Spring提供了JDBC和DAO模块。该模块对现有的JDBC技术进行了优化。你可以保持你的数据库访问代码干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。
5、Spring的Web模块
Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。
6、应用上下文(Context)模块
核心模块的BeanFactory使Spring成为一个容器,而上下文模块使它成为一个框架。Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。该模块还提供了一些面向服务支持这个模块扩展了BeanFactory的概念,增加了对国际化(I18N)消息、事件传播以及验证的支持。
另外,这个模块还提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括对模版框架例如Velocity和FreeMarker集成的支持。
7、Spring的MVC框架
Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts2,但Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。
Spring5.x入门Java项目示例
准备jar包
下载地址选择相应的版本。搭建Spring框架需要最基本的5个包:
* Appache的 commons-logging-1.2.jar
* Spring的 spring-beans-5.0.1.RELEASE.jar
* spring-context-5.0.1.RELEASE.jar
* spring-core-5.0.1.RELEASE.jar
* spring-expression-5.0.1.RELEASE.jar
需要xml文件
推荐存放位置:classpath,推荐文件名:applicationContext.xml。Spring,IoC容器的核心配置文件。
<?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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 默认Bean是单例 ,即 scope="singleton" -->
<bean id="u1" class="cn.hncu.ioc.v1.User" >
<property name="name" value="Jack"></property>
</bean>
</beans>
需要一个bean
package cn.hncu.ioc.v1;
public class User {
private String name;
public User() {
System.out.println("调用了空参构造...");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [name=" + name + "]";
}
}
技术入口:
使用org.springframework.context.support.ClassPathXmlApplicationContext类进行加载classpath下的xml文件,进行初始化Application上下文容器。
package cn.hncu.ioc.v1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/* 搭建Spring5.0框架最基本需要:
* 1) 5个jar包:
* Appache的 commons-logging-1.2.jar
* Spring的 spring-beans-5.0.1.RELEASE.jar
* spring-context-5.0.1.RELEASE.jar
* spring-core-5.0.1.RELEASE.jar
* spring-expression-5.0.1.RELEASE.jar
*
* 2) 需要一个xml文件:
* 推荐文件名:'applicationContext.xml'
* 推荐存放路径:ClassPath下
*
* 3) 技术入口:ApplicationContext类
* 通过其子类 ClassPathXmlApplicationContext 进行读取xml文件从而加载容器
*/
public class Hello {
public static void main(String[] args) {
//1 加载容器
ApplicationContext appCtx = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过 观察控制台输出 可以 发现,默认的Bean 是容器一加载 就new出来的。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//2 从容器中拿出一个Bean
User user = appCtx.getBean( User.class );
System.out.println( user.hashCode() );
//观察控制台可以发现 三个User类对象的hashCode是一样的,所以:默认的Bean是单例。
User user2 = appCtx.getBean( User.class );
System.out.println( user2.hashCode() );
User user3 = appCtx.getBean( User.class );
System.out.println( user3.hashCode() );
((AbstractApplicationContext) appCtx).close();//关流,以防内存泄漏
}
}