什么是spring?(由Rod Johnson创建的一个开源框架)
EJB: EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序。简单来说就是把已经编写好的程序(即:类)打包放在服务器上执行。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。在EJB3.0推出以后,实体Bean被单独分了出来,形成了新的规范JPA。
创建spring的主要目的是用来替代更加重量级的企业级Java技术(如EJB等),相对于EJB来说,spring提供了更加轻量级和简单的编程模型。它强了简单老式Java对象(Plain Old Java object, POJO)的功能,使其具备了之前只有EJB和其他企业级Java规范才具有的功能。
spring的核心
1.1spring的目的是简化Java开发
spring的四种简化Java开发的策略:
1、基于POJO的轻量级和最小侵入性编程;(程序员面向POJO 编程)
2、通过依赖注入和面向接口实现松耦合;(降低代码复杂性、降低耦合度)
3、基于切面和管理进行声明式编程;(比如需要使用xml方式或Java方式配置spring)
4、通过切面和模板代码减少样板式代码;(比如 jdbctemplete封装访问数据库的固定样式代码)
1.1.1激发POJO 的潜能(使得原本的Java普通类变得不只是简单的类,它还可以有其他用处)
通过框架学习我们发现很多框架通过强迫应用继承或实现他们的一个类或接口从而使得框架和应用绑定,这样使得框架和应用的耦合度较高,(比如应用需要换另一个框架实现时,在代码层面上就得做修改)。spring则立志于避免自身框架的API与应用的耦合度较高问题。spring不会强迫应用继承或实现spring的类或接口,相反,在基于spring构建的应用中,在其代码层面(类)没有任何痕迹表明我使用了spring,最坏的场景即使用注解。
1.1.2依赖注入(DI)
创建应用组件之间的写作的行为通常称为装配。spring有多种装配bean的方式,如xml方式、Java方式。(这里即是我们程序中使用的配置文件,用配置文件来表述Javabean之间的依赖关系)。
1.1.3应用切面(AOP)
DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(aspect-oriented programming,AOP)允许你把遍布应用各处的功能分离出来重新组成可重用的组件。面向切面编程中,系统由许多不同的组件组成,每一个组件各负责一个特定功能,这些组件除了实现自身的功能外,还经常承担着额外的职责,如日志、事务管理、安全等服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常称为横切关注点,因为他们会跨越系统的多个组件。
如果将这些关注点分散到多个组件中去,你的代码将会带来双重的复杂性。
a、实现系统关注点功能的代码将会重复出现在多个组件中;
b、组件会因为那些与自身核心业务无关的代码而变得混乱;
如下图所示,展示了这种实现方式的复杂性:
分析:各模块本来只需要关注自己的核心功能即可,现在几乎每个模块都需要关注日志、安全、事务等功能的实现,代码的运行效率必然是极低的。
AOP能够使这些服务模块化,并以声明的方式将他们应用到他们需要影响的组件中。所造成的结果就是这些组件会具有更高的内聚性并且会更加专注于自身的业务,完全不需要了解设计系统服务所带来的复杂性。如下图所示,我们可以把切面想象为覆盖在很多组件之上的一个外壳。应用由各模块组成。借助AOP,可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活的应用到系统中,你的核心应用甚至根本不知道他们的存在。这是一个非常强大的理念,可以将安全、事务、日志关注点与核心业务逻辑分离。
1.2容纳应用的bean
容器:容器是spring框架的核心。spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。
spring的两个容器:BeanFactory、ApplicationContext
1.2.1使用应用上下文
AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载spring应用上下文。
AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载spring Web应用上下文。
XmlWebApplicationContext:从Web应用下的一个或多个xml配置文件中加载spring应用上下文。