Java程序员之Spring(一) 入门

时间:2023-03-08 21:07:44
Java程序员之Spring(一) 入门

一. Spring 原理讲解 

  Spring 是一个轻量容器框架(开源);Spring的核心是 IoC(控制反转) 和 AOP(面向切面编程);

  Spring 由7个模块组成:

  • Spring Core(核心容器):核心容器提供 Spring 框架的基本功能;
  • Spring Context(Spring 上下文):Spring 上下文是一个配置文件,向 Spring框架提供上下文信息;
  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中;
  • Spring DAO:JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息;
  • Spring ORM:Spring 框架插入了若干个ORM框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map;
  • Spring Web:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文;
  • Spring MVC框架:MVC框架是一个全功能的构建 Web应用程序的 MVC 实现;  

  √ 什么是框架?

  • 解释一:制定一套规范或者规则(思想),大家(程序员)在该规范或者规则(思想)下工作;
  • 解释二:一些牛人前辈或对牛人前辈的总结而出的一套解决方案;  

二. Spring IoC (控制反转) 

  控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。

  设计原理:把耦合从代码中移出去,放在同一的 XML 文件中,通过一个容器在需要的时候把这个依赖关系实现,及把需要的接口实现注入到需要它的类中。

  IoC 中最基本的 Java 技术就是"反射"编程,反射编程方式相对于正常的编程方式要慢十几倍,通过 SUN 改良之后反射方式生成的对象和普通方式生成的对象相差不大了(依然有一倍以上的差距);

  控制反转一般分为两种类型

  • 依赖注入(Dependency Injection,简称DI): 组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection);
  • 依赖查找(Dependency Lookup): 容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源.

  

三. Spring AOP (面向切面变成)    

  AOP 是 Aspect Oriented Programming的缩写;AOP同OOP都是一种编程思想,且AOP 实际上是OOP的一种延续,我们用类比法进行理解:

  AOP 同 OOP 的关联:1. 都是编程思想;

  AOP 同 OOP 的区别:1. OOP关注的是纵向业务,而AOP关注的是横向业务;

             2. 从业务角度来说,OOP 是对实体业务属性和行为进行抽象封装,AOP面对的是在处理过程中的某个步骤或阶段;

  Java程序员之Spring(一) 入门

  说明:

  上图中将国内商务部、国际商务部和广告制作部归并(抽象)到商务部,以及将开发部、测试部、设计部归并(抽象)到技术部是用到了OOP 的编程思想;

  国际商务部、国内商务部和开发部都有访问客户的业务,广告制作部和设计部,此时用抽象无法形象体现出来(同一类中的其他部门没有对应的业务),这里就可以使用AOP 编程思想;

四. Spring 模块说明

  Java程序员之Spring(一) 入门

  Spring 框架是一个分层架构,由7个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 Bean 的方式;组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。

  Bean的概念:由 IoC 容器管理的那些组成你应用程序的对象;Bean 是 Spring 管理的基本单位,在基于Spring 的 Java EE 应用中,所有的组件都被当成Bean 处理(包括数据源、Hibernate的SessionFactory、事物管理器等)。Bean 就是由 Spring 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中其他对象没有什么区别了。  

1. Spring Core (核心容器):

  概念理解:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用 IoC 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

  实际应用:Spring 有两个核心接口(BeanFactory 和 ApplicationContext),其中ApplicationContext 是BeanFactory 的子接口。他们都可代表 Spring 容器,Spring 容器是生成 Bean 实例的工厂,并且管理容器中的 Bean。  

  • 1.  定义接口
 public interface HelloService {
public void sayHello();
  • 2.  定义接口实现类
 public class HelloServiceImpl implements HelloService{
public void sayHello(){
System.out.println("Hello World!");
}
}
  • 3.  在配置文件(helloworld.xml)中注册Bean信息
 <?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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- id 表示组件的名字,class表示组件类 -->
<bean id="helloService" class="com.ljq.test.HelloServiceImpl" /> </beans>
  • 4. 应用
 public class HelloServiceTest {
@Test
public void testHelloWorld() {
// 1、读取配置文件实例化一个IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");
// 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
HelloService helloService = context.getBean("helloService", HelloService.class);
// 3、执行业务逻辑
helloService.sayHello();
}
}

  说明:上诉 1-4 即为一个Spring Bean 的实际应用;其实就是如下4个步骤

  • 定义服务层代码
  • 在配置文件中进行声明
  • 读取配置文件实例化一个 IOC 容器(这里有复杂的源码,另作分析)
  • 从容器中获取Bean
  • 执行业务逻辑

  

  ApplicationContext经常用到的三个实现:

  • 1.ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息。把上下文定义文件当成类路径资源。
  • 2.FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文定义信息。
  • 3.XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息。

2. Spring Context (Spring 上下文):

  Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。

  在spring使用过程中,通常的做法是让服务器启动时即实例化所有的bean,这样做在一定程度上提高了web应用的速度。
  要配置在服务器启动加载applicationcontext通常有两种方法:

  • ContextLoaderListener 具体配置是在web.xml中增加:
 <listener>
  <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
  • ContextLoaderServlet 具体配置是在web.xml中增加:
 <servlet>
  <servlet-name>context</servlet-name>
  <servlet-class>
    org.springframework.web.context.ContextLoaderServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

  无论通过上面的哪一种配置都可以达到服务器启动即实例化bean的目的,如果要想指定applicationContext.xml的位置可以在增加:

 <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/appContext.xml</param-value>
</context-param>

  通过以上配置就可以达到在服务器启动时实例化指定的applicationContext.xml配置文件了。

3. Spring AOP

  通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中

 4. Spring DAO

  JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

 5. Spring ORM
  Spring 框架插入了若干个ORM框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
 6. Spring Web 模块
  Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
 7. Spring MVC 框架
  MVC框架是一个全功能的构建 Web应用程序的 MVC 实现。通过策略接口,MVC框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。模型由javabean构成,存放于Map;视图是一个接口,负责显示模型;控制器表示逻辑代码,是Controller的实现。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE 环境(Web 或EJB)、独立应用程序、测试环境之间重用。

 说明:针对1-7的详细应用在接下来的章节中结合实例进行讲解