0
点赞
收藏
分享

微信扫一扫

Spring的依赖注入以及注入方式详解


注入

注入首先是在配置文件中进行注入,所以注入的肯定是一些基本上不变化的值或者属性,像一些service或者dao,数据源什么的,而一些经常变化的值是不推荐使用在配置文件中注入。

依赖注入的概念

      在我们之前要调用一个类的时候,先要实例化这个类,生成一个对象。如果你在写一个类,过程中要调用到很多其它类,甚至这里的其它类,也要“依赖”于更多其它的类,那么可以想象,你要进行多少次实例化。
      现在我们学习了IOC之后,然后我们可以把有依赖关系的类放入容器(IOC容器)中,然后解析出这个类的实例。
好处:就是降低了程序之间的耦合性

   依赖注入: Dependency Injection。 它是 spring 框架核心 ioc 的具体实现。我们的程序在编写时, 通过控制反转, 把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。
ioc 解耦只是降低他们的依赖关系,但不会消除。 例如:我们的业务层仍会调用持久层的方法。
   那这种业务层和持久层的依赖关系, 在使用 spring 之后, 就让 spring 来维护了。
   简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。
能注入的类型
    基本类型和string
    其他bean类型(Date)
    复杂类型/集合类型

注入的方式

第一种使用构造函数注入

public class AccountServiceImpl implements IAccountService {
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);
}
}

要在配置文件总注入上面的三个参数,首先我们要介绍一些标签
要求:
      类中需要提供一个对应参数列表的构造函数。
涉及的标签:
     constructor-arg
属性:
index:指定参数在构造函数参数列表的索引位置
type:指定参数在构造函数中的数据类型
name:指定参数在构造函数中的名称 用这个找给谁赋值 常用这个
=上面三个都是找给谁赋值常用的是"name",下面两个指的是赋什么值的========
value:它能赋的值是基本数据类型和 String 类型
ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean对象 就例如下面写的Date类

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<bean id="now" class="java.util.Date"></bean>

特点

优点:在获取Bean对象,注入数据是必须的操作,否则对象无法创建成功。
缺点:改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须创建。
在实际开发中我们一般不用

第二种使用set 方法注入 (经常用)

涉及的标签:
        property
属性:
        name:找的是类中 set 方法后面的部分
        ref:给属性赋值是其他 bean 类型的
        value:给属性赋值是基本数据类型和 string 类型的
实际开发中,此种方式用的较多。

特点

优点:创建对象时没有明确的限制,可以直接使用默认构造函数
缺点:如果有个成员必须有值,则获取对象是有可能set方法没有执行

public class AccountServiceImpl implements IAccountService {
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);
}
}

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<property name="name" value="test"></property>
<property name="age" value="21"></property>
<property name="birthday" ref="now"></property>
</bean>
<bean id="now" class="java.util.Date"></bean>

注入集合类型

1.字符串数组类型

private String[] myStrs;

<!-- 给数组注入数据 -->
<property name="myStrs">
<set>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</set>
</property>

2. list 集合

private List<String> myList;

<!-- 注入 list 集合数据 -->
<property name="myList">
<array>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</array>
</property>

3.Set集合

private Set<String> mySet;

<!-- 注入 set 集合数据 -->
<property name="mySet">
<list>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</list>
</property>

4.Map类型

private Map<String,String> myMap;

<!-- 注入 Map 数据 -->
<property name="myMap">
<props>
<prop key="testA">aaa</prop>
<prop key="testB">bbb</prop>
</props>
</property>

5.配置文件
entry 元素的子元素,用于设置一个键值对。其 key 属性指定字符串类型的键值,ref 或 value 子元素指定其值

private Properties myProps;

<property name="myProps">
<map>
<entry key="testA" value="aaa"></entry>
<entry key="testB">
<value>bbb</value>
</entry>
</map>
</property>

实际中只需记住下面两组类型即可

1.list array set型的

<property name="list">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>

2Map Properties 型的

<property name="map">
<map>
<entry key="a" value="b" ></entry>
<entry key="c" value="d" ></entry>
</map>
</property>

新创建一个公众号 Rockey小何同学 想相互交流的同学可以关注一下哈! 感谢支持!


举报

相关推荐

0 条评论