Spring

  1. spring是什么? ( www.spring.io):
    是一个开源的轻量级的应用开发框架。其目的是用于简化企业级应用程序开发,减少侵入;
    (1)开源:源代码公开。
    (2)轻量级:相对于ejb,spring不依赖于应用服务器。
    (3)应用开发框架:
    a.简化应用程序的开发(简化开发):spring对很多java技术进行了简化,
    比如,直接使用jdbc访问数据库,需要考虑连接的获取和释放,使用spring提供的jdbc的访问方法,则不用考虑了。
    b.解耦:spring(spring提供了ioc功能)帮我们管理对象之间的关系。对象与对象之间是低耦合的。
    c.集成:spring可以集成其它的第三方的一些框架(对一些常用的框架提供了相应的集成方式)。
    比如,比如mybatis(利用spring集成mybatis来访问数据库就很方便。),hibernate等等。 一站式开发框架.
    2,如何使用spring?
    (1)spring容器(管理对象的生命周期及其依赖关系)
    a.spring容器是什么?:(就是一个程序)用来管理对象的一个程序。(可以将spring容器看作是一个工厂或者软件管家)spring创建对象叫做控制反转spring组装对象叫做di依赖注入。Springmvc是spring带来的现成的组件简化web编程.
    b.如何启动spring容器?
    step1,将spring相关的jar文件拷贝到WEB-INF\lib下。
    step2,将applicationContext.xml拷贝到src下。
    step3,启动spring容器
    c.javabean: 实现Serializable接口;不带参的构造器; 属性及对应的get/set方法.
    (2)容器如何管理对象?
    Spring 可以用于管理对象(IOC/DI)
    1.使用XML配置文件管理对象,对于现成的类,也可以采用这种方式处理异常
    2.使用注解配置方式管理对象,对于自己写的代码可以采用注解的方式管理对象。
    3.可以混合使用两种方式管理对象。
    1)如何实例化(如何获得java对象)?
    创建容器,从容器中获取一个对象,通过调用容器的getBean(参数1,参数2)方法 其中参数1是Bean的id(错了会出现找不到bean错误,配置扫描组件包名写错了也会),第二个参数是符合javaBean的类的点class。
    方式一: 容器调用不带参的构造器。
    <bean id="helloBean"class=“test.HelloBean”/>
    注意:id要求唯一,类名必须是类的完全限制名,必须要有一个不带参的构造器。
    方式二: (了解)用静态工厂方法来实例化(容器调用类的静态方法(静态工厂))。
    注意: 使用factory-method属性值必须是定静态方法。

    方式三: (了解)用实例工厂方法来实例化

    注意:factory-bean=“cal” 中的cal必须配置bean属性,让容器去调对象cal的getTime方法。
    2)bean的命名:可以使用id或者name属性给bean命名。
    3)bean的作用域(用来控制创建对象的数量)
    容器会依据scope属性来决定创建 多少个实例。
    默认情况下,容器对于一个 bean的配置,只会创建一个实例。并且启动spring容器就创建好了。
    scope属性值可以为以下两个:prototype:(原型),每getBean一次,就会创建一个新的实例。
    singleton:(单例,缺省值),只创建一个实例。
    4)生命周期相关的几个方法
    类似servlet容器(Tomcat)可以对servlet进行生命周期的管理,spring容器同样也可以对bean进行生命周期的管理。
    init-method:指定初始化方法,容器在创建实例之后,会调用该实例的初始化方法。
    detroy-method:指定销毁方法,容器在关闭之前,会调用该实例的销毁方法。
    注意,a只有当scope="singleton"时销毁方法才起作用。b.初始化方法和销毁方法只会执行一次。
    c.关闭对象要用:AbstractApplicationContext实例化的配置文件对象调用close方法。
    5)延迟加载(了解)
    在默认情况下,容器启动之后,会 将所有配置scope="singleton"的bean 创建好。
    如果需要延迟加载(即不事先创建好调用getBean才创建),需要将lazy-init配置为true。
    3.IOC(inversion of controll 控制反转) spring创建对象叫做控制反转 spring组装对象叫做di依赖注入。
    (1)什么是IOC(控制反转)spring创建对象叫做控制反转 spring组装对象叫做di依赖注入,
    对象的依赖关系交给容器来管理。指程序中对象的获取方式发生反转,由最初的new方式创建,转变为由第三方框架创建。(由最初的自己创建依赖关系转为由容器创建)
    所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和 对象间的关系。所有的类都会在spring容器中登记,告诉spring你是什么,你需要什么,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制.
    IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。
    控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系
    (2)什么是DI(依赖注入)?依赖注入:尽量使用接口类型来注入;
    容器可以通过调用对象的构造器或者set方法来建立对象之间的依赖关系。
  1. set方法注入(调用对象的set方法):
    容器首先调用bean的不带参的构造器创建实例,然后调用该实例的set方法来完成注入。
    a.提供有一个不带参的构造器。b.必须有对应的set方法。c.在配置文件当中,使用元素标签来完成依赖关系的建立。(在对应的bean双标签之间),其中标签的属性值name就是javabean属性值,value就是要设置的值(String和8个基本类型)。Ref用来注入对象的(值为xml中Bean的id)
    2)构造器的方式(调用对象的构造器)来注入:容器会调用对应的构造器来完成注入。
    a.提供相应的构造器b.在配置文件当中,使用来完成依赖关系的建立。
    其中index属性值就是第几个参数(从0开始)。Value属性值就是用来设置参数的值。
    注: 工厂模式
    a.设计模式:为了解决常见的问题而提出的一套解决方案。
    b.简单工厂模式:工厂类负责创建各种产品,客户端只需要调用工厂类的方法就可以获得对应的产品。
    (3)自动装配(了解)通过bean属性autowire来实现的。就是告示容器按照某种规则来组装对象(实现自动注入)。
    1)byName:容器依据属性名查找对应的bean (id值和属性名一样的),然后调用对应的set方法来完成注入。
    2)byType:容器依据属性类型查找对应的bean (class值的类和属性类型一致的),然后调用对应的set方法来完成注入。
    注意:有可能有多个bean满足条件,会报错。
    3)constructor:容器依据属性类型查找对应的bean (class值的类和属性类型一致的),然后调用对应的构造器来完成注入。
    注意:有可能有多个bean满足条件,会报错。
    1.注入不同类型的值
    (1)基本类型+String:使用value属性
    (2)对象类型:使用ref属性注入对象用ref=“注入对象的id”
    (3)集合类型

