spring适用范围:
- 构建企业应用(SpringMVC +Spring +Hibernate/ibatis)
- 单独使用Bean容器。(Bean管理)
- 单独使用AOP进行切面处理。
- 其他的Spring功能,如对消息的支持
- 在互联网中的应用
接口:
是一种对外的说明,内部实现对外不公开。
面向接口编程:
结构设计中,分清层次和调用关系,每层只向外(上层)提供一组功能接口,各层间只依赖接口而非实现类。接口实现的变动不影响各层间的调用。
IOC:控制反转
应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护。ioc中所有的对象都称为Bean。
DI(依赖注入):
IOC容器能够通过注入的方式把对象之间的依赖关系组织起来。
当对象a持有对象b的引用时,IOC实例化对象a和b,同时把b对象赋值给a。
配置Bean:
Bean容器的初始化:
基础:两个包
- org.springframework.beans
- org.springframework.context
- BeanFactory:提供配置结构和基本功能,加载并初始化Bean
- ApplicationContext:保存了Bean对象并在spring中被广泛使用
ApplicationContext初始化的方式:
- 本地文件
- Classpath
- web应用中依赖servlet或listener
spring注入:
spring注入是指在启动spring容器加载bean配置的时候,完成对变量的赋值行为。
常用的两种注入方式: - 设值注入 通过set方法,必须有set方法才能使用这种注入
- 构造注入 必须有带有该参数的构造方法才能使用这种注入
Bean 装配:
- Bean配置项
- Bean的作用域
- Bean的生命周期
- Bean的自动装配
- Resources&ResourceLoader
Bean配置项
- id 唯一标识
- class 具体实例化的类
- Scope 范围 作用域
- Constructor arguments 构造器的参数
- Properties 属性
- Autowiring mode 自动装配模式
- lazy-initialization mode 懒加载模式
- initialization/destruction method 初始化和销毁的方法
Bean的生命周期:
Bean的初始化
- 实现org.springframework.beans.factory.InitializingBean接口,覆盖afterPropertiesSet方法。
- 配置init-method 如下,该Bean要有该方法。
Bean销毁: - 实现org.springframework.beans.factory.DisposableBean接口,覆盖destory()方法。
- 配置destory-method 如下,该Bean要有该方法
Aware接口:
Spring 提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应的资源。
通过Aware接口,可以对Spring相应的资源进行操作(慎重)
为对Spring进行简单的扩展提供了方便的入口
ApplicationContextAware:获取容器上下文对象
BeanNameAware:获取当前Bean name
Bean的自动装配:
byName: 通过setter方法注入
byType:通过setter方法注入
Constructor:通过构造方法注入
Resources:
针对资源文件的统一接口
容器中所有的application context 都实现了ResourcesLoader接口
classpath:
file:
url:
Bean管理之注解:
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载
@Async异步方法调用
原注解:
即注解的注解
@Service 继承了 @Component注解的所有功能
自动扫描注册Bean:
context标签:
context:component-scan 标签:
自动检测并将Bean注册到容器
使用过滤器自定义扫描规则:
include-filter:包含某规则的过滤器 type=“regex” 规则类型:通配符
exclude-filter:排除某规则的过滤器 type=“annotation” 规则类型:注解
类注解设置bean name:
类注解包含 Component,Service,Repository,Controller等,这些注解都有name属性显示的设置Bean Name.相当于Bean标签里的id。
没有显示的指定name时,会根据BeanNameGenerator自动生成bean name.通常的规则是把类名第一个字母小写。
可以自定义bean name生成规则
作用域注解:@Scope
@Required注解:
@Required注解适用于Bean属性的setter方法
这个注解仅仅表示,受影响的Bean属性必须在配置时被填充,通过在Bean定义或通过自动装配一个明确的属性值。
**@Autowired 注解:**自动装配
可以将Autowired 注解在传统的setter方法上,也可用于构造器或成员变量。
自动为数组注入 该类型的所有实现类或子类。
@Order(value=1/2…)注解:
使用Autowired注解数组时,数组内对象按照order注解的value值排序。
@Qualifier注解:
当按类型自动装配可能多个Bean实例的情况,可以使用spring的@Qualifier注解缩小范围(或指定唯一),也可以用于指定单独的构造器参数或方法参数。
可用于注解集合类型变量
如下只装载id="main"的MovieCatalog对象
Qualifier 例子:
基于java的容器注解:
@Bean:
@Bean标识用于配置和初始化一个由springIOC容器管理的新对象的方法,类似于XML配置文件的Bean.
通常与@Configuration注解一起使用。
如上相当于
如下Bean name = “getStringStore”
@ImportResource 和 @Value 注解 对资源文件进行读取。
context:property-placeholder 加载资源文件,使得当前配置文件里可以引用该资源文件内容
通过注解来代替上述配置文件
Store接口的两个实现类 StringStore 和 IntegerStore
基于泛型自动装配的例子:
@Resource注解:
spring对JSR支持的例子:
以下在成员变量 或 setter方法上的@Resource注解 ,都能将JsrDAO对象注入。
加入另外两个 初始化 和 销毁 的注解:
@Named注解 例子:
如果JsrDAO是一个接口,请用@Named注解指定一个他的实现类。
注解总结:
利用注解自动装配注入时,先要配置
<context:component-scan base-package=“com.spring” />
如:
@Resource注解与@Autowired注解作用非常相似,Autowired属于Spring注解,Resource属于J2EE注解,是java自带的。
@Autowired注解在指定名称时,使用@Qualifier来指定,@Resource注解可直接指定@Resource(name=“tiger”)
@Resource默认按照name去匹配,找不到再按照type去匹配。
@Autowired默认按照type去匹配。