Spring IOC
一、基本概念
- IOC全称Inversion of Control (控制反转),也称作DI(
Dependency Injection) 依赖注入
- Spring 是一个开源框架.
- Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能.
- Spring 是一个 IOC(DI) 和 AOP 容器框架.
- Spring IOC 的功能有: 依赖注入,依赖检查(不使用,因为其需要用户自己查找API),自动自动装配,支持集合,指定初始化方法和销毁方法,支持接口回调(定义spring接口)
- Spring的特点:轻量级.依赖注入.面向切面编程.容器.一站式
- 面向切面编程就是将程序中经常使用到的功能抽取出来形成独立于程序业务逻辑的一个切面。当程序用到的时候不需要修改原来的程序业务代码就可以将切面里的功能嵌入到程序里面。Spring AOP面向切面编程就可以实现这样的功能,通过Spring AOP可降低程序的耦合性。(如何抽取想要的对象功能)
- 控制反转是一种思想,以前我们是自己创建对象,在程序中直接获取对象。IOC容器则有一个专门的容器来创建对象,由IOC容器来控制对象的创建。反转则是由于传统上是由我们自己主动控制对象的获取,现在是IOC容器来创建和注入依赖对象,我们为您只是被动的接受容器给我们查找的对象的。
- 依赖注入是应用程序依赖IOC容器 ,因为应用程序需要IOC提供的对象,IOC容器注入应用程序的某个对象,注入的是对象的外部资源。有两种途径实现依赖注入:通过配置XML文件和通过Annotation(注解)方式
- 容器所为SpringIOC的核心它主要有两种:
BeanFactory:BeanFactory为IOC容器提供了基础功能,仅为了向后兼容老的版本
ApplicationContext:ApplicationContext是BeanFactory的子接口(通过API文档查找)
- ApplicationContext的实现有四种方式:
FileSystemXmlApplicationContext:加载配置文件的时候采用的是项目的路径。
ClassPathXmlApplicationContext:加载配置文件的时候根据ClassPath位置。
XmlWebApplicationContext:在Web环境下初始化监听器的时候会加载该类。
AnnotationConfigApplicationContext:根据注解的方式启动Spring 容器。
- SpringDI 构造方法注入 ,setter方法注入,接口注入(程序所有的对象都必须在容器里。程序不同对象之间相互调用,会产生循环依赖,用setter方法)
二、spring开发环境的搭建
下载 springsource-tool-suiute 地址http://spring.io/tools/sts/all
在eclipse中选择help--Install New Software--add--选择springsource的位置--选择标有IDE的四个组件并且在下方选项中不选最后一项--finish--弹出会话框重启eclipse--建立工程--引入jar包(第一个包内找到其中的四个jar包)
三、IOC容器及Bean的配置
- SpringIOC 以XML途径
每个Bean标签就是一个对象。通过ID(Mame)和Class来定位一个类。Spring生成对象的过程 是用反射机制完成的。
SpringIOC容器Bean的生命周期是Bean的初始化方法被调用到销毁方法被调用
如果定义了一个抽象类,则他不能通过Spring容器拿到,我们可以通过继承方式,子类可以获取父类定义的属性。还可以用集合类的并集。
除了三种注入方式以外还有depends-on 当两个对象依赖关系并没有很直接,只是需要其中的一个参数时
Spring配置文件时还可以引用外部属性文件 value=${var}
SpringIOC容器默认是在容器初始化的时候就会加载所有的Bean。也可以通过指定lazy-init让Spring实现懒加载,即只有在调用的时候才会添加到容器内部。另外还有Request 和Session适用于WebApplicationContext环境
Spring的Bean默认都是单例模式的,即每次取出来的对象都是同一个,通过定义scope = proto type来实现多例模式。
SpEL表达式(Spring表达语言)语法类似于EL,使用#{}作为定界符 SpEL为Bean的属性进行动态赋值提供便利,其作用是:通过id对Bean进行引用,调用方法以及引用对象中的属性,计算表达式的值,正则表达式的匹配
注入基本数据类型对象的方式有两种:<property name="" value/ref=""/>//<property name=""><value>值</value></property>
构造器注入:Spring默认是通过构造方法来注入。即若想将对象A注入到对象B,A的属性值通过构造方法注入B中,要在xml文件中B对象中定义标签 <constructor-arg name= "" ref="" />
setter方法注入:直接使用property标签的方式注入。所有的成员变量必须实现它的setter方法
Collection注入
自动装配:使用autowire 有byType和byName两种 Constructor与byType的方式类似装配是装配Bean中的 所有对象
- 通过Annotation
Classpath自动扫描Bean组件 base-package为需要扫描的包(含子包)。
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。