Spring—Framework学习笔记之依赖注入(DI)

什么是依赖注入

依赖注入(DI):Dependency Injection。就是让Spring框架给Bean对象的属性进行赋值。他是Spring框架核心IOC的具体实现。

  • 我们的程序在编写时,通过控制反转,把对象的创建交给了Spring,但是代码中不可能出现没有依赖的情况。IOC解耦只是降低他们的依赖关系,但不会消除。
  • 简单地说,依赖注入(DI)就是坐等框架把持久层对象传入业务层,而我们不用自己去获取

注入方式

方式1:使用构造函数注入

顾名思义,就是在类的构造函数中给成员变量赋值
PS:赋值的操作不是我们自己做的,而是通过配置的方式,让Spring框架来为我们注入

步骤1:编写AccountServiceImpl(service实现类)
 public class AccountServiceImpl implements AccountService {
    private String name;
    private Integer age;
    private Date birthday;
    
    public AccountServiceImpl(String name, Integer age, Date birthday) {
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }
    
    @Override
    public void saveAccount() {
    	System.out.println(name+","+age+","+birthday);
    }
}
步骤2:编写beans.xml
<!-- 
	constructor-arg
		属性:
			index:指定参数在构造函数参数列表的索引位置
			type:指定参数在构造函数中的数据类型
			name:指定参数在构造函数中的名称——给谁赋值
========================以上都是给谁赋值======================
			value:它能赋的值是基本数据类型和String类型
			ref:它能赋的值是其他bean类型,也就是说,必须是在配置文件中配置过的bean
-->

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <bean id="birthdayId" class="java.util.Date"></bean>
    <bean id="accountService" class="com.hou.service.impl.AccountServiceImpl">
        <!--使用构造方法的方式1-->
        <!--<constructor-arg index="0" value="zhang3"></constructor-arg>-->
        <!--<constructor-arg index="1" value="25"></constructor-arg>-->
        <!--<constructor-arg index="2" ref="birthdayId"></constructor-arg>-->

        <!--使用构造方法的方式2-->
        <!--<constructor-arg type="java.lang.String" value="zhang3"></constructor-arg>-->
        <!--<constructor-arg type="java.lang.Integer" value="25"></constructor-arg>-->
        <!--<constructor-arg type="java.util.Date" ref="birthdayId"></constructor-arg>-->

        <!--使用构造方法的方式3 推荐-->
        <constructor-arg name="name" value="zhang3"></constructor-arg>
        <constructor-arg name="age" value="25"></constructor-arg>
        <constructor-arg name="birthday" ref="birthdayId"></constructor-arg>
    </bean>

</beans>
步骤3:测试
public class AccontTest {
    public static void main(String[] args) {
        //获取ApplicationContext对象, Spring容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        //获取Bean对象
        AccountService accountService = (AccountService) applicationContext.getBean("accountService");
        accountService.saveAccount();
    }
}

方式2:使用set方法方式注入

顾名思义,就是在类中提供需要注入成员的set方法。实际开发中,此种方式用的较多

步骤1:编写AccountServiceImpl
public class AccountServiceImpl implements AccountService {
    private String name;
    private Integer age;
    private Date birthday;
    
    public void setName(String name) {
    	this.name = name;
    }
    public void setAge(Integer age) {
    	this.age = age;
    }
    public void setBirthday(Date birthday) {
    	this.birthday = birthday;
    }
    
    @Override
    public void saveAccount() {
    	System.out.println(name+","+age+","+birthday);
    }
}
步骤2:编写beans.xml

通过配置文件给bean中的属性赋值

<!-- 
	property
		属性:
			name: 找的是类中 set 方法后面的部分
			value: 给属性赋值是基本数据类型和 string 类型的
			ref: 给属性赋值是其他 bean 类型的
-->
<bean id="birthdayId" class="java.util.Date"></bean>
<bean id="accountService" class="com.hou.service.impl.AccountServiceImpl">
    <property name="name" value="lisi"></property>
    <property name="age" value="30"></property>
    <property name="birthday" ref="birthdayId"></property>
</bean>
步骤3:测试
public class AccontTest {
    public static void main(String[] args) {
        //获取ApplicationContext对象, Spring容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        //获取Bean对象
        AccountService accountService = (AccountService) applicationContext.getBean("accountService");
        accountService.saveAccount();
    }
}

如何给集合属性注入

采用set方法给类中的集合成员赋值。

步骤1:编写AccountServiceImpl
public class AccountServiceImpl implements AccountService {
    private String[] myStrs;
    private List<String> myList;
    private Set<String> mySet;
    private Map<String,String> myMap;
    private Properties myProps;
    
    public void setMyStrs(String[] myStrs) 
    	this.myStrs = myStrs;
    }
    public void setMyList(List<String> myList) {
    	this.myList = myList;
    }
    public void setMySet(Set<String> mySet) {
    	this.mySet = mySet;
    }
    public void setMyMap(Map<String, String> myMap) {
    	this.myMap = myMap;
    }
    public void setMyProps(Properties myProps) {
    	this.myProps = myProps;
    }

    @Override
    public void saveAccount() {
        System.out.println(Arrays.toString(myStrs));
        System.out.println(myList);
        System.out.println(mySet);
        System.out.println(myMap);
        System.out.println(myProps);
    }
}

步骤2:编写beans.xml

在注入集合数据时,只要结构相同,标签可以互换
- List结构:array,list,set
- Map结构:map,entry,props,prop

<bean id="accountService" class="com.hou.service.impl.AccountServiceImpl">
    <!--数组-->
    <property name="myStrs">
        <array>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </array>
    </property>
    <!--list集合-->
    <property name="myList">
        <list>
            <value>javase</value>
            <value>mysql</value>
            <value>javaweb</value>
        </list>
    </property>
    <!--set集合-->
    <property name="mySet">
        <set>
            <value>北京</value>
            <value>上海</value>
            <value>南京</value>
        </set>
    </property>

    <!--map集合-->
    <property name="myMap">
        <map>
            <entry key="aaa" value="你好"></entry>
            <entry key="bbb" value="hello"></entry>
            <entry key="ccc" value="Hi"></entry>
        </map>
    </property>
    <!--properties集合-->
    <property name="myProps">
        <props>
            <prop key="111">哈哈</prop>
            <prop key="222">嘿嘿</prop>
            <prop key="333">呵呵</prop>
        </props>
    </property>
</bean>
</bean>
步骤3:测试
public class AccontTest {
    public static void main(String[] args) {
        //获取ApplicationContext对象, Spring容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        //获取Bean对象
        AccountService accountService = (AccountService) applicationContext.getBean("accountService");
        accountService.saveAccount();
    }
}

PS:
- List结构的集合注入数据时:
- array,list,set这三个标签通用,另外注值的value标签内部可以直接写值,也可以使用bean标签配置一个对象,或者用ref标签引用一个已经配合的bean的唯一标识。
- Map结构的集合注入数据
- map标签使用entry子标签实现数据注入,entry标签可以使用key和value属性指定存入map中的数据。
- 使用value-ref属性指定已经配置好的bean的引用
- 同时entry标签中也可以使用ref标签,但是不能使用bean标签。
- 而property标签中不能使用ref或者bean标签引用对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值