Spring基础知识导论

Spring基础知识导论

1.Spring是什么

Spring是一个开源的轻量级javase标准版本javaee企业版本开发应用框架,其目的是用于简化企业级应用程序开发。

应用程序是由一组相互协作的对象组成。而在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成。所以开发一个应用程序除了要开发业务逻辑之外,最多的是关注如何使用这些对象协作来完成所需功能,而且要低耦合、高内聚。业务逻辑开发是不可避免的,那如果有个框架出来帮我们来创建对象及管理这些对象之间的依赖关系。可能有人说了,比如抽象工厂、工厂方法设计模式不也可以帮我们创建对象,生成器模式帮我们处理对象间的依赖关系,不也能完成这些功能吗?可是这些又需要我们创建另一些工厂类、生成器类,我们又要额外管理这些类,增加了我们的负担,如果能有种通过配置方式来创建对象,管理对象之间依赖关系,我们不需要通过工厂和生成器来创建及管理对象之间的依赖关系,这样我们是不是减少了许多工作,加速了开发,能节省出很多时间来干其他事。Spring框架刚出来时主要就是来完成这个功能。

Spring框架除了帮我们管理对象及其依赖关系,还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,还能帮我们管理数据库事务,本身提供了一套简单的JDBC访问实现,提供与第三方数据访问框架集成Hibernate、JPA,与各种JavaEE技术整合如javaMail 任务调度等。提供一套自己的web层框架SpringMVC、而且还能非常简单的与第三方web框架集成。

2.Spring能帮我们做什么

一、Spring能帮我们根据配置文件创建及组装对象之间的依赖关系

传统程序开发,创建对象及组装对象间依赖关系由我们程序内部进行控制,这样会加大各个对象间的耦合,如果我们要修改对象间的依赖关系就必须修改源代码,重新编译、部署;而如果采用Spring,则由Spring根据配置文件来进行创建及组装对象间依赖关系,只需要改配置文件即可,无需重新编译。

二、Spring面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。

三、Spring能非常简单的帮我们管理数据库事务

四、Spring还提供了与第三方数据库访问框架无缝集成,而且自己也提供了一套jdbc访问模板

五、Spring还提供了与第三方Web框架无缝集成,而且自己也提供了一套SpringMVC

六、Spring能方便的与javaEE 整合,与更多技术整合。比如缓存框架。

3.为何需要Spirng

1.应用程序

2.框架

3.非侵入式设计

4.轻量级与重量级

5.POJO 简单的java对象

6.容器 :容器管理对象的生命周期

7. 控制反转 inversion of Control

8.Bean 一般指容器管理对象,在Spring中指Spring IoC容器管理对象

二、为什么需要Spring

非常轻量级的容器

AOP

简单的数据库事务管理

JDBC抽象及ORM框架支持

灵活的web层支持

简化各种技术集成

Spring基础

核心容器:

Core

Beans

Context

EL

AOP、Aspects 模块

AOP

Aspects

数据访问、集成模块

事务模块

JDBC模块

ORM模块

OXM模块

JMS模块:用于JMS java messageing service  提供一套,消息生产者、消息消费者模板用于更加简单的使用JMS,JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

Web、Remoting模块

web模块

web-servlet模块

web-strits模块

test模块

2.典型应用场景

典型web应用程序应用场景

远程访问应用场景

EJB应用场景

二、Ioc

Ioc基础

Ioc是什么 Inversion of Control 即 控制反转,不是什么技术,而是一种设计思想。
DI 依赖注入

IOC容器基本原理

IOC容器的概念

IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序的对象及建立这些对象的依赖。
在Spring中BeanFactory是Ioc容器的实际代表者

SpringIoc容器如何知道哪些是它管理的对象呢?这就需要配置文件。

Bean的概念

由Ioc容器管理的那些组成应用程序的对象我们就叫它Bean

Bean是由Spring容器初始化、装配及管理的对象。

一个简单的例子

第一步:搭建Spring开发环境,导入必要jar包

