12月2号的学习内容

一、Spring出现的历史背景

1.1为什么会有Spring?

Spring未问世之前,是EJB时代,EJB是什么,笔者未经历过,简而言之是一个重量级框
架。Rod Johnson在2002年编著的《Expert one on one J2EE design and
development》一书中批判了那个时候Java EE 系统框架,说其臃肿、低效、脱离现
实,同年推出了《Expert one-on-one J2EE Development without EJB》,对
EJB的各种笨重臃肿的结构进行了逐一的分析和否定,并分别以简洁实用的方式替换之,堪
称经典。
2003年起,由《Expert one on one J2EE design and development》中阐述的
部分理念和原型衍生而来的一个轻量级Java开发框架–Spring便兴起;其目的就是为了简
化JavaEE的企业级应用开发,由此经过多次版本更迭。

1.2Spring发展简史

第一阶段:XML配置
在Spring1.x时代,都是使用XML配置Bean,随着项目扩大,我们把XML文件切分成多个
配置文件,那时候需要频繁地在开发类和配置文件之间切换
第二阶段:注解配置
在Spring2.x时代,随着JDK1.5带来的注解支持,Spring提供了声明Bean的注解(如
@Service等),大大减少了配置量。这时Spring圈子里存在一种争论:注解配置和XML
配置究竟哪个更好?我们最终的选择是应用的基本配置用XML,业务配置用注解。
第三阶段:Java配置
从Spring3.x开始,Spring提供了JAVA配置的能力。Spring4.x和Spring Boot都推
荐使用JAVA配置。使用JAVA配置可以让你更理解你所配置的Bean

二、spring的概述

Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IOC(Inverse Of
Control:控制反转)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提
供了显示层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业
级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多
的 Java EE 企业应用开源框架。

三、spring的优势

方便解耦,简化开发
通过 Spring 提供的 IOC 容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
AOP编程的支持
通过 Spring 的 AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松应付。
声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。
方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
方便集成各种优秀框架
Spring 可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
降低JavaEE API的使用难度
Spring 对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的使用难度大为降低。
Java源码是经典学习范例
Spring 的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对 Java 设计模式灵活运用以及对 Java 技术的高深造诣。它的源代码无意是 Java 技术的最佳实践的范例。

四、IOC控制反转和DI依赖注入

简单来说,就是将原来由我们实例化的对象,交由spring框架来进行实例化.这是对象的实例化的权利就会反转.
IOC 的思想是:用框架的方式替代耦合度高的 new 构造方法()的形式创建对象这样可以在需要的时候去创建,不需要的时候销毁, 统一管理, 节约资源, 提高效率。
DI 的思想是:Spring框架替我们完成属性赋值的操作。

五、Spring之IOC

5.1什么是IOC?

IOC:称之为控制反转。将对象的创建(单例多例、懒加载非懒加载)、初始化、销毁、属性、赋值等一系列生命周期的过程交给Spring容器来管理。

5.2名词解释

1、ClassPathXmlApplicationContext:它是从类的根路径下加载配置文件
2、bean 标签:
作用:用于配置对象让 spring 来创建的。
默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。

5.3创建Spring的步骤

1.引入坐标

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.3.RELEASE</version>
    </dependency>

2.创建spring的核心文件:applicationContext.xml
3.创建bean标签
4.加载applicationContext.xml核心文件

5.4spring中单例与多例

<!--
	bean标签:将指定类对象的创建过程交给Spring容器来管理
	class属性:指定类的具体路径
	id属性:为bean标签去唯一标识符
	scope属性:指定Spring创建对象时的方式,singleton单例、prototype多例,默认为单例
-->
<bean id="smallDog" class="cn.java.iocl.Dog" scope="prototype"></bean>

5.5spring中懒加载与非懒加载

非懒加载(勤加载,Spring的默认):启动Spring容器时,不管是否使用对象,立马创建
所有对象。
懒加载:等用的时候,再让Spring容器去创建
优缺点:
(1) 、懒加载更加节省内存空间,非懒加载更加消耗内存空间。
(2) 、非懒加载提前发现错误,懒加载会隐蔽错误。

六、spring之DI

定义:依赖注入。给对象的属性赋值


<!--主要有两种方式
	1.通过set方法
-->
<!--admin-->
  <bean id="admin" class="cn.kgc.domain.Admin"></bean>
  <!--通过管理setXXX属性的方式-->
  <bean id="db" class="cn.kgc.domain.DB">
    <!--DI:依赖注入-->
    <!--
    property标签:表示注入的属性
    name:表示实体中的属性名
    value :表示给实体中的属性注入的值
    spring的依赖注入:就是去调用了javabean的setXXX方法。==
javabean的规范
    ref属性:ref="bean标签的id属性名":引入其他的bean标签的映射
    -->
    <!--注入String类型-->
    <property name="driver" value="com.mysql.jdbc.Driver">
</property>
    <!--注入Integer类型-->
    <property name="port" value="3306"></property>
    <!--注入实体类-->
    <property name="admin" ref="admin"></property>
    <!--注入list集合-->
    <property name="list">
       <list>
        <value>list集合</value>
        <value>true</value>
        <value>3.14</value>
        <!--引入实体类-->
        <ref bean="admin"></ref>
      </list>
    </property>
    <!--注入set集合-->
    <property name="set">
      <set>
        <value>set集合</value>
        <value>false</value>
        <value>3.15</value>
        <ref bean="admin"></ref>
      </set>
    </property>
    <!--注入map集合-->
    <property name="map">
      <map>
        <entry key="name" value="郭德纲"></entry>
        <entry key="gender" value=""></entry>
      </map>
    </property>
    <!--注入properties属性-->
    <property name="properties">
      <props>
        <prop
key="drivername">com.mysql.jdbc.Driver</prop>
        <prop key="url">jdbc:mysql:///person_info</prop>
        <prop key="username">root</prop>
        <prop key="userpassword">sa123</prop>
      </props>
    </property>
  </bean>
  <!--
	特点:通过set方法赋值时,首先通过无参构造方法创建对象,然后通过属性对应的set方法给对象赋值
	2.通过有参构造器
	-->
	<!--
  constructor-arg标签:一个标签只能描述一个有参构造方法中的形参
    index属性:有参构造器中的参数下标
    name属性:形参属性名
七、常见面试题
    type属性:形参属性类型
    value属性:形参属性的值
-->
<!--通过管理构造设置属性的方式-->
  <!--再重新创建一个DB类的对象-->
  <bean id="smallDB" class="cn.kgc.domain.DB">
    <constructor-arg index="0" name="driver" value="com.mysql.jdbc.Driver" type="java.lang.String">
</constructor-arg>
    <constructor-arg index="1" name="port" value="3306"
type="java.lang.Integer"></constructor-arg>
    <constructor-arg index="2" name="price" value="3.14"
type="java.lang.Float"></constructor-arg>
    <constructor-arg index="3" name="admin" ref="admin"
type="cn.kgc.domain.Admin"></constructor-arg>
  </bean>
  <!--特点:通过有参构造方法给对象的属性赋值时,首先调用有参构造方法创建对象,然后通过
同一个有参构造方法给对象的属性赋值  -->
发布了28 篇原创文章 · 获赞 16 · 访问量 590

猜你喜欢

转载自blog.csdn.net/qq_37881565/article/details/103357219