Spring依赖注入学习总结

对容器中的Bean进行管理几乎是Spring框架最重要的工作,本文总结了依赖注入相关的初级知识,面向初学者。

一、Spring中的DI的两种方式
1、setter方式
为依赖的类编写setter方法,配置文件中编写<property name="" value=""/>或者<property name="" ref=""/>
2、构造方法方式
默认情况下,Spring总是通过调用Bean的无参构造方法来创建新的实例,因此如果不使用这种方式来完成DI,必须保证Bean有可用的无参构造函数。
这种方式正好是驱动Spring执行带参构造函数,此时不需要为依赖的类编写setter方法,配置文件中则编写<constructor-arg value=""/>或者<constructor-arg ref=""/>。
在注入基本类型时,可能需要明确指定注入值的类型,像这样<constructor-arg value="100" type="int"/>

注1:复杂的依赖关系推荐使用setter方式,依赖关系比较稳定或者担心被修改则可以使用构造方法来完成注入。推荐以前者为主,后者为辅。

注2:为了更好地进行解耦,Spring推荐面向接口进行编程。简单地说,如果A类依赖B1类,B1类实现的接口是IB,那么在A类中尽量写IB,如果有一天需要将A类依赖的B1类替换为B2类,则可以通过仅修改配置文件来达到目的。

二、配置注入的内容
由于Java类的属性可以是各种类型,所以Spring的DI也必须能够支持,不管是那种方式进行注入,指定参数的元素可以是:value、ref、bean、list、set、map、props。
1、value
属性类型是基本类型、String、日期时候可以使用,需要注意的是不建议通过配置文件管理基本类型的属性值。
2、ref
依赖的属性是其它Bean时使用。
同样是达到这个目的,Spring支持自动装配,可以通过<beans.../>的default-autowire或者<bean.../>的autowire属性指定。
这两个属性可以接受的值有:no、byName、byType、constructor、autodetect。
注:使用byType时,多余的同类型的实例会引发Spring抛异常。
3、bean
使用ref时必须为依赖的Bean配置id属性,如果这个Bean仅仅使用一次,可以将其直接嵌套到依赖它的地方:
<property name="">
    <bean class=""/>
</property>
4、list
假定没有指定泛型参数:
<list>
    <value>xx</value>
    <bean class=""/>
    <ref bean=""/>
</list>
list除了可以为集合注入也可以为数组注入,配置方式一模一样。
5、map
假定没有指定泛型参数:
<map>
    <entry key="" value=""/>
    <entry key-ref="" value-ref=""/>
</map>
6、set
假定没有指定泛型参数:
<set>
    <value>xx</value>
    <bean class=""/>
    <ref bean=""/>
</set>
7、props
<props>
    <prop key="">xx</prop>
    <prop key="">yy</prop>
</props>

注:
如果A类有一个new出来的属性B类,而B类又有一个属性C,这时候可以通过点号的方式为C进行注入:
<property name="b.c" value=""/>

三、抽象Bean
1、抽象Bean仅仅为了缩减配置文件中大量相同配置片段而设计,抽象Bean不能被实例化,其价值在于被继承。
2、抽象Bean可以不指定class属性,需要指定abstract="true"。
3、子Bean可以从父Bean继承实现类、构造器参数、属性值等,但是无法继承depends-on、autowire、singleton、scope、lazy-init。
配置方式:
<bean id="father" abstract="true">
    <property name="" ref=""/>
</bean>
<bean id="child" class="" parent="father"/>

四、使用注解完成DI
注解和xml方式各有千秋,现在项目中一般要么全部采用xml方式,要么注解为主xml为辅,因为注解虽然简单但是还不能够完全代替xml。
1、配置Bean
Spring提供了四个Annotation来标注Bean:
@Component:标注普通的Bean;
@Controller:标注控制器组建;
@Service:标注业务逻辑组建;
@Repository:标注DAO组建。
简单说以上注解完成的工作相当于:
<bean id="【类名首字母小写】" class=""/>
有了注解,再配置上搜索路径:<context:component-scan base-package=""/>,OK!
2、配置依赖
Spring使用@Resource来完成这个工作,它起到的作用和ref相同,通过name属性可以指定被注入的Bean的id————@Resource(name="")
@Resource可以修饰setter方法也可以不提供setter方法而直接修饰类的属性,如果省略name属性,前者的name默认为setter方法去掉set首字母小写,后者直接就是属性名。
3、自动装配
@Autowire可以修饰setter方法、普通方法、构造函数、实例变量(包括数组、集合),默认采用byType策略,正因如此当@Autowire修饰的变量、或方法的参数既非数组也非集合时需要保证当前注入类型的实例的唯一性。
当修饰的构造函数有多个形参时必须保证每个形参的类型不一样。
修饰集合时必须指定集合的泛型参数,但不是必须指定固定的泛型参数,比如:
@Autowire
private BaseDao<T> dao;
这样当子类继承父类时指定了泛型的类型后,Spring可以为子类自动注入匹配类型BaseDao<T>的实例。
由于接口中的实例变量总是public static final的,而Spring不能注入static变量,所以不可以在接口中使用以上技巧。但是如果将@Autowire加到普通方法上则可以间接做到这一点。

以上内容全部总结于《轻量级Java EE企业应用(第4版)》。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值