1)List 2)set 3) Map


xxx xxx

4)Properties 5) <util:list id="">

xxx
xxxx
</util:list>

注:A.可以将集合配置为一个bean,方便重用(也可以将集合当做一个bean来配置)。util:list,util:set,util:map,util:properties命名空间:是为了区分同名元素而添加的一个前缀。
B.一个特殊用法:读取location属性指定的文件的内容,并将这些内容添加到Properties对象里。
<util:properties id="" location=“classpath:config.properties(文件路径)”/>就可以同getbean获取对象了。
2.spring表达式
类似于el表达式,用于读取bean的属性值。
#{eb.name}读取id为"eb"的name属性值。
#{eb.interest[1]}读取id为"eb"的interest(List集合)的第二个元素值。
#{eb.score.math}读取id为"eb"的score(Map)的key为math的值。
Spring 表达式
1、 字面量的表示#{直接写值}:基本类型+String
2、 引用Bean,属性和方法
1>引用其他对象

<bean …> <property name=“instrument” value="#{saxophone}"
通过id:“saxophone”将对象注入到instrument属性中,这与下面的配置是一样的:

一、使用注解声明bean(简化配置文件)annotation(注解,解释)
注解并不是万能的自己写的类可以用注解形式让容器来实现类管理。如果要让容器管理java.api的类就要用bean配置了。
(1)组件扫描:指定一个包路径,Spring会自动扫描该包及其子包所有组件类,当发现组件类定义前有特定的注解标记时,就将该组件纳入到Spring容器。等价于原有XML配置中的定义功能。
组件扫描可以替代大量XML配置的定义,这样可以大大简化配置文件。
(2)如何使用
step1,在配置文件当中,添加 <context:component-scan base-package=“包名”/>
让容器扫描指定的包及其子包下面的类。
step2,在类前面添加注解标记:
@Component通用
注1:默认情况下,Bean的id就是类名(第一个字母变小写), 如果想重新命名id,可以使用@Component(“要修改的名字”)形式。
注2:@Repository:用于持久层组件 @Service:用于业务层组件 @Controller:用于控制器组件
(3)生命周期相关的几个标注(在要指定的方法前面加)
@PostConstruct 初始化方法(在创建的时候自动调用) @PreDestroy 销毁方法(在关闭的时候自动调用)
注意:销毁方法只有是单列的时候有效。
(4)作用域:在类前面添加注解标记 @Scope(“prototype”)注: 缺省值是"singleton"
(5)延迟加载(了解)在类前面添加注解标记: @Lazy(true) 注: 缺省值是false。
在默认情况下,容器启动之后,会将所有作用域为"singleton"(单例)的bean实例化。如果延迟加载,
则不会将这些bean实例化。
(6)依赖注入相关的几个标注 : @Autowired和@Qualifier
@Autowired可以用于构造器注入,也可以用于set方式注入。
@Qualifier(“wt”)告诉容器找id为wt的bean注入等价于 byName来完成注入如果没写会按照bytype查找并注入。
1)构造器注入: a. @Autowired加在构造器前面。 b. @Qualifier(“id值”)加在参数前面,用于指定要注入值的bean的id。
注:注入的对象单例时,@Qualifier可省略。 此时,Spring按照类型匹配参数(会按照bytype查找并注入)。
2)set方式注入
方式一、a.@Autowired加在set方法前面。 b. @Qualifier加在参数前面,用于指定要注入值的bean的id。
注:注入的对象单例时,@Qualifier可省略。 此时,Spring按照类型匹配参数。来完成对象的注入。
c.@Autowired, @Qualifier(“id值”)也可以直接添加到 属性前面,此时,可以不写set方法
方式二、@Resource(name=“id值”)
a.该标注只支持set方式注入
b.可以将该标注加到set方法前面,name属性用于指定要注入值的bean的id。
c.该标注也可以直接添加到属性前,此时,可以不写set方法。(只是单纯的赋值)。
(7)使用spring表达式的标注@Value
用法一@Value("#{spring表达式}")
用法二@Value(“基本类型的值”)
注:@Value可以用在属性前,也可以用在set方法前面。

