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

本文深入探讨Spring框架的配置方式,从XML配置到注解配置,再到Java配置,详细解析不同配置方式的特点与应用场景,帮助开发者更好地理解和掌握Spring配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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个类,结构如下图所示:
Alt
下面分别实现这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中运行,得到的效果如下:
Alt





5.Java配置

同样地,这里我们在"src/main/java/com/study/spring/ch1"下再新建一个包"Javaconfig"。然后再在这个包里面建立4个类,结构如下图所示:
Alt
这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中运行,得到的效果如下:
Alt





6.总结

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



评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theSerein

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值