Spring-01

IoC:Inverse of Control(控制反转):
读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,好比于MVC。就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。
正控:若调用者需要使用某个对象,其自身就得负责该对象的创建。
反控:调用者只管负责从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。
在这里完美地体现了好莱坞法则(Don’t call me ,I’ll call you)。
DI:Dependency Injection(依赖注入):
从字面上分析:
IoC:指将对象的创建权,反转给了Spring容器;
DI :指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。
IoC和DI其实是同一个概念的不同角度描述,DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。
Container:容器,在生活中容器就是一种盛放东西 的器皿,从程序设计角度看作是装对象的对象,因为存在对对象的存入、取出等操作,所以容器还要管理对象的生命周期。

Spring主要是通过属性(DI)注入和控制反转(IOC),帮我们创建对象和属性注入。

第一个Spring的HelloWorld程序:

步骤:
1.准备jar包
   spring-beans-4.1.2.RELEASE.jar
   spring-core-4.1.2.RELEASE.jar
   报错再添加:
   com.springsource.org.apache.commons.logging-1.1.1.jar  不在spring中 在spring的依赖中
2.开发HelloWorld程序
3.在applicationContext.xml中完成配置( spring-framework-reference\html\xsd-config.html)直接搜索xsd-config.html
4.启动容器
5.从容器中得到bean
6.调用bean响应的方法

Spring-01_第1张图片

Spring-01_第2张图片

Spring-01_第3张图片

HelloWorld原理分析:

Spring管理bean的原理:
什么是BeanFactory:
   Spring最基本的接口,表示Spring容器——生产bean对象的工厂,负责配置,创建和管理bean。
   备注:bean是Spring管理的单位,在Spring中一切都是bean.
深入Spring管理bean的原理。
1、通过Resource对象加载配置文件;new  classPath...
2、解析配置文件,得到指定名称的bean; new  xml...
3、解析bean元素,id作为bean的名字,class用于反射得到bean的实例:

Spring-01_第4张图片

Spring-01_第5张图片


eclipse提示XML语法:

1:联网

2 : 配置DTD

   ①到解压spring/schemas/beans/spring-beans-4.1.xsd 。
    ②选择schema location 方式 。

    ③复制网络路径 http://www.springframework.org/schema/beans/spring-

Spring-01_第6张图片


Spring的基本配置:


在Spring配置中,id和name属性都可以定义bean元素的名称,不同的是:
id属性,遵守XML语法的ID约束(唯一)。必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号,不能以“/”开头。
name属性,就可以使用很多特殊字符,比如在Spring和Struts1或Spring MVC的整合中,就得使用name属性来的定义bean的名称。
    
  注意:从Spring3.1开始,id属性不再是ID类型了,而是String类型,也就是说id属性也可以使用“/”开头了,而bean元素的id的唯一性由容器负责检查。(鼓掌)

当然也使用name属性为元素起多个别名,多个别名之间使用逗号或空格隔开,在代码中依然使用BeanFactory对象.getBean(...)方法获取。

或则

建议:bean起名尽量规范,不要搞一些非主流的名字,尽量使用id。

Spring中引入其他配置文件:
在实际开发中,随着应用规模的增加,系统中元素配置的数量也会大量增加,导致applicationContext.xml配置文件变得非常臃肿。
为了避免applicationContext.xml文件过于庞大、臃肿,为提高其可读性,我们可以将一个applicationContext.xml文件分解成多个配置文件,然后在applicationContext.xml文件中包含其他配置文件即可。
使用import元素引入其他的配置文件:

使用import元素注意:
1、默认情况下,从classpath的根路径寻找。
2、可以使用前缀来定位文件的基础位置:
  ①:[classpath:]:后面的文件从classpath路径开始找(推荐);[注意classloader的问题。]
  ②:[file:]:后面的文件使用文件系统的路径开始找;

注意:只有当框架中实现了Resource接口才能够识别上述的前缀标识符。

Spring-01_第7张图片


Spring中的测试:

传统的测试存在问题:
1,每个测试都要重新启动Spring容器,启动容器的开销大,测试效率低下。

2,不应该是测试代码管理Spring容器,应该是Spring容器在管理测试代码。

Spring测试依赖jar:
Spring4.x需要依赖的单元测试得是最新的junit4.12,Eclipse自带的junit4.8不支持,同时从Spring4.x开始,还得依赖AOP包的支持。
junit-4.12.jar
hamcrest-core-1.3.jar
spring-test-4.1.2.RELEASE.jar
spring-context-4.1.2.RELEASE.jar
spring-aop-4.1.2.RELEASE.jar

spring-expression-4.1.2.RELEASE.jar

若:
把@ContextConfiguration("classpath:applicationContext.xml") 写成@ContextConfiguration
默认去找的当前测试类名-context.xml配置文件,如:HelloWorldTest-context.xml

Spring-01_第8张图片


IOC容器:

IoC容器:
BeanFactory:是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置,创建和管理bean。
在应用中,一般不使用BeanFactory,而推荐使用ApplicationContext(应用上下文),原因如下。
BeanFactory和ApplicationContext的区别:
1、ApplicationContext继承了BeanFactory,拥有了基本的IoC功能;
2、除此之外,ApplicationContext还提供了以下的功能:
   ①、支持国际化;
   ②、支持消息机制;
   ③、支持统一的资源加载;

   ④、支持AOP功能;

