spring之xml配置文件开发

507 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

本文主要讲解spring配置文件xml开发的核心内容。
先谈一趟为什么要用spring开发?它有什么好处?

当前开发现状

目前我们开发存在耦合性高的现状,这个高耦合主要体现在变量,甚至是对象的创建上,我们会new一个对象,那我们就与这个对象绑定了,当后期需要维护修改的时候,需要修改的代码就会很多。

解决方案与IoC

spring就当前代码现状,给我们提供了相当方便的解决方案,我们创建对象的时候不需要new一个对象,它会给我们提供对象。这种思想叫Ioc控制反转,对象的创建控制权由程序转移到外部。那这个思想在代码上又是如何实现的呢?大家继续往下看。

Ioc思想代码实现

spring中IoC容器主要负责对象的创建、初始化等过程,容器中的对象统称为bean。

代码实现:

step1: 在用maven做spring开发的时候,首先要导入的是spring坐标,坐标的导入就不赘述了,直接maven仓库搜索就可以。
step2 新建一个spring的xml文件,可以先命名为applicationContext.xml。创建好应该是下面这样👇👇👇

<?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">
</beans>

step3: 接下来要定义需要spring管理的类,就是正常写个类。(可以写个接口,通过类实现接口)

public interface BookDao {
    public void save();
}

public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}

step4: 需要管理的类写好之后,我们就把它丢到spring容器中,前面说过IoC容器中管理的对象都叫bean对象,对应于xml文件的话就是去写一个bean标签,也是很方便的。

bean标签:表示配置bean
id属性:表示给bean起名字
class属性:表示给bean定义类型
======非必填属性========
name属性:起别名
scope属性:可选择单例和多例等方式给对象

如下这句话放在前面写好的xml文件的beans标签下就OK了。这段话的主要意思就是管理com.springquickstart.dao.impl.BookDaoImpl这个类。我们需要用这个类的对象就直接去通过id或name获取它的bean就行。

<bean id="bookDao" name="dao bookDaoImpl" class="com.springquickstart.dao.impl.BookDaoImpl"></bean>

step5: 最后一步就是从容器中获取这个bean并使用。看下面测试代码:

public class App {
    public static void main(String[] args) {
        //1.创建IoC容器对象,加载spring核心配置文件
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2 从IOC容器中获取Bean对象(BookService对象)
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
    }
}

加载过spring配置文件后用getBean方法就可以获取到IoC中的bean了,该方法中的参数可以有如下几种:
1.bookDao对应于xml中bean标签下的id或者name
2.BookDao.class 按类型获取bean,这种方式获取bean要求同类型的bean唯一
这差不多就是spring配置文件开发的基本步骤了。

注入依赖DI

要掌握DI,首先要明白什么是依赖。依赖简单来说就是一个对象的创建依赖另一个对象,或者依赖某些参数。比如创建一个BookService对象,这个BookService对象只有一个有参构造,参数是另一个对象(BookDao)。那这个时候我们要创建的这个BookService对象是不是就依赖于BookDao对象了,没有这个对象,BookService就创建不了。这就是依赖,而注入就是把这个依赖加进去,把这个依赖的对象给它。
代码实现 上面的代码不变,我们新建一个BookService接口和它的实现类,如下
接口

public interface BookService {
    public void save();
}

接口实现类

public class BookServiceImpl implements BookService {
 
    private BookDao bookDao;
    public BookServiceImpl() {
        System.out.println("调用");
    }

    @Override
    public void save() {
        System.out.println("book service save...");
        bookDao.save();
    }
    //2.提供依赖对象对应的setter依赖
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
    //在xml中配置两者依赖关系
}

要使用上面这个类的save方法,一定要注入BookDao这个依赖。如何注入依赖,简单说就是在bean标签下加入property这个标签,当然你往后面深入学,还会有自动注入,只要在bean标签里新加一个autoWire属性就行了。

<bean id="bookDao" name="dao bookDaoImpl" class="com.springquickstart.dao.impl.BookDaoImpl" ></bean>
<bean id="bookService" name="Service bookService2" class="com.springquickstart.service.impl.BookServiceImpl" >
    <!--DI配置依赖关系-->
    <!--name里面的bookDao指的是bookserviceimpl里面的那个bookDao(依赖对象)名字,ref里的则是bean标签中的-->
    <property name="bookDao" ref="bookDao"></property>
</bean>

「尾末彩蛋」 🚀🚀🚀
现在开发大多都用注解的方式去开发,该专栏也更新了spring注解开发,大家可以对比看一下两种方式的不同,以及纯注解开发的优势。