在spring框架中有两个重要的特征即:控制反转(IOC)和面向切面(AOP)
什么是IOC
IOC:即控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护
DI(依赖注入)是其一种实现方式 目的:创建对象并且组装对象之间的关系 ioc容器会帮助我们自动创建对象
IOC作用:找IOC容器-容器返回对象-使用容器
DI-IOC的另一表达,即组件以一些预先定义好的方式接受来自如容器的资源注入
在spring容器中默认仅存在一个Bean实例,Bean以单实例的方式存在,即无论实例化多少个bean对象它们的引用都是相等的
什么是DI
DI即依赖于某种方法给Bean的属性赋值,DI有三种赋值方式
- 属性注入 构造器set方法注入 通过xml文件中<property name="属性名" value="属性值"></property>或p属性注入
- 构造器注入 <constructor-arg value="属性值" index="构造器中下标位置(可省)"></constructor-arg>//构造器注入资源时按顺序进行
- 工厂注入
配置Spring配置文件
- 通过<property>标签注入
<bean id="person1" class="summer.spring.bean.Person">
<property name="name" value="zhangsan"></property>
<property name="age" value="12"></property>
</bean>
name属性的值对应javaBean中定义的属性,value即为要给属性赋的值
- <constructor-arg index>顺序注入
<bean id="car1" class="summer.spring.bean.Car" >
<constructor-arg value="奔驰" index="0"></constructor-arg>
<constructor-arg value="德国" index="1"></constructor-arg>
<constructor-arg value="3000000.0" index="2"></constructor-arg>
</bean>
index索引对应javaBean中第几个属性,从0开始
- 从外部属性文件中注入
配置properties文件,与Bean的属性相对应
personName=\u674E\u56DB\u5F20\u4E09
personAge=55
配置Spring文件
<context:property-placeholder location="classpath:Person.properties"/>通过context:property-placeholder标签引入
<bean id="person1" class="spring2.bean.Person" >
<property name="name" value="${personName}"></property>
<property name="age" value="${personAge}"></property>
</bean>
${}是SPEL表达式,其中的值与properties文件定义的属性值匹配。
bean的引用
当一个对象内中包含另一个对象时在配置文件中可以通过<ref>元素或ref属性为 Bean 的属性或构造器参数指定对Bean的引用(id),也可以在属性或构造器里包含Bean的声明,这样的Bean称为内部Bean
<bean id="car1" class="summer.spring.bean.Car">
<constructor-arg value="奔驰" index="0"></constructor-arg>
<constructor-arg value="德国" index="1"></constructor-arg>
<constructor-arg value="3000000.0" index="2"></constructor-arg>
</bean>
<bean id="person1" class="summer.spring.bean.Person">
<property name="name" value="zhangsan"></property>
<property name="age" value="12"></property>
<property name="car" ref="car1"></property>
</bean>
id值在整个spring配置文件中是唯一的!!!
引用集合
一个对象中包含另一个对象的集合时可以通过List、Map标签配置
<bean id="person1" class="summer.spring.bean.Person">
<property name="name" value="zhangsan"></property>
<property name="age" value="12"></property>
<property name="cars" >
<list>
<bean class="summer.spring.bean.Car">
<constructor-arg value="奔驰" index="0"></constructor-arg>
<constructor-arg value="德国" index="1"></constructor-arg>
<constructor-arg value="3000000.0" index="2"></constructor-arg>
</bean>
<bean class="summer.spring.bean.Car">
<constructor-arg value="BMW" index="0"></constructor-arg>
<constructor-arg value="德国" index="1"></constructor-arg>
<constructor-arg value="2990000.0" index="2"></constructor-arg>
</bean>
</list>
</property>
</bean>
Spring的继承
<bean id="car1" class="spring2.bean.Car" >
<property name="type" value="BMW"></property>
</bean>
<bean id="person1" class="spring2.bean.Person" autowire="byType">
<property name="name" value="小明"></property>
<property name="car" ref="car1"></property>
</bean>
<bean id="person2" parent="person1"></bean>
person2继承了person1的所有属性,当自身属性于父类不一样时可以重新在<property>标签中定义自己的属性值,将会覆盖父类原有的属性值。注意abstract和autowire的属性不会被子Bean继承
抽象Bean
<bean id="abstractPerson" abstract="true" >
<property name="name" value="tom"></property>
<property name="car" ref="car1"></property>
</bean>
抽象Bean并不是一个只是存在的Bean,而是一个具有相同一类属性的Bean的一个模板,class属性可以去掉,于java中抽象类非常类似