spring DI(Dependency Injection)汇总

DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

bean注入:

Bean注入的方式有两种,一种是在XML中配置,此时分别有属性注入、构造函数注入和工厂方法注入;另一种则是使用注解的方式注入 

一,spring依赖注入四种方式:

  1. 属性注入(即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常采用的注入方式)
  2. 构造函数注入(使用构造函数注入的前提是Bean必须提供带参数的构造函数)
  3. 工厂方式注入(分为:1.非静态工厂方法 必须实例化工厂类后才能调用工厂 ,工厂类负责创建一个或多个目标类实例,工厂类方法一般以接口或抽象类变量的形式返回目标类实例,工厂类对外屏蔽了目标类的实例化步骤,调用者甚至不用知道具体的目标类是什么  2.静态工厂方法  用户在无须创建工厂类实例的情况下就可以调用工厂类方法,因此,静态工厂方法比非静态工厂方法的调用更加方便)
  4. 目前使用最广泛的 @Autowired:自动装配

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 
    模拟spring执行过程
        创建service实例:BookService bookService = new BookServiceImpl() IoC  <bean>
        创建dao实例:BookDao bookDao = new BookDaoImpl()         IoC
        将dao设置给service:bookService.setBookDao(bookDao);     DI   <property>

        <property> 用于进行属性注入
            name: bean的属性名,通过setter方法获得
                setBookDao ##> BookDao  ##> bookDao
            ref :另一个bean的id值的引用
     -->

    <!-- 创建service -->
    <bean id="bookServiceId" class="com.itheima.b_di.BookServiceImpl">
        <property name="bookDao" ref="bookDaoId"></property>
    </bean>

    <!-- 创建dao实例 -->
    <bean id="bookDaoId" class="com.itheima.b_di.BookDaoImpl"></bean>
</beans>

 

静态工厂方式注入

单例模式(设计模式)

public class DBUtil {
    //构造方法私有化
    private DBUtil(){}
    //创建一个对象实例
    private static DBUtil instance = new DBUtil();  //若没有static,则不能返回,为什么?
 
    //获取对象
    public static DBUtil getInstance(){
        return instance;
    }
    public void test(){
        System.out.println("调用DBUtil的test方法");
    }

在spring配置文件加入以下代码

    <!--工厂方法注入-->

  <bean id="dbUtils" class="com.etc.utils.DBUtil" factory-method="getInstance"></bean>

 

二, 使用注解的方式自动注入

  需要先在Spring配置文件加入扫描

<!-- 配置组件扫描器 就是说明你的bean注解在哪个包下 -->

<context:component-scan base-package="com.cn.*"></context:component-scan>

通过@Autowired或@Resource来实现在Bean中自动注入的功能

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值