Spring

框架,即framework。是对特定应用领域中的应用系统的部分设计和实现的整体结构。就相当于让别人帮你完成一些基础工作,它可以处理系统很多细节问题,而且框架一般是成熟,稳健的。

Spring概述

  Spring是一个IOC(DI)和AOP容器框架

  Spring的优良特性

    ①   非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API

    ②   依赖注入:DI——Dependency Injection,反转控制(IOC)最经典的实现。

    ③   面向切面编程:Aspect Oriented Programming——AOP

    ④   容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期

     ⑤   组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。

     ⑥  一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring 自身也提供了表述层的SpringMVC和持久层的Spring JDBC)。

Spring模块

IOC和DI

 IOC(Inversion of Control):反转控制

  反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可。这种行为也称为查找的被动形式。

 DI(Dependency Injection):依赖注入

  即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。

  总结: IOC 就是一种反转控制的思想, 而DI是对IOC的一种具体实现。

IOC容器在Spring中的实现

  导入Spring框架jar包

  创建配置文件,常用文件名:applicationContext.xml或beans.xml

  • Spring中有IOC思想,  IOC思想必须基于 IOC容器来完成, 而IOC容器在最底层实质上就是一个对象工厂

    1)在通过IOC容器读取Bean的实例之前,需要先将IOC容器本身实例化

    2)Spring提供了IOC容器的两种实现方式

  ① BeanFactory:IOC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的。

  ② ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。

ApplicationContext的主要实现类

  ClassPathXmlApplicationContext:对应类路径下的XML格式的配置文件

  FileSystemXmlApplicationContext:对应文件系统中的XML格式的配置文件

  在初始化时就创建单例的bean,也可以通过配置的方式指定创建的Bean是多实例的。

ConfigurableApplicationContext

是ApplicationContext的子接口,包含一些扩展方法

refresh()和close()让ApplicationContext具有启动、关闭和刷新上下文的能力。所以要关闭ApplicationContext需要new此接口的对象调用close()方法

WebApplicationContext

专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作

  从IOC容器中获取bean,推荐同时指定bean的id值和类型

//通过在XML文件中配置的id及class类型获取对象
HelloWorld helloWorld = cxt.getBean("helloWorld",HelloWorld.class);

bean标签

  bean标签:将bean装配到springIOC容器中 
  bean标签中属性
     id:对象唯一标识(可以不写,如果书写必须是唯一值)
       class:装配bean的全类名

  bean子标签

    property:为对象中的属性赋值
      name:属性名
      value:属性值

    constructor-arg:通过构造器赋值 

给bean的属性赋值

1. 通过bean的setXxx()方法赋值

2. 通过bean的构造器赋值,注意:如果构造器中参数类型兼容,可能出现错误赋值情况。

<bean id="student" class="com.bean.Student01">
<property name="name" value="小明"></property>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>

3. p名称空间

<bean id="student" class="com.bean.Student01"
p:name="小明"
p:age="18">
</bean>

属性可使用的值

1. 字面量

基本数据类型及其封装类、String等类型都可以采取字面值注入的方式

若字面值中包含特殊字符,可以使用<![CDATA[]]>把字面值包裹起来或转义字符

2. null值

<property name= "bookName">
<null/>
</property>

3. 给bean的级联属性赋值

  设置级联属性后会修改原属性值,一般不使用

4. 外部已声明的bean、引用其他的bean:此时value已经满足不了需求了要用ref属性

<bean id="school" class="com.bean.School">
<property name="stus" ref="stu"></property>
</bean>

5. 内部bean

  当bean实例仅仅给一个特定的属性使用时,可以将其声明为内部bean。内部bean声明直接包含在<property>或<constructor-arg>元素里,不需要设置任何id或name属性

  内部bean不能使用在任何其他地方,即不能在容器中直接获取内部bean

为bean注入集合属性

数组和List

  需要指定<list>标签,在标签里包含一些元素。这些标签可以通过<value>指定简单的常量值,通过<ref>指定对其他Bean的引用。通过<bean>指定内置bean。通过<null/>指定空元素。甚至可以内嵌其他集合。

  数组的定义和List一样,都使用<list>元素。

  配置java.util.Set需要使用<set>标签,定义的方法与List一样。

<bean id="shop" class="com.spring.bean.Shop" >
<property name= "bookList">
<!-- 以bean的引用为值的List集合 -->
<list>
<ref bean= "book01"/>
<ref bean= "book02"/>
</list>
</property>
</bean >

Map

  通过<map>标签定义,<map>标签里可以使用多个<entry>作为子标签。每个条目包含一个键和一个值。

必须在<key>标签里定义键,因为键和值的类型没有限制,所以可以自由地为它们指定<value>、<ref>、<bean>或<null/>元素。

<bean id="cup" class="com.spring.bean.Cup">
<property name="bookMap">
<map>
    <entry key="book" value-ref="bookMap"></entry>
<entry>
<key>
<value>bookKey01</value>
</key>
<ref bean="book01"/>
</entry>
</map>
</property>
</bean>

集合类型的bean

  将集合bean的配置提取到外面,可供其他bean引用,实现重用

 <util:list id="schoolList">
