spring从头开始,笔记

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>

猜你喜欢

转载自charleseye.iteye.com/blog/2282170