第二步:编写一个HelloI接口

package com.lizhenhua.test;

public interface HelloI {
    public void sayHello();
}

第三步:编写实现该接口的实现类,HelloImpl

package com.lizhenhua.test;

public class HelloImpl implements HelloI {

    @Override
    public void sayHello() {
        System.out.println("你好,世界");
    }

}

第四步:在配置文件中进行配置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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <!-- id表示组件的名字,class表示组件的实现类 -->
    <bean id="hello" class="com.lizhenhua.test.HelloImpl"></bean>
</beans>

第五步:测试HelloTest

package com.lizhenhua.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class HelloTest {
    @Test
    public void testHelloWorld(){
        //1.读取配置文件实例化一个Ioc容器 
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.从容器中获取Bean,注意此处完全面向接口编程,而不是面向实现
        HelloI helloI = context.getBean("hello", HelloI.class);
        //3.执行业务逻辑
        helloI.sayHello();
    }
}

详解IOC容器

Spring IOC容器代表就是org.springframework.beans.BeanFactory接口BeanFactory接口提供了ioc容器最基本功能,而org.springframework.context.AplicationContext接口扩展了BeanFactory提供了与Spring AOP集成、国际化处理、事件传播及提供不同层次的context实现。

容器实现一览:

XmlBeanFactory:BeanFactory实现,提供基本的Ioc容器功能,可以从classpath或文件系统等获取资源

(1)从文件系统获取资源
        //从文件系统获取资源
        File file = new File("fileSystemConfig.xml");
        Resource resource =  new FileSystemResource(file);
        BeanFactory beanFactory = new XmlBeanFactory(resource);
(2)从classpath获取资源
//从classpath获取资源
        Resource resource2 = new ClassPathResource("classpath.xml");
        BeanFactory beanFactory2 = new XmlBeanFactory(resource2);

ClassPathXmlApplicationContext:ApplicationContext实现,从classpath获取配置文件

    //从classpaht获取资源
    BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath.xml");

FileSystemXmlApplicationContext:ApplicationContext实现,从文件系统获取配置文件

//从文件系统获取资源
    BeanFactory beanFactory = new FileSystemXmlApplicationContext("fileSystem.xml");

ApplicationContext接口获取Bean方法简介

Object getBean(String name)根据名称返回一个Bean,客户端需要自己进行类型转换

T getBean(String name,Class<T> requiredType) 根据名称和指定的类型返回一个Bean,客户端无需自己进行类型转换,如果类型转换失败,容器抛出异常
T getBean(Class<T> requiredType)根据指定的类型返回一个Bean,客户端无需自己进行类型转换,如果没哟偶或多于一个Bean存在容器将抛出异常

Map<String ,T> getBeansOfType(Class<T> type) 根据指定的类型返回一个键值为名字和值为Bean对象的map,如果没有Bean对象存在则返回空的Map

IOC容器如何工作?

一、准备配置文件:就向前边的helloworld配置文件一样,在配置文件中声明Bean定义也就是配置元数据。 (由我们开发人员配置)

二、有IOC容器进行解析元数据 :Ioc容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,Ioc容器根据BeanDefinition进行实例化、配置及组装Bean (不需要开发人员编写,由IOC容器自动执行)

三、实例化ioc容器:由客户端实例化容器,获取需要的Bean (由开发人员编写)

小结

除了测试程序的代码外,也就是程序的入口,所有代码都没有出现Spring任何组件,而且所有我们写的代码没有实现框架拥有的接口,因而能非常容易的替换掉Spring,是不是非入侵

客户端代码完全面向接口编程,无需知道实现类,可以通过修改配置文件来更换接口实现,客户端代码不需要任何修改。是不是低耦合。

如果在开发初期没有真正的实现,我们可以模拟一个实现来测试,不耦合代码,是不是很方便测试。

Bean之间几乎没有依赖关系,是不是很容易重用

你可能感兴趣的:(java,spring,应用,企业级,ee)