基于xml依赖注入简单流程

最近刚刚开始学习Spring boot,老师让尝试三种方式进行依赖注入。注解配置和Java配置都很容易,就是这个xml有点麻烦,这个比较旧,而且网上大多教程都没有完整的流程,我这个新手学起来总是一卡一卡的。所以在我将整个流程走过一遍后,决定写一个完整的流程,以防忘记。

目录结构

java 命令注入例子 javaxml注入_spring boot

创建POJO(简单的Java对象,实际就是普通JavaBeans)

首先创建需要依赖注入的例子。

具体功能:
类MovieLister的方法moviesDirectedBy用于返回指定导演的所有电影。其代码如下所示。其中,类Movie表示电影,包括电影名字,电影导演等信息。finder对象是接口MovieFinder的实例。MovieFinder接口的方法findAll()用于获取所有的电影列表。类CSVMovieFinder和InMemMovieFinder是接口MovieFinder的两个实现类,分别从CSV文件(文件位于工程根目录下,名为movies.csv)和内存中读取电影信息。

简单来说就是一个名叫MovieLister的类有一个根据导演找电影的方法:movieDirectedBy,这个类依赖实现了MovieFinder接口的CSVMovieFinder类或InMemMovieFinder类。

代码实现

主函数

@SpringBootApplication
public class MovieXmlApplication {

    public static void main(String[] args) throws IOException {
        ConfigurableApplicationContext context = SpringApplication.run(MovieXmlApplication.class, args);

        MovieLister movieLister = context.getBean(MovieLister.class);
        System.out.println(movieLister.moviesDirectedBy("233"));
    }

}

MovieLister

public class MovieLister {
    private final MovieFinder finder;

    public MovieLister(MovieFinder movieFinder) {
        this.finder = movieFinder;
    }

    public List<Movie> moviesDirectedBy(String director) throws IOException {
        List<Movie> movies = finder.findAll();
        return movies.stream()
                .filter(movie -> movie.getDirectorName().equals(director))
                .collect(Collectors.toList());
    }

}

InMemMovieFinder

public class InMemMovieFinder implements MovieFinder{
    List<Movie> movieList;

    public InMemMovieFinder() {
        this.movieList = new ArrayList<>();
    }
    @Override
    public List<Movie> findAll() {
        return movieList;
    }
}

MovieFinder

public interface MovieFinder {
    List<Movie> findAll() throws IOException;
}

CSVMovieFinder太麻烦就不写了。

写xml

在src/main/resources目录下新建一个beans.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 http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">

    <bean class="com.movie.moviexml.bean.injection.movies.MovieLister">
        <constructor-arg  ref="csvMovieFinder"/>
        <!--        constructor-arg用来指定构造函数的参数-->
    </bean>

    <bean class="com.movie.moviexml.bean.injection.movies.InMemMovieFinder" name="inMemMovieFinder"/>
    <bean class="com.movie.moviexml.bean.injection.movies.CSVMovieFinder" name="csvMovieFinder"/>

</beans>

<beans>标签为最大的标签,将需要依赖注入的类使用<bean>标签写入其中。
class属性表示指定类的全限定名。用于反射创建对象。默认情况下调用无参构造函数。

使用类中的构造函数,给成员变量赋值,通过在xml文件中的bean进行配置的方式给对象赋值。

构造方法注入涉及的标签:

constructor-arg

index:指定参数在构造函数参数列表的索引位置

name:指定参数在构造函数中的名称

value:它能赋的值是基本数据类型和 String 类型

ref:它能赋的值是其他 bean 类型,且必须是在配置文件中配置过的 bean

上述标签描述引用自博客Spring基于XML方式的使用

最后

当POJO和xml都完成后,一定记得在主函数上面写上@ImportResource("classpath:beans.xml")表示使用该xml配置。

最后主函数应为

@ImportResource("classpath:beans.xml") // xml
@SpringBootApplication
public class MovieXmlApplication {

    public static void main(String[] args) throws IOException {
        ConfigurableApplicationContext context = SpringApplication.run(MovieXmlApplication.class, args);

        MovieLister movieLister = context.getBean(MovieLister.class);
        System.out.println(movieLister.moviesDirectedBy("233"));
    }
}

之后就大功告成了,点击运行即可。