1.对象的生存周期管理1. 创建2. 使用3. 销毁
2.对象的创建(生产)
1). new 创建对象:适合简单对象
2). 利用工厂生产:适合创建复杂对象- 利用方法生产一个对象。- 是开发工作中最常见方式。

  • 优点:可以利用方法封装复杂的对象创建过程。
    3). 注入获得:最方便的方式
  • 被注入的对象也是用 1 2 方式创建的 - 方便:只需要定义变量,等待对象的注入
  • 有两个方面组成:等待注入变量,控制者(spring容器)创建并注入注入对象
  1. Spring IOC/DI 就是利用注入方式管理对象
    1)需要注入变量的对象,必须由Spring管理。(被Spring管理的对象才能注入属性)
    2)管理方式:使用注解(要配置组件扫描),配置对象的bean属性
    3)变量的注入方式:使用注解方式注入(最常见的)、set、constructor注入。
    4)变量注入的前提:必须被spring容器管理的对象。
    例如:
    spring.xml

<context:component-scan base-package=“cn.tedu”/>

@Component
class Person{
@Resource
Food food;
}
//调用Spring 的工厂方法获得Spring管理的对象
Person p = ctx.getBean(“person”);
//错误的做法:不被容器管理的Person不能为属性food注入对象
Person p = new Person();
4.Spring 的核心作用是管理对象的生存周期的,Spring 在管理组件的同时还提供了很多组件 Spring MVC- Spring JDBC

在这里插入图片描述

  1. Core 封装包是框架的最基础部分,提供IoC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。
    Context(上下文) 封装包构筑于Core封装包的坚固基础上:它提供了用一种框架风格的方式来访问对象,有些像JNDI注册表。Context封装包继承了beans包的功能,还增加了国际化(I18N)(用于规范resource bundle),事件传播,资源装载,以及透明创建上下文,例如通过servlet容器。
    DAO 提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。 并且,JDBC 封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。
    ORM 封装包提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。
    Spring的 AOP 封装包提供了符合 AOP Alliance规范的面向方面的编程(aspect-oriented programming)实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中,这有点象.Net的attribute的概念。
    Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IoC容器初始化和针对Web的application context。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。
    Spring中的 MVC 封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种 清晰的 分离模型,在领域模型代码和web form之间。并且,还可以借助Spring框架的其他特性。
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值