<ref bean="stu"></ref>
</util:list>

FactoryBean

  如果需要程序员参与创建bean的过程之中,使用FactoryBean

  工厂bean跟普通bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂bean的getObject方法所返回的对象。

  工厂bean必须实现org.springframework.beans.factory.FactoryBean接口,并重写3个方法

<bean id="schoolFactory" class="com.factoryBeanImpl.SchoolFactory">
</bean>

bean的作用域

  可以在<bean>元素的scope属性里设置bean的作用域,以决定这个bean是单实例的还是多实例的。

  singleton,是所有bean的默认作用域。注意:工厂bean是通过isSingleton()方法设置是否单例的

  当bean的作用域为单例时,Spring会在IOC容器对象创建时就创建bean的对象实例

  而当bean的作用域为prototype时,IOC容器在获取bean的实例时创建bean的实例对象

bean的生命周期

在配置bean时,通过init-method和destroy-method 属性为bean指定初始化和销毁方法

Spring IOC容器对bean的生命周期进行管理的过程:

① 通过构造器或工厂方法创建bean实例

② 为bean的属性设置值和对其他bean的引用

③ 调用bean的初始化方法

④  bean可以使用了

⑤ 当容器关闭时,调用bean的销毁方法

<bean id="stu" class="com.bean.Student" init-method="init" destroy-method="destroy">
</bean>

   bean的后置处理器

     ① bean后置处理器允许在调用初始化方法前后对bean进行额外的处理

② bean后置处理器对IOC容器里的所有bean实例逐一处理,而非单一实例。

     ③ bean后置处理器需要实现接口:org.springframework.beans.factory.config.BeanPostProcessor。

      在初始化方法被调用前后,Spring将把每个bean实例分别传递给上述接口的以下两个方法:

      ●postProcessBeforeInitialization(Object bean, String beanId):初始化之前执行

      ●postProcessAfterInitialization(Object, String):初始化之后执行

   注意

     参数bean:IOC容器中创建的对象

     参数beanId:IOC容器中创建对象的beanId

引用外部文件

  将一部分信息提取到bean配置文件的外部,以properties格式的属性文件保存起来,同时在bean的配置文件中引用properties属性文件中的内容,从而实现一部分属性值在发生变化时仅修改properties属性文件即可。

1. 创建properties属性文件

jdbc.username=root
jdbc.password=12345
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test

2. 引入context名称空间

3.指定properties属性文件的位置

<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

classpath: 引入当前项目中类路径下的资源文件
classpath*: 引入所项目中类路径下的资源文件

4.从properties属性文件中引入属性值

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
p:username="${jdbc.username}"
p:password="${jdbc.password}"
p:driverClassName="${jdbc.driverClass}"
p:url="${jdbc.url}">
</bean>

自动装配

手动装配:在XML配置文件中以value或ref的方式明确指定属性值都是手动装配。

自动装配:根据指定的装配规则,不需要明确指定,Spring容器会自动将匹配的属性值注入bean中。

注意:自动装配属性的数据类型,只能是[非字面量]值。[字面量]值不能自动装配。即基本数据类型(包装类)+String类型都不可自动装配

装配方式

  1. 根据类型自动装配:将类型匹配的bean作为属性注入到另一个bean中。当有多个与目标bean类型一致将报错
  2. 根据名称自动装配:必须将目标bean的名称和属性名设置的完全相同
  3. 通过构造器自动装配:当bean中存在多个构造器时,此种自动装配方式将会很复杂。不推荐使用。

基于xml,自动装配(不推荐)

  在bean中添加autowire="byName|byType"

<bean id="student" class="com.springdemo.autowired.Student" autowire="byType"></bean>

  byName:通过类中的属性名与bean中id(IOC容器中的id匹配)。
  * 如果数值一致,匹配成功。 如果不一致,装配失败(不会报错,装配null值)

  byType:通过类中的属性类型与bean中的class匹配
  * 如果一致,匹配成功。
  * 如果未找到匹配类型,装配失败(装配null值)
  * 如果匹配到多个兼容类型(父子关系:装配失败,结果会报错)

基于注解,自动装配bean

  需在XML文档中先添加扫描组件标签,指定需被装配bean的package

<context:component-scan base-package="com.bookStore" use-default-filters="true"></context:component-scan>

  base-package:Spring容器会扫描这个基类包及其子包中的所有类。当需要扫描多个包时可以使用逗号分隔。

  如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类

  use-default-filters="true":默认组件扫描(扫描当前base-package下的包及其子包),false:不扫描...

通过子标签控制包含与排除

  <context:include-filter>包含扫描,扫描指定匹配规则下的包及其子包

    注意:通过将use-default-filters属性设置为false,禁用默认过滤器,然后扫描的就只是include-filter中的规则指定组件了    

  <context:exclude-filter>排除扫描,子节点表示要排除在外的目标类

    注意:将use-default-filters属性设置为true或默认

过滤表达式,指定类型

类别

示例

说明

annotation

com.XxxAnnotation

过滤所有标注了XxxAnnotation的类。这个规则根据目标组件是否标注了指定类型的注解进行过滤。

