Spring的依赖注入方式
- 设值注入(底层通过反射调用set方法)
1.普通属性注入(基本数据类型和字符串类型)
<bean id="star" class="com.hxh.pojo.Star">
<!--基本数据类型和字符类型用value属性赋值-->
<property name="id" value="14"></property>
<property name="name" value="小白白"></property>
</bean>
2.域属性注入
基本数据类型和字符串用value赋值,域属性(对象属性)用ref
<bean id="partner" class="com.hxh.pojo.Partner">
<property name="pname" value="宋轶"></property>
</bean>
<bean id="star" class="com.hxh.pojo.Star">
<property name="id" value="15"></property>
<property name="name" value="胡歌"></property>
<!--自定义类型用ref-->
<property name="partner" ref="partner"></property>
</bean>
3.p命名空间注入
<!--p命名空间注入-->
<bean id="partner" class="com.hxh.pojo.Partner">
<property name="pname" value="赵露思"></property>
</bean>
<bean id="star" class="com.hxh.pojo.Star" p:id="16" p:name="肖战" p:partner-ref="partner"></bean>
4.集合属性注入
private String[] myArrays;
private Set<String> mySets;
private List<Partner> myLists;
private Map<String,Object> maps;
private Properties myProps;
注册相对应的bean
<bean id="someColltion" class="com.hxh.pojo.SomeColltion">
<property name="myArrays">
**<array>**
<value>京东</value>
<value>阿里巴巴</value>
<value>腾讯</value>
</array>
</property>
<property name="mySets">
**<set>**
<value>Java工程师</value>
<value>运营</value>
<value>数据分析师</value>
</set>
</property>
<property name="myLists">
**<list>**
<ref bean="partner"></ref>
</list>
</property>
<property name="maps">
**<map>**
*<entry key*="qq" **value**="666"></entry>
<entry key="微信" value="182340807790"></entry>
</map>
</property>
**同map 但是要将值写在标签之间**
<property name="myProps">
**<props>**
<prop **key="email"**>
666@qq.com
</prop>
</props>
</property>
</bean>
5.域属性自动注入
- byName:要求注入的bean的id必须和被注入的对象的属性名一致
<bean **id="partner"** class="com.hxh.pojo.Partner">
<property name="pname" value="古力娜扎"></property>
</bean>
<bean id="star" class="com.hxh.pojo.Star" **autowire="byName"**>
<property name="id" value="18"></property>
<property name="name" value="小仙女"></property>
</bean>
- byType:容器中与注入的bean的类型具有is-a关系的类只能有一个,就是不能具有继承关系或实现关系
<bean id="partner" class="com.hxh.pojo.Partner">
<property name="pname" value="古力娜扎"></property>
</bean>
<bean id="star" class="com.hxh.pojo.Star" **autowire="byType"**>
<property name="id" value="18"></property>
<property name="name" value="小仙女"></property>
</bean>
- 构造注入(底层带参构造器完成注入)
1.在被注入的bean中提供带参构造器
2.构造注入
<bean id="partner" class="com.hxh.pojo.Partner">
<property name="pname" value="宋轶"></property>
</bean>
<bean id="star" class="com.hxh.pojo.Star">
**<constructor-arg** name="id" value="19"></constructor-arg>
<constructor-arg name="name" value="小白"></constructor-arg>
<constructor-arg name="partner" ref="partner"></constructor-arg>
</bean>
除了name属性还有type属性:type指的是构造器中参数的类型,为类型的全限定路径
<bean id="star" class="com.hxh.pojo.Star">
<constructor-arg type=**"java.lang.Integer**" value="19"></constructor-arg>
<constructor-arg type="java.lang.String" value="小白"></constructor-arg>
<constructor-arg type="com.hxh.pojo.Partner" ref="partner"></constructor-arg>
</bean>
index属性:index是构造器中的参数的索引号,从0开始;
<bean id="star" class="com.hxh.pojo.Star">
<constructor-arg **index="0"** value="19"></constructor-arg>
<constructor-arg index="1" value="小白"></constructor-arg>
<constructor-arg index="2" ref="partner"></constructor-arg>
</bean>
直接写name属性,顺序必须和构造器中的顺序一致,可读性较差
<bean id="star" class="com.hxh.pojo.Star">
<constructor-arg value="19"></constructor-arg>
<constructor-arg value="小白"></constructor-arg>
<constructor-arg ref="partner"></constructor-arg>
</bean>
以上第一种较为常用
- 基于注解注入
1.环境搭建:导入aop包、添加context约束头信息(组件扫描器)
2.常用注解:@Component、@Scope、@Value、@Resource、@Autowired
/**
* 与@Component具有相同功能的还有其他三个注解
* @Repository:该注解添加在DAO实现类上
* @Service:该注解添加在Service实现类上
* @Controller:该注解添加在Controller类上
*
*/
@Component("myStar") //表明当前类是spring容器中的组件,它的生命周期交给spring管理.其中myStar相当于<bean/>中的id属性
@Scope("prototype")
public class Star {
@Value("25") //普通属性的注入
private int age;
@Value("郭靖")
private String name;
//关联属性
//@Resource 域属性注入
//@Autowired //域属性注入 :byType方式
@Autowired
@Qualifier("myPartner") //byName方式
private Partner partner;
@Override
public String toString() {
return "Star [age=" + age + ", name=" + name + ", partner=" + partner + "]";
}
}
配置文件中注册主键扫描器
<!--注册主键扫描器-->
<**context:component-scan** base-package="com.hxh.pojo"></context:component-scan>