Spring Ioc DI
DI:依赖注入(Dependency Injection)
这个注入可以理解为给对象赋值
基于XML的DI
设值注入
设值注入,底层使用的是pojo类的get和set方法,所以说实体类要写了get和set方法才能是用设值注入
- 简单数据类型和引用数据类型注入
<bean id="star" class="top.byfree.pojo.Star">
<!--简单数据类型用value-->
<property name="name" value="jelly"/>
<property name="age" value="17"/>
<!--引用数据类型要用ref关联其他的bean-->
<property name="partner" ref="partner"/>
</bean>
property标签的属性
属性 | 作用 |
---|---|
name | 标识要注入的属性名称,用来找set方法 |
value | 标识要注入简单数据类型的值 |
ref | 标识要注入的引用类型的bean的id |
- 集合属性注入
集合注入和值注入不怎么一样需要用到property下的子标签
数组的注入演示
<bean id="testService" class="top.byfree.pojo.testservice">
<property name="myArray">
<array>
<value>张三</value>
<value>李四</value>
</array>
</property>
</bean>
集合 | 使用标签 | 标签子标签格式 | 补充 |
---|---|---|---|
Array | array | <value>张三</value> | value或ref取决于是否是引用类型 |
List | list | <value>李四</value> | value或ref取决于是否是引用类型 |
Set | set | <ref bean="partner"/> | value或ref取决于是否是引用类型 |
Map | map | <entry key="qq" value="1416629681"/> | key-value就相当于map中的key-value |
Properties | props | <prop key="兴趣">足球</prop> | 无 |
- 域属性自动注入
分为局部设置和全局设置
其实就是针对引用类型的自动注入
局部设置
在要设置的bean标签上添加autowire属性
标签属性
属性 | 作用 | 注意 |
---|---|---|
byName | 设置关于id的自动注入 | 注入的id必须和被注入的属性名一致 |
byType | 设置关于类型的自动注入 | 该类型的bean只能有一个不然会报错 |
全局设置
在beans标签上添加default-autowire标签并填写属性值位byName或者byType
- 空字符串或null注入
空字符串
在property标签的value中写“”即可或者不写value标签,为property标签添加子标签<value/>
<property name="name">
<value/>
</property>
null
为property标签添加子标签<null/>
<property name="name">
<null/>
</property>
构造注入
构造注入要求必须要有全参构造器,不要忘写无参构造器
构造注入不在使用property标签而是使用constructor-arg标签表示构造其中的形参
- 基于形参名的设置
<bean id="star" class="top.byfree.pojo.Star">
<constructor-arg name="name" value="小胖" />
<constructor-arg name="age" value="18" />
<constructor-arg name="partner" ref="partner" />
</bean>
这里的name和value或者ref和之前的property标签的含义一致
- 基于形参顺序的设置
<bean id="star5" class="top.byfree.pojo.Star">
<constructor-arg index="0" value="小胖" />
<constructor-arg index="1" value="18" />
<constructor-arg index="2" ref="partner2" />
</bean>
index 表示形参是第几个
- 自动设置
<bean id="star5" class="top.byfree.pojo.Star">
<constructor-arg value="小胖" />
<constructor-arg value="18" />
<constructor-arg ref="partner2" />
</bean>
不写name和index也可以自动绑定,但是这里的constructor-arg标签顺序要和构造器形参里的完全对应
基于注解的DI
添加注解扫描
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
新的dtd约束
代码
<context:component-scan base-package="top.byfree.pojo"/>
@Component注解
使用在实体类上面,用于将这个类交给spring容器管理
@Component("myPartner")
public class Partner {
}
可以传参数,相当于赋予其id
@Value注解
用于注入一个基本类型的属性
@Value("jelly")
private String name;
@Autowired注解
用于注入一个引用属性的值
@Autowired
private Partner partner;
默认是用byType的方式,可以再次添加@Qualifier注解使其变为byName的方式
@Autowired
@Qualifier("myPartner")
private Partner partner;
@Resource注解
也是用于注入一个引用属性的值
区别于Autowired,Autowired是spring包下的注解而且会线以byType,而Resource是jdk包下的而且默认是用byName只有找不到匹配的name后才会是用byType
@Resource
private Partner partner;
和@Component相同功能的还有3个注解
@Repository注解:该注解添加在DAO实现类上
@Service注解:该注解添加在Service实现类上
@Controller注解:该注解添加在Controller类上
@Scope注解
通过注解设置作用域
prototype或者singleton
@Component
@Scope("prototype")
public class Star implements Serializable {
}
Q.E.D.