Spring

Spring Framework

特性

非侵入式:轻量级,对应用程序本身的结构影响非常小,对领域模型可以做到零污染。

控制反转:IOC inversion of control,反转资源获取方向,不再自己创建资源,而是环境将资源准备好。

面向切面编程:AOP aspect oriented programming,在不修改源代码的基础上增强代码功能。   对扩展开放,对修改关闭!

容器:Spring IOC是一个容器,包含并管理组件对象的生命周期。

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

声明式:很多以前需要编写代码才能实现的功能,现在只需要声明需求即可由框架代为实现。

一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。

 

 

IOC

IOC容器思想

DI依赖注入

Dependency Injection

IOC是一种反转控制的思想,DI是IOC的一种具体实现方式,可以使用约定好的方式为类的某些成员变量赋值,这些成员是该类所依赖的其他类。

 

IOC容器在spring中的实现

BeanFactory

IOC容器的基本实现,但是是面向Spring本身的,不提供给开发人员使用。

 

ApplicationContext

BeanFactory的子接口

 

ApplicationContext的实现类

FileSystemXmlApplicationContext用文件路径,不常用

ClassPathXmlApplicationContext用类路径,常用

 

容器管理的对象叫做组件,也叫Bean

基于XML管理Bean

 

创建实体类,然后创建xml文件,在idea中可以选择xml配置文件中的spring文件选项。

在beans标签中配置子标签bean,里面写的类可以在IOC容器中调用

 

 

获取IOC容器后,可以调用容器的getBean方法获取实例。该方法是使用反射机制调用无参构造方法创建对象的。

 

获取Bean的三种方式:

通过name(配置文件中bean的id)获取

ioc.getbean(“name”)

 

通过类型获取

ioc.getBean(类.class)

通过类型获取实例时,在配置文件中必须有且只有一个对应的id,不然会抛异常。但通过name获取时没有这个问题。

 

通过name和类型共同获取

ioc.getBean("name" , 类.class)

与方法一类似,但是不需要强转了,第一种返回的是Object类型,这种返回的是对应类型。

 

注:当接口只有一个实现类在配置文件中,也可以通过接口类型获取实例,当实现类不唯一且有多个被配置进了配置文件中,则不可以。

 

 

依赖注入

 

set注入

在bean标签中可以给实例的属性进行赋值

<property name="sid"  value="1001" />普通类型用value直接赋值

<property name="dept"  ref="" />引用类型用ref赋值

 

构造器注入

在bean标签中可以用子标签constructor-arg调用有参构造

<constructor-arg value="1001" />

<constructor-arg value="张三" type="" name=""  index=""/>

 

各种值得赋值方法

对基本类型赋值

字面量类型

直接在value=" "中写

null

<property name="">

  <null />

</property>

XML实体

对于<>需要用&lt; &gt;代替

CDATA节

<property name="">

  <value>

    <![CDATA[这里面的东西<><><><><><><>会被原样解析]]>

  </value>

</property>

CDATA不能用在value属性后面的冒号里面,必须用在标签中

 

对类类型赋值

引用外部Bean

在Property标签中的ref="name" 中设置引用的类型

被引用的类型必须也被配置在IOC容器的配置文件中

级联方式

先引用一个外部的bean进行实例化,防止null,然后利用点的方式对该类内部的属性进行操作赋值。

<property name="clazz" ref="clazzOne">

<property name="clazz.cid" value="1234">

<property name="clazz.cname" value="classOne">

内部Bean方式

在property中配置bean标签

<property name="clazz">

  <bean id="clazzInner" class="com.darkpar.pojo.Clazz">

    <property name="cid" value="4321"/>

    <property name="cname" value="classTwo"/>

  </bean>

</property>

内部Bean只能在当前Bean中使用,不能通过IOC容器获取

 

对数组类型赋值

在property标签中使用array子标签进行赋值

<property name="hobby">

  <array>
    <value>抽烟</value>

    <value>喝酒</value>

    <value>烫头</value>

  </array>

</property>

 

对集合类型赋值

对List类型赋值

在property标签中使用list子标签进行赋值

<property name="students">

  <list>
    <ref bean="studentOne" />

    <ref bean="studentTwo" />

    <ref bean="studentThree" />

  </list>

</property>

 

创建List类型的bean
配置集合的Bean需要引入util约束

在使用util约束中的标签时最好带上前缀,防止重名

Idea会自动添加

xmlns:util="http://www.springframework.org/schema/util"

 

<util:list id="studentList">

    <ref bean="studentOne" />

    <ref bean="studentTwo" />

    <ref bean="studentThree" />

</util:list>

 

对Map类型进行赋值

在property中使用子标签map,在map标签中使用entry标签填写单个键值对

<property name="teacherMap">

  <map>
    <entry key/key-ref=""  value/value-ref="">

  </map>

</property>

 

创建map类型的bean

<util:map id="teacherMap">

    <entry key/key-ref=""  value/value-ref="">

</util:map>

 

使用p命名空间进行赋值

在idea中打出p:后,可以引入p的约束,然后p:作为bean的属性,其中会出现所有的属性,每个属性两个,一个对应value,一个对应ref。

<bean id="student" class="com.darkpar.pojo.Student

p:sid="1001" p:tearchMap-ref="teacherMap">

</bean>