1. 前言
Spring的核心技术IOC(Intorol of Converse控制反转)的实现途径是DI(dependency Insert依赖注入)。而依赖注入(DI)的实现方式又有两种,xml方式和注解方式。如下图所示:
什么是属性注入
属性注入就是在实例化对象时,同时向对象中的属性进行相应的赋值。
即,通俗点说,属性注入就是给类中的属性赋值。
属性注入的方式
可以通过配置xml文档或者使用注解来实现属性的自动注入
通过xml文档
set注入和构造注入
set方法注入
- 前提条件:需要在配置的类中有对应属性的set方法
<!-- set方法注入属性-->
<bean id="user" class="com.liu.test.User">
<property name="name" value="root"/>
<property name="password" value="666666"/>
<property name="uid" value="0000000001"/>
</bean>
- property 即属性
- name 即属性名,是在类中要注入的属性的名称
- value 要注入的值
- ref 引用值,引用其他的bean
通过注解来实现属性的自动注入
先了解一下自动注入
自动注入
所谓spring自动注入,是指容器中的一个组件中需要用到另一个组件(例如聚合关系)时,依靠spring容器创建对象,而不是手动创建.
autowire属性
<bean id="person" class="class" autowire="*">
autowire属性有如下六个取值,他们的说明如下:
- No:即不启用自动装配。Autowire默认的值。
- byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。Spring IoC容器会在配置文件中查找id/name属性与被注入属性名的名字的bean,然后使用Set方法为其注入。(如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生,也可以通过设置)
- byType:通过属性的类型查找JavaBean依赖的对象并为其注入。Spring IoC容器会查找Class属性为与被注入属性相同的bean,使用Set方法为其注入。
- constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Set方法注入,而是使用构造子注入。
- autodetect:在byType和constructor之间自动的选择注入方式。
- default:由上级标签的default-autowire属性确定。
注解 | 使用场景 | 说明 |
---|---|---|
@AutoWired | 可以应用于构造函数,注解类型, 方法,方法中的参数,字段或属性 | 根据属性类型自动装配 |
@Qualifier | 可以应用于类的任何元素,注解类型, 方法,方法中的参数,字段或属性 | 根据属性的名称注入要和 |
@Value | 可以应用于,注解类型, 方法,方法中的参数,字段或属性 | 注入普通类型属性 |
@Autowired
加上属性上,表示这个属性被自动注入了
@Qualifier(value=“*”)
加上属性上,q是指定自动装配哪个类型的文件
@Value(“*”)
加上属性上,表示这个属性在生成的时候注入“*”的值
@Autowired
//q是指定自动装配哪个类型的文件
@Qualifier("bookDao2")
private BookDao bookDao ;
3. 什么情况下要使用自动注入?
在我们学习完set注入和构造注入之后,我们可能会发现,要是某个类的引用属性,也是其他类的属性的时候,若我们使用大量的使用去给其他类的这个引用属性赋值,就会显得十分的冗余。如下所示:
<bean id="bookDao" name="bookDaoBM" class="com.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory">
<property name="connectionNum" value="6"></property>
<property name="databaseName" value="ltx"></property>
</bean>
<bean id="bookService" name="bookServiceBM bookEbi" class="com.service.impl.BookServiceImpl">
<!--7.配置server 与dao的关系
property 标签表示配置当ibean的属性
name届性表示阅置哪一个具体的属性
ref属性表示参照哪个bean
相当于我声明了bookService中有bookDao这个类
-->
<property name="bookDao" ref="bookDao"></property>
</bean>
上面的写法就很冗余,那么有简单的写法吗?当然有,这种简便的方法就是自动注入。
byName和byType自动注入的使用要求:
必须依赖set()方法,也就是说只支持对set注入方式的简写。
具体的byName和byType的使用细节看 Spring中自动注入的两种方式
setter注入和构造器注入方式可以看spring学习----bean02:bean依赖注入、自动装配和集合注入