Spring-01_第9张图片


ApplicationContext常见实现类:
1:ClassPathXmlApplicationContext:读取classpath中的资源
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
---------------------------------------------------------------------
2:FileSystemXmlApplicationContext:读取指定路径的资源
ApplicationContext ac = new FileSystemXmlApplicationContext("c:/applicationContext.xml");
---------------------------------------------------------------------
3:XmlWebApplicationContext:需要在Web的环境下才可以运行
XmlWebApplicationContext ac = new XmlWebApplicationContext(); // 这时并没有初始化容器
ac.setServletContext(servletContext); // 需要指定ServletContext对象
ac.setConfigLocation("/WEB-INF/applicationContext.xml"); // 指定配置文件路径,开头的斜线表示Web应用的根目录

ac.refresh(); // 初始化容器

bean的创建时机:
   Spring中管理的bean对象到底是什么时机创建出来的?
1.ApplicationContext在加载的时候就会创建所有的bean(Web应用建议)
2.BeanFactory需要等到拿bean的时候才会创建bean (桌面程序)
此时不使用Spring Test;
延迟加载
再讲使用Spring Test注入ApplicationContext对象

控制bean的创建时机/控制是否要延迟加载(了解):
针对于当前xml中所有的bean。

针对于指定的bean:


bean的实例化方式:

bean的实例化方式:
①.构造器实例化(无参数构造器),最标准,使用最多。
②.静态工厂方法实例化:解决系统遗留问题
③.实例工厂方法实例化:解决系统遗留问题

④.实现FactoryBean接口实例化:实例工厂变种:集成其他框架使用:LocalSessionFactoryBean


Spring-01_第10张图片


Spring-01_第11张图片

Spring-01_第12张图片


Spring-01_第13张图片

bean的作用域:

bean对象的作用域(bean对象可以存活的时间):



singleton: 单例 ,在Spring IoC容器中仅存在一个Bean实例 (默认的scope)
prototype: 多例 ,每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean():不会在容器启动时创建对象
request: 用于web开发,将Bean放入request范围 ,request.setAttribute("xxx") , 在同一个request 获得同一个Bean
session: 用于web开发,将Bean 放入Session范围,在同一个Session 获得同一个Bean
globalSession: 一般用于Porlet应用环境 , 分布式系统存在全局session概念(单点登录),如果不是porlet环境,globalSession 等同于Session  
    在开发中主要使用 scope="singleton"、 scope="prototype"
      对于MVC中的Action使用prototype类型,其他使用singleton

      Spring容器会管理Action对象的创建,此时把Action的作用域设置为prototype.


DI属性注入:

DI:Dependency Injection: 依赖注入
从字面上分析:
IoC:指将对象的创建权,反转到Spring容器;
DI :指Spring创建对象的过程中,将对象依赖属性通过配置进行注入

其实它们是同一个概念的不同角度描述。DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。

自动装配方式(不推荐):
设置:元素的:autowire属性:

----------------------------------------------------------
autowire属性:让spring按照一定的方式自己去找合适的对象,并完成DI
    - default:不要自动注入
    - no:不要自动注入
    - byName:按照名字注入(按照属性的名字在spring中找bean) factory.getBean("属性的名字")
    - byType:按照依赖对象的类型注入(factory.getBean(属性的类型))
    - constructor:按照对象的构造器上面的参数类型注入

    注意:
    1,如果按照byName自动注入,要求所有的属性名字和id的名字必须保证一种规范的命名方式;
    2,如果按照byType注入,如果spring中同一个类型有多个实例-->报bean不是唯一类型错误;

Spring-01_第14张图片


Spring-01_第15张图片
对象注入的方式:
  1):手动装配
  2):自动装配(了解);
  3):自动装配(注解版).
通过哪些手动可以注入:
  1):可以通过属性注入(setter方法).
  2):通过构造器注入.
  3):通过SpEL注入.
注入的时候,可有注入哪些类型的值.
 1:简单类型(一个类型只能表示一个值,如:基本类型/String,URL).
 2:复合类型(复杂的对象类型)

 3:集合类型

使用setter注入(属性注入):
1,使用bean元素的子元素设置;
    1,简单类型值,直接使用value赋值;
    2,引用类型,使用ref赋值;
    3,集合类型,直接使用对应的集合类型元素即可。
2,spring通过属性的setter方法注入值;
3,在配置文件中配置的值都是string,spring可以自动的完成类型的转换
4,属性的设置值是在init方法执行之前完成的
5,改进spring的测试,直接在测试类里面注入需要测试的对象



Spring-01_第16张图片


Spring-01_第17张图片


Spring-01_第18张图片

Spring-01_第19张图片

Spring-01_第20张图片


property  place holder(属性占位符)

使用DataSource(druid)的案例,给数据源注入Property中的数据.

准备:
   MySQL驱动包和Druid连接池包.

Spring-01_第21张图片

1.引入context命名空间:
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        ">

2.提供db.properties文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring
jdbc.username=root
jdbc.password=admin
jdbc.maxActive=5
3.通过找到文件.
4.在applicationContext.xml中设置占位符.

Spring-01_第22张图片

你可能感兴趣的:(spring)