IOC(控制反转)也可以称之为DI(依赖注入):
控制反转:将创建对象、属性值的方式进行了翻转,从new、setXxx(),_翻转为了_从springIOC容器getBean()
依赖注入:将属性值注入给了属性,将属性注入给了bean,将bean注入给了ioc容器;
三种方式的依赖注入、给各种集合类型的属性注入
DI(依赖注入):举例说明:有两个类一个是Teacher、一个是Course,其中Course类中依赖于Teacher类,里面有教师的信息,这时候写配置文件xml的时候就可以写两个<>标签,其中Course类中含有Teacher类;
- IOC容器赋值:
- 如果是简单的Java类(8个基本类型+String),value;
- 如果是对象类型,ref = "需要引用的id值" ,因此实现了对象与对象之间的依赖关系;
- 依赖注入的3种方式:
- set注入:通过setXXX()赋值,依赖注入底层是通过反射完成的;使用标签的关键字是<property....>
- 构造器注入:通过构造方法赋值;使用标签的关键字是<constructor-arg.>,需要注意注入属性的顺序应该和构造方法属性的顺序一致,如果不一致要设置type、name或index进行指定;
- p 命名空间注入:首先要引入命名空间xmlns:p=....;然后直接在bean标签进行属性赋值;简单类型可以直接p:属性名="属性值",引用了类型(除了String)要通过p:...-ref="属性值";注意p之间有空格;
方式一:
方式二:
方式三:
注入各种集合数据类型:list set map properties 也是可以的;
set 、list、数组各自有各自的标签<set>、<list>、<array>,但是也可以混着用;
map使用<map> 搭配 <entry>标签
特殊值的注入问题和各种类型的自动装配:
- value与<value>注入方式的区别:
其中赋值"" 或者null的时候,"" 可以直接不在标签中写值,null 的时候没有value值,并且要写成 <null/> 的形式;
在 IOC 容器中定义 bean 的前提,该 bean 的类必须提供了无参构造;
自动装配(只适用于 ref 类型):可以不再使用<>标签给course类中的teacher进行赋值,而是直接在bean中添加一个 autowire = "byName" 进行自动装配;自动装配虽然可以降低代码量,但是会降低程序的可读性,使用时需要谨慎;
<bean ... class=" org.lanqiao.entity.Course" autowire="byname || bytype || constructor”> byName 本质是 byld
byName:自动寻找其他bean的id值 = 该Course类的属性名
byType:其他bean的类型(class)是否与该Course类的ref属性类型一致,但是如果有多个类型一致会出现问题;
constructor:其他bean的类型(class)是否与Course类旳构造方法参数的类型一致;
如果想以后给所有的bean标签自动装配,可以在头beans中写入:
使用注解定义bean:通过注解的形式,将bean以及相应的属性值放入IOC容器中;
范例:
首先扫描该包有没有注解,如果有注解就把它放到IOC里面去;注解使用 @ 符号;
- 如果不清楚要用哪一层时使用:@Component 细化:
- 如果很清楚在哪一层时:dao层注解--@Repository;service层注解:@Service;控制器层注解:@Controller;
使用注解实现声明式事务:
- 引入架包;
- 配置:在xml文件中增加必要代码,<!--增加对事物的支持--> <tx:annotation-driven transaction-manager="txManager" />
- 使用:将需要成为事务的方法前面加上注解,@Transactional (readOnly=false,propagation=Propagation.REQUIRED) 要么都成功,要么都失败;