Spring依赖注入简介与练习

Spring学习笔记

依赖注入方式:

引导内容:

image-20230209141602949

setter注入-引用:

image-20230209143700271

即配置文件中:

image-20230209143736277

单个注入:
配置文件:

image-20230209150302952

在BookService中添加需要依赖的Bean通过ref属性添加。

在BookService中注入BookDao

public class BookServiceImpl implements BookService {

    //删除业务层中使用new创建的对象
//    private BookDao bookDao=new BookDaoImpl();
    private BookDao bookDao;
    private UserDao userDao;

   /* public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
*/
    @Override
    public void Save() {
        System.out.println("BookService Save");
        bookDao.Save();
//        userDao.Save();
    }
    //提供对应的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

提供set方法。然后调用。

运行结果:

image-20230209150115847

多个注入:

即类似于的那个注入需要几个就添加几个。

运行结果:

image-20230209150509133

setter注入-简单类型:

在UserDao中做示例。

package org.wgq.dao.impl;

import org.wgq.UserDao;

public class UserDaoImpl implements UserDao {
    private int connectionNum;
    private String databaseName;

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

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

    @Override
    public void Save(){
        System.out.println("UserDao Save() Is running"+databaseName+connectionNum);
    }
}

两个私有属性,并生成对应的set方法。

配置文件:
<bean id="userDao" class="org.wgq.dao.impl.UserDaoImpl" >
            <property name="connectionNum" value="20"/>
            <property name="databaseName" value="MySQL"/>
        </bean>

使用value获取基本类型的值。

运行结果:

image-20230209151610606

构造方法注入:

程序入口:
package org.wgq;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AppForDIconstructor {
    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.Save();
    }
}
bookService实现类
package org.wgq.service.impl;

import org.wgq.BookDao;
import org.wgq.BookService;
import org.wgq.UserDao;

public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    //提供BookDao的构造方法
    public BookServiceImpl(BookDao bookDao) {
        this.bookDao = bookDao;
    }
    @Override
    public void Save() {
        System.out.println("BookService Save");
        bookDao.Save();
    }
}
配置文件:
<bean id="bookService" name="service " class="org.wgq.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
<!--  此时name指的是构造方法中的形参 ref还是和原来一样表示bookDao Bean-->
</bean>
运行结果:

image-20230209173837754

注入多个:

需要修改构造方法:

image-20230209174128734

配置文件修改:

image-20230209174433298

运行结果:

image-20230209174513481

构造方法注入-简单类型

给定属性与构造方法:

image-20230209175334713

修改配置文件:

image-20230209175401367

运行结果:

image-20230209175448401

以上配置为标准书写方式,耦合度较高,比如在构造方法中databaseName变更为database,那么配置文件中则无法应用。

为此Spring给出了解决方法。

去掉name属性,换用type。这样就不用担心形参名字改变了。

type表示数据类型,按数据类型进行对应赋值

<bean id="bookDao"  class="org.wgq.dao.impl.BookDaoImpl" >
                <constructor-arg type="java.lang.String" value="Redis"/>
                <constructor-arg type="int" value="10"/>
    </bean>

运行结果:

image-20230209180753883

但是万一有相同的数据类型怎么办呢?又乱套了。

对此Spring也给出了解决方法。

配置文件:

image-20230209181201460

使用index锁定值对应构造方法中的第几个参数。

image-20230209181259014

三种方法依照情况而定,各有各的优点与缺点。

注入方式选择:

image-20230209181621872

依赖注入方式选择

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

依赖自动注入:

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

自动装配方式:

按类型( 常用 )

按名称

按构造方法

不启用自动装配

按类型:

set方法与属性依然需要提供。

image-20230209190417600

image-20230209190129032

替换之前的 标签按类型自动填入。类型必须唯一

例如:

image-20230209190712543

它已经报错了,所以唯一很重要。

运行结果:

image-20230209190233272

按名称:

image-20230209190829715

image-20230209190854815

这两个名字需要对应。

注:自动装配不能用于基本数据类型的注入。

Collection注入:

定义属性并提供set方法

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

    public void setArr(int[] arr) {
        this.arr = arr;
    }

    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;
    }

    public void save() {
        System.out.println("BookDao Is Save");
        System.out.println("遍历数组:"+ Arrays.toString(arr));
        System.out.println("遍历list: "+list);
        System.out.println("遍历set: "+set);
        System.out.println("遍历map: "+map);
        System.out.println("遍历Properties: "+properties);
    }
}

配置文件:

<bean id="bookDao" class="com.wgq.dao.impl.BookDaoImpl">
        <property name="arr">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>WGQ</value>
                <value>ZQJ</value>
                <value>WW</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>WGQ</value>
                <value>WGQ</value>
                <value>ZQJ</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="man" value="WGQ"/>
                <entry key="woman" value="ZQJ"/>
                <entry key="gender" value="M"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="man">WGQ</prop>
                <prop key="woman">ZQJ</prop>
            </props>
        </property>
    </bean>

运行结果:

image-20230209203909859

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值