Spring的依赖注入

一.setter注入

1.bean注入


在bean中定义引用类型属性并提供可访问set方法

public class BookServiceImpl implements BookService{

    private BookDao bookDao;
    private UserDao userDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

对应在xml中加入property

    <bean id="bookService" name="bookService" class="com.learn.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
        <property name="userDao" ref="userDao"/>
    </bean>

2.简单类型注入(数字字符串)

public class BookDaoImpl implements BookDao {
    private int connectionNum;
    private String databaseName;

    public void setConnectionNum(int connectionNum) {
        this.connectionNum = connectionNum;
    }

    public void setDatabaseName(String databaseName) {
        this.databaseName = databaseName;
    }

在XML添加对应property标签 value属性注入简单类型数据

    <bean id="bookDao" name="bookDao" class="com.learn.dao.impl.BookDaoImpl">
        <property name="connectionNum" value="10"/>
        <property name="databaseName" value="mysql"/>
    </bean>

二.构造器注入

1.构造器bean注入

通过构造函数的方式进行bean的依赖注入

public class BookServiceImpl implements BookService{


    public BookServiceImpl(BookDao bookDao, UserDao userDao) {
        this.bookDao = bookDao;
        this.userDao = userDao;
    }

    private BookDao bookDao;
    private UserDao userDao;
    }

xml中在对应bean中加入constructor-arg属性 name的参数与构造函数中形参需要一致 ref表示关联对应bean

<bean id="bookService" name="bookService" class="com.learn.service.impl.BookServiceImpl">
        <constructor-arg name="bookDao" ref="bookDao"/>
        <constructor-arg name="userDao" ref="userDao"/>
    </bean>

2.构造器简单类型注入*

public class BookDaoImpl implements BookDao {

    private int connectionNum;
    private String databaseName;

    public BookDaoImpl(int connectionNum, String databaseName) {
        this.connectionNum = connectionNum;
        this.databaseName = databaseName;
    }

    @Override
    public void save(){
        System.out.println("BookDaoSave..."+databaseName+","+connectionNum);
    }
}

同样在xml中添加constructor-arg属性 name的参数与构造函数中形参需要一致 value表示对应值

<bean id="bookDao" name="bookDao" class="com.learn.dao.impl.BookDaoImpl">
        <constructor-arg name="connectionNum" value="10"/>
        <constructor-arg name="databaseName" value="mysql"/>
    </bean>

额外补充

为了降低耦合度,使得name的参数修改时不出问题曾使用下面的方法代替使用name

按类型type区分,但是 这种方法在面临多种同类型参数的时候都有局限性

<bean id="bookDao" name="bookDao" class="com.learn.dao.impl.BookDaoImpl">
        <constructor-arg type="int" value="10"/>
        <constructor-arg type="java.lang.String" value="mysql"/>
    </bean>

按参数的前后位置顺序index区分

    <bean id="bookDao" name="bookDao" class="com.learn.dao.impl.BookDaoImpl">
        <constructor-arg index="0" value="10"/>
        <constructor-arg index="1" value="mysql"/>
    </bean>

依赖注入方式的选择

1.强制依赖使用构造器进行,使用setter方法注入有概率不注入导致null对象出现
2.可选依赖使用setter注入进行,灵活性强
3.spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入形式进行数据初始化,相对严谨
4.如果有必要可以两者同时使用,用构造器注入完成强制依赖注入,使用setter注入完成可选依赖的注入
5.根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter注入


依赖的自动装配

IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
在这里插入图片描述

<!--    按类型type匹配bean类型需要唯一 
		按名称匹配id需要唯一且与service中的setBean方法中的要一致-->
<!--    主要使用的是按类型byType-->
    <bean id="bookService" name="bookService" class="com.learn.service.impl.BookServiceImpl" autowire="byName">

注意事项
1.自动装配仅用于引用类型依赖注入,不能对简单类型进行操作
2.按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
3.使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐
4.自动装配优先级低于setter注入和构造器注入,同时出现时自动装配配置失效


集合注入

public class BookDaoImpl implements BookDao {
    private int[] array;
    private List<String> list;
    private Set<String> set;
    private Map<String,String> map;
    private Properties properties;

    public void setArray(int[] array) {
        this.array = array;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }


    @Override
    public void save(){
        System.out.println("BookDaoSave...");
        System.out.println("遍历数组:"+ Arrays.toString(array));
        System.out.println("遍历List:"+list);
        System.out.println("遍历set:"+set);
        System.out.println("遍历Map:"+map);
        System.out.println("遍历Properties:"+properties);
    }
}

对应xml

 <bean id="bookDao" name="bookDao" class="com.learn.dao.impl.BookDaoImpl">
        <property name="array">
            <array>
                <value>1</value>
                <value>2</value>
                <value>3</value>
                <value>4</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>q</value>
                <value>w</value>
                <value>e</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>a</value>
                <value>s</value>
                <value>d</value>
                <value>d</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="country" value="china"/>
                <entry key="province" value="hubei"/>
                <entry key="city" value="wuhan"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="country">china</prop>
                <prop key="province">hubei</prop>
                <prop key="city">wuhan</prop>
            </props>
        </property>
    </bean>

运行结果
在这里插入图片描述
注意事项
1.List和Array在xml中可以互相交换写法使用,但不推荐
2.Set集合中重复的不会输出

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值