Spring学习笔记

框架的概念:

  1. 高度抽取可重用代码的设计
  2. 高度的通用性

    Spring的特点:

    优良特性:
  3. 非侵入式
  4. 依赖注入
  5. 面向切面编程
  6. 容器
  7. 组件化
  8. 一站式

Core Container(IOC)核心容器包含Bean Core Context expression 这几个容器

Web:Sping开发Web应用

  1. WebSocket
  2. Servlet
  3. web protlet

    (建议用哪个模块就导哪个包)

IOC:

控制反转;被动式的资源获取方式:资源的获取不是自己创建,而是交给容器创建和设置

DI:(Injevtion 依赖注入)

  1. 容器能知道哪个组件(类运行的时候时候需要另外一个类)
  2. 只要使用管理的组件,都能使用组件提供的强大功能。现在所有的对象交给容器创建,容器中的组件注册。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<bean id = "person03" class="com.bean.Person">
<constructor-arg name="lastName" value="小明"></constructor-arg>
<constructor-arg name="email" value="skjdhfkjsdfhkd@126.com"></constructor-arg>
<constructor-arg name="gender" value="男"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
//有参构造器 <constructor-arg>就代表一个属性

<bean id="person01" class="com.bean.Person">
<property name="lastName" value="he"></property>
<property name="age" value ="18"></property>
<property name="email" value="hzf@666.com"></property>
<property name="gender" value="man"></property>
</bean>
//通过无参构造器
//如果省略name参数 就要严格按照构造器参数的位置
//在重载的情况下 type可以指定参数的类型

//名称空间:在xml中名称空间是用来防止标签重复的
<book>
<b:name>西游记</name>
<author>
<a:name>吴承恩</name>
</author>
</book>
通过标签的前缀,就可以知道name是指哪个name

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


<property name="lastName">
</null> //进行复杂的赋值,在property标签里面
</property>

//如果把多个属性赋值给一个对象呢

<bean id ="car01" class="com.bean.Car">
<property name="carName" value="宝马"></property>
<property name="color" value="pink"></property>
<property name="price" value="30000"></property>

</bean>

<property name="car" ref="car01"></property>
//在person01的容器中加入这段代码就ok


//在bean里面写property写是引用外部bean, 在property里面写bean是引用内部bean

Spring在为各种属性赋值:

  1. 在bean使用ref写是引用外部bean, 在property里面写bean是引用内部bean
  2. 在对list属性进行赋值,写在property里面,同时也可以使用ref引用外部赋值
  3. 在对map属性进行赋值,在property键值对里面<entry>标签,在标签内使用key value进行键值对的赋值。
  4. util名称空间创建集合类型的bean 方便别人引用
    1
    2
    3
    <util:map id="myMap">//一定要有Id
    //里面写的直接是元素
    </util:map>

级联属性赋值:就是属性的属性

通过继承实现bean配置信息的重用

1
2
3
4
5
6
7
8
9
10
11
12
<bean id="parent05" class="com.bean.Person">
<property name="lastName" value="张三"></property>
<property name="age" value="18"></property>
<property name="gender" value="男"></property>
<property name="email" value="akshdajsk"></property>
</bean>

<bean id="person06" class="com.bean.Person" parent="parent05">
<property name="lastName" value="fengZe"></property>
</bean>

//abstract="true",这个Bean的配置是一个抽象的,不能获取他的实例,只能被别人用来继承

bean之间的依赖(只是改变创建顺序)如果在创建之前写入 depends-on=‘book,person“,那么就会先创建book 还有person。

通过静态工厂方法创建bean,实例工厂方法创建bean
bean的创建默认就是框架利用反射new出来的bean实例,工厂模式就是有一个类帮你去创建对象

  1. 静态工厂:工厂本身不用创建对象:通过静态方法调用 对象 = 工厂类.工厂方法名()
  2. 实例工厂:工厂本身需要创建对象:

    工厂类 工厂对象 = new 工厂类();
    工厂对象.getAirplane

    1
    2
    3
    factory-method:指定工厂方法
    class:指定静态工厂全类名
    <constructor-arg value="李四"></constructor-arg>传参

    实例工厂

  3. 先配出实例工厂对象
  4. 配置我们需要创建的airPlane使用哪个工厂创建
  5. facotry-bean :指定使用哪个工厂实例
  6. factory-method:使用哪个工厂方法

FactoryBean(是Spring规定的一个接口);只要是这个接口的实现类,Spring都认为是一个工厂,ioc容器启动的时候就不会创建实例

bean的生命周期

  1. ioc容器中注册的bean:

    1. 单例bean ,容器启动的时候才会创建好,容器关闭也会销毁创建的bean
    2. 多例bean,获取的时候才会创建
  2. 引用外部属性文件:

    1. 数据库连接池作为单实例是最好的,一个项目就一个连接池,连接池里面管理很多连接。连接直接从连接里拿,可以让spring 帮我们创建连接池对象。
    2. 依赖context名称空间,可以加载外部配置文件

自动装配(自动赋值)

  1. autowire= “default” ,可以填byName ,byType, constructor,no。
  2. 例如说byName,按照名字,以属性名作为id去容器里找到这个组件,给他赋值。如果找不到就装配null

Spring有四种注解:

  1. @Controller 控制器
  2. @Service 业务逻辑
  3. @Respository 数据库(持久化层)
  4. @Component

    注意:某个类上添加任何一个注解都能快速的将这个组件加入ioc容器的管理

添加步骤:
  1. 加入注释:告诉Spring,自动扫描加注释,依赖名称空间 –context:component-scan
    base.package:” “填入需要扫描的包,至少填两级目录
  2. 在ioc获取bean的过程中,id是默认是类名的首字母小写, 也可以在注释后加入()来修改名字

评论