Spring基于Java配置的容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Spring 容器的元数据可以基于 Java 代码配置,它像 XML 配置一样不侵入源代码,同时也支持注解配置。你可以在项目中任意选择哪种配置方式,或者多种方式共存。


一、Bean 管理



1. 元数据


基于 Java 配置 Bean,定义一个类并使用@Configuration注解作为配置类,在类中的方法上使用@Bean注解,就会注册一个以方法返回值为实例的 Bean。

@Configuration
public class AppConfig {
    @Bean
    public BeanExample beanExample() {
        return new BeanExample();
    }
    @Bean
    public BeanProvider beanProvider() {
        return new BeanProvider();
    }
}

默认使用方法名称作为 Bean 名称,也可以通过注解的valuename属性来指定。

使用AnnotationConfigApplicationContext来实例化容器。

public static void main(String[] args) {
    ApplicationContext applicationContext =
        new AnnotationConfigApplicationContext(AppConfig.class);
    BeanExample beanExample = (BeanExample) applicationContext.getBean("beanExample");
}

Bean 作用域

使用@Scope注解来指定 Bean 的作用域。

@Bean
@Scope("singleton")
public BeanExample beanExample() {
    return new BeanExample();
}


2. Full 模式和 Lite 模式


一般情况下,@Bean用于@Configuration注解的类下,这种方式为 Full 模式。

@Bean用于其他注解(如@Component)的类下,或者为任何一个 Bean 内部的方法,这种情况为 Lite 模式。

// Full
@Configuration
public class AppConfig {
    @Bean
    public BeanExample beanExample() {
        return new BeanExample();
    }
}
// Lite
@Component
public class AppConfig {
    @Bean
    public BeanExample beanExample() {
        return new BeanExample();
    }
}

Full 模式会生成 CGLIB 代理类,可以通过方法调用来依赖其它 Bean。

Lite 模式则不生成,可以提高运行性能,降低启动时间。

为了避免方法调用注入依赖的 Bug,推荐在业务中使用 Full 模式,在组件工具封装中使用 Lite 模式。


3. 组合配置


为了实现模块化配置,可以定义多个配置类,在配置类中使用@Import注解来导入其他配置类。

在实例化容器的时候,只需要指定AppConfig类,不需要指定所有配置类。

@Configuration
public class OtherConfig {
    @Bean
    public BeanProvider beanProvider() {
        return new BeanProvider();
    }
}
@Configuration
@Import(OtherConfig.class)
public class AppConfig {
    @Bean
    public BeanExample beanExample(BeanProvider beanProvider) {
        BeanExample beanExample = new BeanExample();
        beanExample.setBeanProvider(beanProvider);
        return beanExample;
    }
}


4. 扫描类路径配置


使用@ComponentScan来配置扫描的包路径,支持基于注解配置。

@Configuration
@ComponentScan(basePackages = "cn.codeartist.spring.bean.java")
public class AppConfig {
}


二、依赖管理



配置类同样是一个 Bean,也支持字段注入、构造器注入和 Setter 方法注入依赖。

@Configuration
public class AppConfig {
    @Autowired
    private BeanProvider beanProvider;
    @Bean
    public BeanExample beanExample() {
        BeanExample beanExample = new BeanExample();
        beanExample.setBeanProvider(beanProvider);
        return beanExample;
    }
}


1. 依赖注入


1.1 参数注入


依赖的 Bean 可以通过方法参数注入。

@Bean
public BeanExample beanExample(BeanProvider beanProvider) {
    BeanExample beanExample = new BeanExample();
    beanExample.setBeanProvider(beanProvider);
    return beanExample;
}


1.2 方法注入


在同一个配置类中,可以直接调用方法来依赖其它 Bean,该方式只在生成 CBLIB 代理类的 Full 模式下才生效。

@Configuration
public class AppConfig {
    @Bean
    public BeanExample beanExample() {
        BeanExample beanExample = new BeanExample();
        beanExample.setBeanProvider(beanProvider());
        return beanExample;
    }
    @Bean
    public BeanProvider beanProvider() {
        return new BeanProvider();
    }
}


2. 依赖关系


使用@DependsOn注解指定依赖关系。

@Bean
@DependsOn("beanProvider")
public BeanExample beanExample() {
    return new BeanExample();
}


3. 懒加载


使用@Lazy注解配置懒加载。

@Lazy
@Bean
public BeanProvider beanProvider() {
    return new BeanProvider();
}

懒加载 Bean 在注入的地方也要加上@Lazy注解,或者使用ApplicationContext.getBean()方法获取 Bean,才能使懒加载生效。

@Bean
public BeanExample beanExample(@Lazy BeanProvider beanProvider) {
    BeanExample beanExample = new BeanExample();
    beanExample.setBeanProvider(beanProvider);
    return beanExample;
}


三、附录



1. 常用注解


注解 描述
@Configuration 指定 Bean 的配置类
@Bean 配置 Bean 元数据,作用于方法上,方法返回值作为 Bean 实例
@Scope 指定 Bean 的作用域
@Import 导入其他配置类
@DependsOn 指定 Bean 的依赖关系
@Lazy 配置懒加载


2. 示例代码


Gitee 仓库:

https://gitee.com/code_artist/spring

项目模块:

spring-ioc

示例路径:

cn.codeartist.spring.bean.java

目录
相关文章
|
5天前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
67 26
|
2月前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
177 73
|
7天前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
54 21
|
19天前
|
Java Linux iOS开发
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
本文详细介绍如何在Windows和Linux/macOS系统上配置Java环境变量。
475 12
|
15天前
|
监控 Java 中间件
8G的容器Java堆才4G怎么就OOM了?
本文记录最近一例Java应用OOM问题的排查过程,希望可以给遇到类似问题的同学提供参考。
|
18天前
|
监控 Java 数据库连接
Spring c3p0配置详解
在Spring项目中配置C3P0数据源,可以显著提高数据库连接的效率和应用程序的性能。通过合理的配置和优化,可以充分发挥C3P0的优势,满足不同应用场景的需求。希望本文的详解和示例代码能为开发者提供清晰的指导,帮助实现高效的数据库连接管理。
32 10
|
23天前
|
Java
CentOS7.8配置Adoptium-Java17运行环境
本指南介绍如何设置清华镜像源并安装 Temurin-17-JRE 运行环境。首先,编辑 `/etc/yum.repos.d/adoptium.repo` 文件,配置清华镜像源。接着,使用 `yum install -y temurin-17-jre` 命令安装 Temurin-17-JRE,并通过 `java --version` 验证安装成功。相关配置和操作界面截图附后。
40 8
|
19天前
|
前端开发 NoSQL Java
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
188 1
|
1月前
|
Java Spring
Java Spring Boot监听事件和处理事件
通过上述步骤,我们可以在Java Spring Boot应用中实现事件的发布和监听。事件驱动模型可以帮助我们实现组件间的松耦合,提升系统的可维护性和可扩展性。无论是处理业务逻辑还是系统事件,Spring Boot的事件机制都提供了强大的支持和灵活性。希望本文能为您的开发工作提供实用的指导和帮助。
90 15
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。