spring-配置bean(2、基于JavaConfig的配置)

本文深入探讨Spring框架中JavaConfig的应用,介绍如何通过Java代码而非XML文件进行bean的配置。覆盖了@Bean注解的使用,以及如何通过构造器、Setter方法等方式进行bean之间的依赖注入。

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

上一篇文章中说了spring自动配置,接下来写下显示配置中的通过Java代码装配bean。
通过Java配置bean大多时候比XML配置bean更为方便,因为它就是一个普通的Java代码,只是因为这个代码是JavaConfig,所以它不包含任何逻辑关系,仅仅收集各个组件。

写几个代码来当例子
如在上一节中,我们说了JavaConfig形式如下,里面没有任何内容,仅仅包含了一个@Configuration和一个@ComponentScan来自动扫描

package test;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class CDPlayerConfig {

}

那么此时我把@ComponentScan注解去掉,这样会导致这个Java类无法扫描bean,即无法自动配置bean了

package test;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CDPlayerConfig {

}

那么无法自动配置bean,那么此时就只能手动配置bean了,显示地返回一个bean对象,此时要用到@Bean注解(可以说@Bean就是写在带有@Configuration中的注解,用于创建bean)。(sgtPeppers等代码请看第一节)。上一节中我说过,其实bean就是返回一个实例化对象,从而将”A a;” 变成等效于“A a=new A();”的效果。此例中就是如此,直接返回一个new SgtPeppers();

package test;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
@Configuration
public class CDPlayerConfig {

    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }
}

接下来假设有一个CDPlayer bean 依赖于CompactDisc bean。那么如何将它们装配在一起?
在JavaConfig中装配bean的最简单的方案就是直接引用创建了bean的方法(此例中即上面一个代码块中的 sgtPeppers()方法。它返回了一个对象,即创建了一个bean)

package test;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class CDPlayerConfig {

    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }

    //如下,直接引用SgtPeppers()方法
    @Bean
    public CDPlayer cdPlayer(){
        return new CDPlayer(sgtPeppers());
    }
}

此例cdPlayer()像sgtPeppers()一样,使用了@Bean注解,并返回一个bean。但是这样还有种更好的引用bean的方法。即通过构造器来引用其他的bean。这种通过构造器的方式通常是最佳选择,因为这样不用强制把要引用的bean和本bean写在同一个JavaConfig中(如这个代码中,cdPlayer()可以写在其他的class里;但是上面的直接引用sgtPeppers()的要求两个方法写在一个class里)

package test;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class CDPlayerConfig {

    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }

    //如下,通过构造器来引用
    @Bean
    public CDPlayer cdPlayer(CompactDisc sgtPeppers){
        return new CDPlayer(sgtPeppers);
    }
}

还有一种Setter方法。

package test;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class CDPlayerConfig {

    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }

    //如下,使用Setter方法
    @Bean
    public CDPlayer cdPlayer(CompactDisc sgtPeppers){
            //建立CDPlayer对象
        CDPlayer cdPlayer=new CDPlayer();
        //通过setter方法注入,这个要单独在CDPlayer类中写setter方法
        cdPlayer.setSgtPeppers(sgtPeppers);
        //返回cdPlayer,此时该对象已经注入sgtPeppers,实现了实例化,是个bean了
        return cdPlayer;
    }
}

总而言之,带有@Bean注解的方法可以采用任何有必要的Java功能来产生bean实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值