Spring依赖注入的四种方式


1、Set方式注入:
     这是最简单的注入方式,假设有一个UserService,需要在UserService中实例一个UserDAO对象
     那么就可以在UserService类中定义一个private的UserDAO成员变量,然后创建UserDAO的set方法(这是IOC注入的入口)

package com.services.UserService;

public class UserService {

    private UserDAO userDAO;

    public void setUserDAO(UserDAO userDAO){
        this.userDAO = userDAO;
    }
}

随后编写applicationContext.xml文件

 <bean id="userDAO1" class="com.dao.UserDAO"></bean>
 <bean id="UserService" class="com.services.UserService">
     <!--  此处name的值就是UserService中的userDAO -->
     <property name="userDAO" ref="userDAO1"></property>
 </bean>

2、构造器注入:
      这种方式的注入是指带有参数的构造函数的注入。注意下面的示例:我在UserService中创建两个成员变量UserDAO和User,但是并不创建set方法,所以这里就不能支持第一中的set注入,此处的注入是在UserService的构造函数中实现的,即就是在创建UserService时就要将UserDAO和User两个参数传进来

package com.service.UserService
public class UserService{
     private UserDAO userDAO;
     private User user;
     public UserService(UserDAO userDAO,User user){
         this.userDAO = userDAO;
         this.user = user;
     }
}

applicationContext.xml文件中同样不使用第一种property的形式,而是使用<constructor-arg>标签 

<bean id="UserService" class="com.services.UserService">
    <!-- 创建构造器注入,如果带有参数的构造方法则需添加此配置 -->
    <constructor-arg  ref="userDAO"></constructor-arg>
    <constructor-arg  ref="user"></constructor-arg>
</bean>
<bean id="userDAO" class="com.dao.UserDAO"></bean>
<bean id="user" class="com.bean.User"></bean>

解决构造函数参数的不确定性
你可能会遇到构造方法传入的两个参数是相同的类型,为了分清楚哪个值对应哪个参数则需进行一些小处理,设置index的值,就是参数的位置

<bean id="UserService" class="com.services.UserService">
    <!-- 创建构造器注入,如果带有参数的构造方法则需添加此配置 -->
    <constructor-arg  index="0" ref="userDAO"></constructor-arg>
    <constructor-arg  index="1" ref="user"></constructor-arg>
</bean>

另一种设置参数类型:

<constructor-arg  type="java.lang.string" ref=""></constructor-arg>

3、注解方式注入:
     Spring2.5提供了基于注解的配置,我们可以通过注解的方式来实现注入,
     在Java代码中可以使用@AutoWired和@Resource注解方式来实现注入
     虽然@AutoWired和@Resource都可以实现注入,但是它们之间是有区别的

  1. @Resource默认是按照"名称"来装配的,只有找不到与名称匹配的bean才会按照类型来装配注入;
  2. @Autowired默认是按照"类型"装配注入的,如果想按照名称来转配注入,则需要结合"@Qualifier"一起使用;
  3. @Resource注解是又J2EE提供,而@Autowired是由Spring提供,故减少系统对spring的依赖建议使用@Resource的方式;
  4. @Resource和@Autowired都可以书写标注在字段或者该字段的setter方法之上

使用注解的方式步骤如下:    

(1)添加jar包:依赖的jar包: common-annotations.jar
(2)在applicationContext.xml文件中添加如下代码:
    配置文件中加入命名空间
    在Beans中添加:

​
xmlns:context="Index of /schema/context">

 <!-- 打开可以使用注解方式注入对象 -->

<context:annotation-config/>

到这里配置就完成了。

package com.service.impl.UserService;
import com.services.UserServiceImpl;
public class UserServiceImpl implements UserService{
    @Resource(name="userDAO")
    private UserDAO userDAO;
}
<bean id="UserServiceImpl" class="com.service.impl.UserService"></bean>
<bean id="UserDAO" class="com.dao.UserDAO"></bean>
注意:
     @Autowire 默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,
     如果我们想使用按照名称装配,可 以结合@Qualifier注解一起使用;
     @Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,
      如果没有指  定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,

     当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找 依赖对象.
     如果没有指定name属性,并且按照默认的名称仍然找不到依赖的对象时候,
     会回退到按照类型装配,但一旦指定了name属性,就只能按照名称 装配了.
4、通过自动扫描的方式注入:
Spring2.5引入了自动扫描机制,它可在classpath路径下寻找标注了@Component、@Service、@Controller、@Repository注解的类
     并把这些类纳入spring容器中管理,它的作用和在Spring文件中编写<bean>节点一样
     @services (用于标注业务层组件)、
     @Controller(用于标注控制层组件(如struts中的Action))、
     @Repository(用于标注数据访问层即dao组件)、
     @Component(泛指组件)、的类并把这些类纳入进Spring容器中管理
     注意:这些注解是添加在Java类上的,而注解注入(第三种方式)的注解是添加在属性或方法上的;
              1>首先引入xmlns:content=" Index of /schema/context" 命名空间
              2>打开扫描 <context:component-scan base-package="com.packagename" />
      说明:如果引入了 <context:component-scan />标签就可以不用引入第3种方式中的<context:annotation-config/>
     如有错误欢迎指正,谢谢!!!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZQGBack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值