assignable

com.BaseXxx

过滤所有BaseXxx类的子类。这个规则根据目标组件是否是指定类型的子类的方式进行过滤。

aspectj

com.*Service+

所有类名是以Service结束的,或这样的类的子类。这个规则根据AspectJ表达式进行过滤。

regex

com\.anno\.*

所有com.anno包下的类。这个规则根据正则表达式匹配到的类名进行过滤。

custom

com.XxxTypeFilter

使用XxxTypeFilter类通过编码的方式自定义过滤规则。该类必须实现org.springframework.core.type.filter.TypeFilter接口

4个注解:

  1) 普通组件:@Component

  2) 表述层控制器组件:@Controller

  3) 业务逻辑层组件:@Service

  4) 持久化层组件:@Repository

组件命名规则

①默认情况:使用组件的简单类名首字母小写作为bean的id

    ②使用组件注解的value属性指定bean的id:  @Component(value="指定id名")

自动装配bean中的属性

实现原理

  在指定要扫描的包时,<context:component-scan> 元素会自动注册一个bean的后置处 理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以自动装配标记 了@Autowired、@Resource或@Inject注解的属性。

@Autowired

  注入方式:既不是set注入,也不是构造注入。本质:是通过反射注入。

  自动装配规则

    优先使用byType进行装配,如果能唯一匹配,则装配成功。
    如果匹配到多个兼容类型的bean,再照byName方式匹配(进行唯一筛选)
    如果通过byName唯一确定bean,则装配成功,否则装配失败。

  构造器、普通字段(即使是非public)、一切具有参数的方法都可以使用@Autowired注解

  若某一属性允许不被装配,可以设置@Autowired注解的required属性为 false

    required:默认值是true,必须装配该bean

    required值为false时,如果IOC容器中存在该bean,则装配。如果没有,则不装配。

  @Autowired注解也可以应用在数组类型的属性上

  @Autowired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的bean。

  @Autowired注解用在java.util.Map上时,若该Map的键值为String,那么 Spring将自动装配与值类型兼容的bean作为值,并以bean的id值作为键。

@Qualifier

  必要时,可以组合使用@Qualifier(value="userDaoMyBatisImpl")注解指定beanId名

  Spring甚至允许在方法形参上标注@Qualifiter注解以指定注入bean的名称。

Java框架之Spring01-IOC-bean配置-文件引入-注解装配的更多相关文章

  1. java框架篇---spring IOC 实现原理

    IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用 ...

  2. Java框架之MyBatis 06-全局配置-mapper映射-分步查询

    MyBatis MyBatis是Apache的一个开源项目iBatis, iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架. iBatis  提供的持 ...

  3. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. java框架篇---spring IOC依赖注入

    spring依赖注入的方式有4种 构造方法注入 属性注入 工厂注入 注解注入 下面通过一个实例统一讲解: User.java package com.bjsxt.model; public class ...

  5. java lombok包在maven已经配置,但是注解没用

    如果你是用eclipse作为开发环境,配置了maven依赖以后,还需要在eclipse/myeclipse中手动安装lombok. 其实就是加一个jar包,添加2行代码 1. 将 lombok.jar ...

  6. Spring4学习笔记二:Bean配置与注入相关

    一:Bean的配置形式 基于XML配置:在src目录下创建 applicationContext.xml  文件,在其中进行配置. 基于注解配置:在创建bean类时,通过注解来注入内容.(这个不好,因 ...

  7. java框架之Spring(2)-注解配置IOC&AOP配置

    注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...

  8. [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. JS划重点——类和对象的不正经阐述

    JS划重点--类和对象的不正经阐述 /在JS 类里面函数也是一个对象,那么要创建一个对象就需要一个类,这个类可以由这个对牛逼的对象-函数来实现/ /首先是普罗大众都会的 工厂模式来创建一类/ func ...

  2. 【TensorFlow】理解tf.nn.conv2d方法 ( 附代码详解注释 )

    最近在研究学习TensorFlow,在做识别手写数字的demo时,遇到了tf.nn.conv2d这个方法,查阅了官网的API 发现讲得比较简略,还是没理解.google了一下,参考了网上一些朋友写得博 ...

  3. Python--day40--datetime,socketserver,Threading模块分别是哪些模块的高层模块

  4. $_GET $_POST $_REQUEST

    <form action="__APP__/View/editArticle?id=5" method="GET"> <form>表单提 ...

  5. React MVC框架 <某某后台商品管理开源项目> 完成项目总结

    **百货后台商品信息开源项目 1.利用React  app脚手架 2.封装打包 buid 3.更偏向于后台程序员开发思维 4.利用的 react -redux    react-router-dom  ...

  6. H3C 域名

  7. H3C 聚合链路负载分担原理

  8. linux poll 和 select

    使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一 ...

  9. 1119 机器人走方格 V2 (组合数学)

    M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果.   Input 第1行,2个数M,N,中间用空格隔开 ...

  10. import()函数

    简介 import命令会被 JavaScript 引擎静态分析,先于模块内的其他模块执行(叫做”连接“更合适).所以,下面的代码会报错. // 报错 if (x === 2) { import MyM ...