2016-3-11
spring是个轻量级框架,可以简发web开发步骤,可以替代传统的EJB技术。
IOC容器:Inversion of control;
通过反射的方式在IOC容器中创建bean,所以要求bean必须有无参的构造函数
主要接口ApplictionContext,
主要实现类ClassPathXmlApplicationContext(从类路径加载文件),
FileSystemXmlApplicationContext(文件系统加载文件)
autowire(自动装配),byName(按照bean名字和setName属性查找),byType(按照bean类型查找)
bean的作用域:scope
1.singleton(默认)只创建一次实例。
2.prototype每次请求都创建实例。
3.request(每次Http请求都会创建一个bean实例,只在WebApplicationContext有效),
4.session(每创建一个HttpSession就会创建一个bean实例,只在WebApplicationContext有效)
Spring SpEL
Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。
语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL
SpEL 为 bean 的属性进行动态赋值提供了便利
通过 SpEL 可以实现:
通过 bean 的 id 对 bean 进行引用
调用方法以及引用对象中的属性
计算表达式的值
正则表达式的匹配
字面量的表示:
整数:<property name="count" value="#{5}"/>
String 可以使用单引号或者双引号作为字符串的定界符号:<property name=“name” value="#{'Chuck'}"/> 或 <property name='name' value='#{"Chuck"}'/>
bean的生命周期
<bean init-method="" destroty-method="">
<!--导入属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- bean后置处理器 -->
<!--实现BeanPostProcessor接口并实现两个方法:
Object postProcessBeforeInitialization(Object bean, String beanName) init-method之前被调用
Object postProcessAfterInitialization(Object bean, String beanName) init-method之后被调用
配置 bean
配置形式:基于 XML 文件的方式;基于注解的方式;
Bean 的配置方式:通过全类名(反射)、通过工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean
<!--通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例
class:静态工厂全类名
factory-method:静态工厂方法
constructor-arg:如果静态工厂方法要传参数,使用constructor-arg来配置
-->
<bean id="car1" class="com.t.spring.beans.factory.StaticFactory"
factory-method="getFactory">
<constructor-arg value="audi"></constructor-arg>
</bean>
<!--工厂实例 -->
<bean id="carFactory" class="com.t.spring.beans.factory.InstanceFactory"></bean>
<!--实例工厂方法配置bean -->
<bean id="car2" class="com.t.spring.beans.factory.Car"
factory-bean="carFactory" factory-method="instanceFactory">
<constructor-arg value="ford"></constructor-arg>
</bean>
<!--通过FactoryBean配置bean实例,但实际返回的是getObject返回的实例 -->
实现FactoryBean接口
public class CarFactoryBean implements FactoryBean<Car> { private String brand; public void setBrand(String brand) { this.brand = brand; } @Override public Car getObject() throws Exception { // TODO 自动生成的方法存根 return new Car(brand,500000); } @Override public Class<Car> getObjectType() { // TODO 自动生成的方法存根 return null; } @Override public boolean isSingleton() { // TODO 自动生成的方法存根 return false; } }
<bean id="car" class="com.t.spring.beans.factorybean.CarFactoryBean">
<property name="brand" value="BMW"></property>
</bean>
(配置bean形式基于注解方式)
spring特定组件:@Component、@Controller、@Service、@Repository
对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称
当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件中声明 <context:component-scan> :
base-package 属性指定一个需要扫描的基类包,Spring 容器将会扫描这个基类包里及其子包中的所有类.
当需要扫描多个包时, 可以使用逗号分隔.
如果仅希望扫描特定的类而非基包下的所有类,可使用 resource-pattern 属性过滤特定的类,示例:
<context:component-scan base-package="com.t.spring.beans.annotation"
resource-pattern="repository/*.class">
</context:component-scan>
<context:include-filter> 子节点表示要包含的目标类
<context:exclude-filter> 子节点表示要排除在外的目标类
<context:component-scan> 下可以拥有若干个 <context:include-filter> 和 <context:exclude-filter> 子节点
<context:include-filter> 和 <context:exclude-filter> 子节点支持多种类型的过滤表达式:
类别:annotaion (常用)
示例:com.t.XxxAnnotation
说明:所有标注了XxxAnnotation的类。该类型采用目标类是否标注了某个注解进行过滤
类别:assignable (常用)
示例:com.t.XxxService
说明:所有继承或扩展XxxService的类。该类型采用目标类是否继承或扩展某个特定类进行过滤
类别:aspectj
示例:com.t..*Service+
说明:所有类名以Service结束的类及继承或扩展它们的类。该类型采用AspejctJ表达式进行过滤
类别:regex
示例:com.\t\.anno\..*
说明:所有com.t.anno包下的类。该类型采用正则表达式根据类的类名进行过滤
类别:custom
示例:com.t.XxxTypeFilter
说明:采用XxxTypeFilter通过代码的方式定义过滤规则。该类必须实现org.springframework.core.type.TypeFilter接口
组件扫描
<context:component-scan base-package="com.t.spring.beans.annotation"
</context:component-scan>
相关属性:
<context:component-scan resource-pattern="repository/*.class" />
type=annotation
<!--排除指定的annotation组件 -->
<context:component-scan base-package="" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan> -->
<!--包含指定的annotation组件 需要加上属性use-default-filters="false" 并且为false -->
<context:component-scan base-package="com.t.spring.beans.annotation" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan> -->
type=assignable
<context:component-scan base-package="com.t.spring.beans.annotation" use-default-filters="false">
<context:include-filter type="assignable" expression="com.t.spring.beans.annotation.repository.UserRepository"/>
</context:component-scan>
<context:component-scan base-package="com.t.spring.beans.annotation" >
<context:exclude-filter type="assignable" expression="com.t.spring.beans.annotation.repository.UserRepository"/>
</context:component-scan>