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负责管理这些对象的创建的、销毁的,以及对象的属性注入,对象的之间的依赖关系!!!

  • 相关阅读:
    二维数组实现八皇后问题
    解决Java接口内部类的main()方法无法打印输出的问题
    hbase shell 常见命令
    hbase-0.94 Java API
    JavaMail简单版实验测试
    经典KMP算法C++与Java实现代码
    Hadoop之倒排索引
    哈希哈希
    Servlet和JSP学习指导与实践(三):JSP助阵
    Servlet和JSP学习指导与实践(二):Session追踪
  • 原文地址:https://www.cnblogs.com/linbin7/p/14177996.html
Copyright © 2011-2022 走看看