有关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元素)
指定作用域 @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">
"mg") (public class Manager{ "#{config.pagesize}") ( private String pageSize; "Striner") //可以直接注入进本类型的值 ( private String name; }
可以使用@Value来注入基本类型的值
也可以使用@Value注解来使用Spring表达式
也可以添加到属性前,或者添加到对应的set方法前.