天天看点

有关Spring的知识点总结Spring

Spring

spring容器:spring框架中的一个核心模块,用于管理对象.

通过反射创建对象.

创建对象的方式:

方式一 使用无参构造器创建对象(常用)

step1:给类添加无参构造器(或缺省构造器)

step2:配置文件中配置bean. id:bean的名称,唯一 class:类的全限定名 (反射机制,需要找到类的全限定名)

step3:调用容器的getBean("id", class名.class)方法来获得对象,后面的 类名.class 用于强制转换.

方式二 使用静态工厂方法创建对象

通过调用类的静态方法来创建对象.

<bean id="cal" class="java.util.Calendar" factory-method="getInstance"></bean>      
Calender cal = ac.getBean("cal", Calendar.class);      

factory-merhod属性:指定一个静态方法

spring容器会调用这个静态方法来创建对象

方式三 使用实例工厂方法创建对象

通过调用对象的实例方法来创建对象.

<bean id="time" factory-bean="cal" factory-method="getTime"></bean>      
Date time = ac.getBean("time", Date.class);      

factory-bean属性:指定一个bean的id.

factory-method属性:指定一个方法.

spring容器会调用这个bean对应的方法来创建对象.

作用域

默认情况下一个bean只会创建一个实例.

scope属性:用来配置作用域,缺省值是singleton(单例)

​ 如果值为prototype(多例),一个bean会创建多个实例

生命周期

初始化的作用:分配资源

<bean id="" class="" init-method="init"/>      

init-method属性:指定初始化方法.

spring容器在创建对象之后,会立即调用初始化方法.

销毁

<bean id="" class="" destroy-method="destroy"/>      

destroy-method属性:指定销毁方法.

spring在关闭之前会先销毁对象,在销毁对象之前,会先调用对象的销毁方法.

spring容器的延迟加载(了解)

spring容器启动之后,会将所有作用域为单例的bean创建好.

<bean id="" class="" init-method="" destroy-method="" lazy-init=""/>      

使用延迟加载:lazy-init="true" 默认为false

IOC 控制反转

对象之间的依赖关系由容器来建立.

DI依赖注入

set方式注入

容器通过调用对象提供的set方法或者构造器来建立依赖关系

IOC是目标,DI是手段.

<bean id="b1" class="ioc.b"/>
​
<bean id="a1" class="ioc.a"> 
​
    <properties name="b" ref="b1"/>
​
</bean>
​      

properties元素:表示使用set方法来注入依赖关系.其中,name属性指定属性名,ref属性指定属性值(被注入的bean的id)

构造器方式注入

step1:配置相应的构造器

step2:constructor-arg参数注入

<bean id="b1" class="ioc.B"/>
<bean id="a1" class="ioc.A">
    <constructor-arg index="0" ref="b1">    0代表将b1传给第一个参数
</bean>      

constructor-arg用来配置构造器方式注入.

index属性指定参数的下标(从0开始).

自动装配(了解)

自动装配,指的是spring容器依据某种规则,自动建立对象之间的某种关系.

注意:

1.默认情况下,容器不会自动装配.

2.可以通过指定autowire属性来自动装配(容器仍然需要通过调用set方式或者构造器来完成依赖关系的建立)

<bean id="" class="" autowire="byName"/>      

autowire属性:表示让容器自动装配,该属性有如下三个值.

​ byName:容器根据属性名查找对应的bean,然后调用对应的set方法来完成注入.

​ 注意:

​ 1.如果找不到对应的bean,注入null.

​ 2.不可能找到多个符合条件的bean(id具有唯一性)

​ byType:

​ 容器依据属性类型查找对应的bean,然后调用对应的set方法来完成注入.

​ 注意:

​ 1.如果找不到对应的bean,注入null.

​ 2.有可能找到多个符合条件的bean,此时会报错.

​ constructor:与byType类似,不同的是调用的是对应的构造器来完成注入.

注入基本类型的值-value

<bean id="" class="">
    <property name="name" value="xxx"/>
    <property name="age" value="20">
</bean>      

注入集合类型的值

List Set Map Properties(特殊的散列,键值均为String)

1.List

<bean id="" class=""> 
    <property name="list">
        <list>
            <value>XX</value>
            <value>yy</value>
        </list>
    </property>
</bean>      

2.Set

<property name="set">
    <set>
        <value>XX</value>
        <value>yy</value>
    </set>
</property>      

3.Map

<property name="map">
    <map>
        <entry key="" value=""/>
        <entry key="" value=""/>
    </map>
</property>      

4.Properties

<property name="pro">
    <props>
        <prop key="username">striner</prop>
        <prop key="password">XXX</prop>
    </props>
</property>      

用引入的方式注入集合类型的值

<util:list id="aBean">
    <value>XX</value>
    <value>YY</value>
</util:list>
<bean id="" class="">
    <property name="a" ref="aBean"/>
</bean>      

这里的util就类似于命名空间.

作用:将集合类型的值配成一个bean,用引入的方式注入集合类型的值,可以重用.

读取.properties为后缀的文件内容

<util:properties id="const" location="classpath:XXX.properties"/>
<bean id="c" class="">
    <property name="name" value="#{c.name}"/>  <!-- 内部调用c的getName()-->
    <property name="city" value="#{c.city[0]}"/>  <!-- 0是list的下标-->
    <property name="score" value="#{c.score['英语']}"/>  <!-- '英语'是Map的key-->
    <property name="pageName" value="#{const.pageName}"/>  <!-- properties文件中的key-->
</bean>      

classpath:按照类路径来搜索.resource/ 或者WEB-INF/

spring容器会依据路径来找到对应的文件,然后读取该文件的内容读取到properties对象中.

使用注解简化配置

组件扫描 @Component("bean的id")

缺省为类名首字母小写的名

<comtext:component-scan base-package="包名">      

base-package属性:指定要扫描的包名,spring会扫描该包及其子包下面所有的类,如果该类前面有特定的注解(如@Component),则spring容器会将其纳入容器进行管理(相当于配置了一个bean元素)

有关Spring的知识点总结Spring

指定作用域 @Scope("prototype") 缺省值为单例singleton

@PostConstruct 初始化方法

@PreDestroy 销毁方法

@Lazy(true) 延迟加载

依赖注入相关的注解

@Autowired和@Qualifier

支持setter方式注入和构造器方式的注入.

当采用set方式注入式,可以将@Autowired添加到set方法前面,如果不使用@Qualifier,则容器会使用byType的方式来注入,有可能出错,所以建议使用@Qualifier注解,明确指定bean的id.

也可以将@[email protected]都加到属性前面,此时set方法可要可不要(java反射机制).

当采用构造器方式注入时,可以将该注解添加到对应的构造器前面即可.

@Resource只能处理Setter注入 开发中大部分情况都是Setter注入.

可以将该注解加到set方法前面,使用name属性指定要注入的bean的[email protected](name="")指定bean的id值.如果不指定,会按照byType的方式注入.

也可以直接加到属性前面.

@Value

<util:properties id="config" location="classpath:config.properties">      
@Component("mg")
public class Manager{
    @Value("#{config.pagesize}")
    private String pageSize;
    @Value("Striner")   //可以直接注入进本类型的值
    private String name;
}      

可以使用@Value来注入基本类型的值

也可以使用@Value注解来使用Spring表达式

也可以添加到属性前,或者添加到对应的set方法前.