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

目录
相关文章
|
6天前
|
SQL Java 数据库连接
(自用)Spring常用配置
(自用)Spring常用配置
13 0
|
25天前
|
Java 数据库连接 数据库
hibernate正向生成数据库表以及配置——TestStu.java
hibernate正向生成数据库表以及配置——TestStu.java
16 1
|
25天前
|
Java 数据库连接 数据库
hibernate正向生成数据库表以及配置——Teacher.java
hibernate正向生成数据库表以及配置——Teacher.java
11 0
|
25天前
|
Java 数据库连接 数据库
hibernate正向生成数据库表以及配置——Student.java
hibernate正向生成数据库表以及配置——Student.java
10 0
|
1天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
2天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
7 1
|
3天前
|
安全 Java 数据安全/隐私保护
使用Spring Security进行Java身份验证与授权
【4月更文挑战第16天】Spring Security是Java应用的安全框架,提供认证和授权解决方案。通过添加相关依赖到`pom.xml`,然后配置`SecurityConfig`,如设置用户认证信息和URL访问规则,可以实现应用的安全保护。认证流程包括请求拦截、身份验证、响应生成和访问控制。授权则涉及访问决策管理器,如基于角色的投票。Spring Security为开发者构建安全应用提供了全面且灵活的工具,涵盖OAuth2、CSRF保护等功能。
|
3天前
|
Java 大数据 云计算
Spring框架:Java后台开发的核心
【4月更文挑战第15天】Spring框架在Java后台开发中占据核心位置,因其控制反转(IoC)、面向切面编程(AOP)、事务管理等特性提升效率和质量。Spring提供数据访问集成、RESTful Web服务和WebSocket支持。优势包括高效开发、灵活扩展、强大生态圈和广泛应用。应用于企业级应用、微服务架构及云计算大数据场景。掌握Spring对Java开发者至关重要。
|
6天前
|
JSON Java 数据库连接
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
13 1
|
6天前
|
Java 数据库连接 Spring
简化配置,提高灵活性:Spring中的参数化配置技巧
简化配置,提高灵活性:Spring中的参数化配置技巧
15 0