zoukankan      html  css  js  c++  java
  • Spring框架介绍

    ###1.Spring简介 ####1.1 Spring介绍 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。 Spring是一个非常活跃的开源框架, 基于IOC和AOP来构架多层JavaEE系统,以帮助分离项目组件之间的依赖关系。它的主要目地是简化企业开发。 简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。 高内聚低耦合!!!

    Spring春天、泉水! JAVAEE的春天来了! ####1.2 Spring起源 Rod Johnson在2002年编著的《Expert one on one J2EE design and development》一书中,对Java EE 系统框架臃肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新Spring Logo之道。以此书为指导思想,他编写了interface21框架,这是一个力图冲破J2EE传统开发的困境,从实际需求出发,着眼于轻便、灵巧,易于开发、测试和部署的轻量级开发框架。Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版。同年他又推出了一部堪称经典的力作《Expert one-on-one J2EE Development without EJB》,该书在Java世界掀起了轩然大波,不断改变着Java开发者程序设计和开发的思考方式。在该书中,作者根据自己多年丰富的实践经验,对EJB的各种笨重臃肿的结构进行了逐一的分析和否定,并分别以简洁实用的方式替换之。至此一战功成,Rod Johnson成为一个改变Java世界的大师级人物。 ####1.3 Spring作用 -IOC思想 方便解耦,简化开发:Spring 就是一个大工厂,可以将所有对象创建和依赖关系维护,交给 Spring容器管理!

    -AOP 编程(面向切面编程)的支持:Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能!

    -声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程 SSM SSS SSH

    -方便程序的测试:Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序 Spring-test :Spring的测试模块!

    方便集成各种优秀框架:Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz(定时任务)等)的直接支持 Spring框架可以无缝整合其他的框架:MyBatis、Hibernate、Redis、Activiti、SpringMVC、SpringDATA。。。

    只要是框架,那么Spring就可以管理!

    降低 JavaEE API 的使用难度:Spring对 JavaEE 开发中非常难用的API(JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低

    ####1.4 Spring的组成

    Spring框架包含的功能大约由20个模块组成。这些模块按组可分为核心容器、数据访问/集成,Web,AOP(面向切面编程)、设备、消息和测试

    #####1.4.1 core - 核心模块

    • spring-core:依赖注入IoC与DI的最基本实现
    • spring-beans:Bean工厂与bean的装配
    • spring-context:spring的context上下文即IoC容器
    • spring-context-support
    • spring-expression:spring表达式语言

    ###2.Spring之IOC 依赖注入或控制反转的定义中,调用者不负责被调用者的实例创建工作,该工作由Spring框架中的容器来负责,它通过开发者的配置来判断实例类型,创建后再注入调用者。由于Spring容器负责被调用者实例,实例创建后又负责将该实例注入调用者,因此称为依赖注入。而被调用者的实例创建工作不再由调用者来创建而是由Spring来创建,控制权由应用代码转移到了外部容器,控制权发生了反转,因此称为控制反转.

    ####2.1 IOC-控制反转 IOC-Inversion of Control,即控制反转。它不是什么技术,而是一种设计思想。

    传统的创建对象的方法是直接通过 new 关键字,而 spring 则是通过 IOC 容器来创建对象,也就是说我们将创建对象的控制权交给了 IOC 容器。我们可以用一句话来概括 IOC: IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建、初始化、销毁等工作交给spring容器来做。

    IOC概念:程序中开发者不需要人工的创建对象,而是把创建的对象权利或者工作转交给Spring容器(IOC容器),让Spring容器去创建并管理这些对象,以达到程序的高度解耦的目的!

    ####2.2 DI-依赖注入 Dependency Injection,说的是创建对象实例时,同时为这个对象注入它所依赖的属性。相当于把每个bean与bean之间的关系交给容器管理。而这个容器就是spring。 例如我们通常在 Service 层注入它所依赖的 Dao 层的实例;在 Controller层注入 Service层的实例。 DI 给对象属性赋值的过程叫做依赖注入!

    ####2.3对IoC与DI浅显易懂的理解 IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、微信号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。

    那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

    ####2.5 IOC使用 创建web项目 项目名: spring-01-IOC 引入jar包 如果练习IOC ,需要引入 org.springframework.beans , org.springframework.context jar包位置! Spring下载文件中/libs文件下!: beans,context,core,context-support,spring-expression. Maven项目,pom.xml添加一下内容: Pom.xml ` org.springframework spring-context 4.3.7.RELEASE org.springframework spring-core 4.3.7.RELEASE

    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-beans</artifactId>
    		<version>4.3.7.RELEASE</version>
    	</dependency>
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-context-support</artifactId>
    		<version>4.3.7.RELEASE</version>
    	</dependency>
    
    	<dependency>
    		<groupId>org.springframework</groupId>
    		<artifactId>spring-expression</artifactId>
    		<version>4.3.7.RELEASE</version>
    	</dependency>
    
    
    	<dependency>
    		<groupId>log4j</groupId>
    		<artifactId>log4j</artifactId>
    		<version>1.2.14</version>
    	</dependency>
    
    </dependencies>`
    

    引入log4j.properties 文件位置:src目录下 maven项目:resources目录下 `

    log4J日志框架的配置文件 文件名字不能改

    DEBUG 表示日志的级别 调试

    Console 日志打印在控制台

    log4j.rootLogger=INFO, Console log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

    哪些日志需要打印

    log4j.logger.java.sql.ResultSet=INFO
    log4j.logger.org.apache=INFO
    log4j.logger.java.sql.Connection=DEBUG
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG `

    创建一个操作类

    `public class Person {

    private String name;
    private Integer age;
    
    public Person() {
    	System.out.println("------------> Person.Person");
    }
    

    public String getName() { return name; }

    public void setName(String name) {
    	this.name = name;
    }
    
    public Integer getAge() {
    	return age;
    }
    
    public void setAge(Integer age) {
    	this.age = age;
    }
    

    } 创建配置文件 建议命名: applicationContext.xml 建议位置: 普通项目src下 / maven项目 resources下

    <!-- id 和 name 可以同时存在,作为bean的标识 class添加的应该是class的全路径 -->
    <bean id="personId" name="personName" class="com.lin.bean.Person" />
    
    ` 测试用例 ` public class TestSpring {
    @Test
    public void test1() {
    	ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    	// getBean 可以使用配置文件中的id值,也可以使用配置文件的name值.
    	Person person = (Person) applicationContext.getBean("personId");
    	System.out.println("person = " + person);
    }
      }
    

    ` ###3. 配置文件详解 准备工作: 创建配置文件:
    applicationContext-bean.xml 创建测试代码: BeanTest.java ####3.1 bean标签和属性 bean标签 ** bean标签,是根标签beans内部必须包含的标签,它是用于声明具体的类的对象! **

    bean标签对应属性

    ####3.2 bean标签使用 name属性 name不能重复!Name可以指定多个,逗号隔开! 可以使用特殊字符. 也可以根据name属性获取一个对象!

    id属性 id属性作用和name几乎相同,但是也有细微的差别,id不可重复,且不能使用特殊字符

    Java代码

    scope属性(作用域) bean标签中添加scope属性,设置bean对应对象生成规则. singleton scope = "singleton" 默认值,Spring容器默认创建的对象是单例! 单例,默认值,适用于实际开发中的绝大部分情况. 配置:

    测试:

    prototype scope="prototype" 创建的对象是多例(每次使用对象的时候额外创建一个新的) 多例,适用于struts2、SpringMvc中的action配置 配置:

    测试

    scope="request" 表示在一次请求范围内,Spring容器中的对象保持一个,公用同一个! scope="session" 表示在一次会话范围内,Spring容器中的对象保持一个,公用同一个!

    lazy-init属性 注意: 只对单例有效,设置scope="singleton"时测试 延时创建属性.

    lazy-init="default" 默认值,不延迟创建,即在框架启动时候就立即创建对象. lazy-init="false" 默认值,不延迟创建,即在框架启动时候就立即创建对象.

    lazy-init="true" 延迟初始化,在用到对象的时候才会创建对象.

    配置:

    测试1: lazy-init="false" Spring容器启动的时候立即创建对象!

    测试2:lazy-init="true" 使用这个对象的时候才创建对象!

    初始化/销毁 在TestBean类中添加初始化方法和销毁方法(名称自定义):

    Spring是一个对象的容器。Spring负责管理这些对象的创建的、销毁的,以及对象的属性注入,对象的之间的依赖关系!!!

  • 相关阅读:
    FEniCS 1.1.0 发布,计算算术模型
    Piwik 1.10 发布,增加社交网站统计
    淘宝褚霸谈做技术的心态
    CyanogenMod 10.1 M1 发布
    Druid 发布 0.2.11 版本,数据库连接池
    GNU Gatekeeper 3.2 发布
    Phalcon 0.9.0 BETA版本发布,新增大量功能
    EUGene 2.6.1 发布,UML 模型操作工具
    CVSps 3.10 发布,CVS 资料库更改收集
    Opera 移动版将采用 WebKit 引擎
  • 原文地址:https://www.cnblogs.com/linbin7/p/14177996.html
Copyright © 2011-2022 走看看