小言_互联网的博客

【Spring Boot】Spring基础 —— Spring的两种基础配置方式(依赖注入、Java配置)

363人阅读  评论(0)

Spring的两种基础配置





1.Spring概述

Spring发展主要有三个阶段:
① xml阶段(Spring 1.x时代):此时使用Spring开发满眼都是xml配置的Bean,这样在随着项目的扩大时,就需要把不同的xml配置文件分放到不同的配置文件中去。这样导致了在开发过程中,需要频繁地在开发的类和配置文件中切换。
② 注解配置(Spring 2.x时代):随着JDK1.5带来的注解支持,Spring提供了声明Bean的注解(如@Component、@Service),大大减少了配置量。此时在Spring圈子就存在着一种争论:注解配置和xml配置究竟哪个更好?我们最终的选择是应用的基本配置(如数据库配置)用xml,业务配置用注解。
③ Java配置(Spring 3.x时代至今):Spring提供了Java配置的能力,使用Java配置可以让你更理解你配置的Bean。我们目前刚好处于这个时代,Spring 4.x和Spring Boot都推荐使用Java配置。

下面我们就针对注解配置和Java配置,通过具体实验来熟悉其区别和联系。





2.新建项目

① 首先我们打开任意支持开发Maven项目的编译器(我选用的是界面简洁、提示丰富的IDEA),然后点击"File -> New -> Project",如下:

② 点击"Maven -> Next"后,在上面选择你的所需要建立的项目的存储位置,并且输入你的项目名(如:SpringStudy),然后点击"Finish"即可完成项目的创建。






3.配置pom.xml

在点击"Finish"后,会出现"pom.xml"的界面,我们在其中录入以下内容:

代码如下:

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    	<version>5.2.3.RELEASE</version>
    </dependency>
</dependencies>




4.注解配置(依赖注入)

接着我们在"src/main/java"里面建立一个包"com.study.spring.ch1.Dependencyconfig"。然后在这个包里面建立4个类,结构如下图所示:

下面分别实现这4个类:
首先是类FunctionService,其内容如下:

package com.study.spring.ch1.Dependencyconfig;

import org.springframework.stereotype.Service;

@Service                                     //声明当前类是一个由Spring管理的Bean
public class FunctionService {               //编写功能类Bean
    public String sayHello(String word){
        return "Hellow " + word + "!";
    }
}

然后是类UseFunctionService,其内容如下:

package com.study.spring.ch1.Dependencyconfig;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service                                    //声明当前类是一个由Spring管理的Bean
public class UseFunctionService {           //测试功能类Bean
    @Autowired                              //通过@Autowired注解,将FunctionService实体注入当前类中
    FunctionService functionService;

    public String SayHello(String word){
        return functionService.sayHello(word);
    }
}

再接着是配置类DependencyConfig,内容如下:

package com.study.spring.ch1.Dependencyconfig;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration                                      //声明当前类是一个配置类
@ComponentScan("com.study.spring.ch1.Dependencyconfig")    //使用@ComponentScan注解自动扫描包名下所有使用@Service、@Component、@Repository和@Controller的类
public class DependencyConfig {                      //配置类
}

最后是测试主类Main,内容如下:

package com.study.spring.ch1.Dependencyconfig;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {                             //测试主类
    public static void main(String[] args){
        //使用AnnotationConfigApplicationContext作为spring的容器(需要接受一个配置类作为参数)
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DependencyConfig.class);

        //获得已经配置好了的Bean
        UseFunctionService useFunctionService = context.getBean(UseFunctionService.class);

        System.out.println(useFunctionService.SayHello("the dependency config bean"));

        context.close();
    }
}

最后我们在Main中运行,得到的效果如下:





5.Java配置

同样地,这里我们在"src/main/java/com/study/spring/ch1"下再新建一个包"Javaconfig"。然后再在这个包里面建立4个类,结构如下图所示:

这4个类的内容如下:
首先是类FunctionService,其内容如下:

package com.study.spring.ch1.Javaconfig;

public class FunctionService {                         //定义一个未使用@Service声明的Bean
    public String sayHello(String word){
        return "Hellow " + word + "!";
    }
}

然后是类UseFunctionService,其内容如下:

package com.study.spring.ch1.Javaconfig;

public class UseFunctionService {                   //定义一个未使用@Service声明的Bean
    FunctionService functionService;                //定义一个未使用@Autowired注解注入的Bean

    public void setFunctionService(FunctionService functionService){
        this.functionService = functionService;
    }

    public String SayHello(String word){
        return functionService.sayHello(word);
    }
}

接着是配置类JavaConfig,其内容如下:

package com.study.spring.ch1.Javaconfig;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration                          //使用@Configuration注解表明当前类是一个配置类,此处没有进行包扫描是因为所有的Bean都在此类中定义了
public class JavaConfig {
    @Bean                               //使用@Bean注解声明当前方法返回值是一个Bean,Bean的名称是方法名,下同
    public FunctionService functionService(){
        return new FunctionService();
    }

    @Bean
    public UseFunctionService useFunctionService(){
        UseFunctionService useFunctionService = new UseFunctionService();
        useFunctionService.setFunctionService(functionService());
        return useFunctionService;
    }
}

最后是测试主类Main,内容如下:

package com.study.spring.ch1.Javaconfig;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {                             //测试主类
    public static void main(String[] args){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
        UseFunctionService useFunctionService = context.getBean(UseFunctionService.class);
        System.out.println(useFunctionService.SayHello("the java config bean"));
        context.close();
    }
}

最后我们在Main中运行,得到的效果如下:





6.总结

上面的两种配置方式:
依赖注入侧重于在各个基础类中,通过@Service、@Component、@Repository和@Controller来将其注册为Bean,而忽略了在配置类中进行大量的配置;
而Java配置则侧重于在最终的配置类中单独配置,从而减轻了在各个类中的配置。




转载:https://blog.csdn.net/the_ZED/article/details/105307052
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场