首页 > 编程语言 >第4章-Spring基于Java配置的容器

第4章-Spring基于Java配置的容器

时间:2022-11-27 16:15:05浏览次数:62  
标签:容器 Java Spring beanExample return Bean new BeanExample public

目录

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();
}

作用域类型参阅《Spring基于XML配置的容器

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 模式。

Spring 5.2.x 版本后,@Configuration 可以指定属性 proxyBeanMethods 为 false,来禁用 CGLIB 进入 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 {

}

参阅上一篇《Spring基于注解配置的容器

二、依赖管理

配置类同样是一个 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

标签:容器,Java,Spring,beanExample,return,Bean,new,BeanExample,public
From: https://www.cnblogs.com/code-artist/p/spring-4.html

相关文章

  • java——mybatis——Mybatis的CRUD——保存操作
    在第一个xml示例项目的基础上,进行操作:mybatis-config.xml文件:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3......
  • 第5章-Spring三种配置方式的混合和迁移
    目录一、配置兼容1.优先XML配置2.优先注解配置二、迁移方案1.XML配置至注解配置2.XML配置至Java配置三、附录1.配置属性2.常用注解3.示例代码Spring容器的......
  • 第6章-Spring同类型多个Bean的注入
    目录一、类型注入冲突二、解决冲突1.注入主要的2.注入指定的三、注入多个Bean1.注入集合2.注入Map3.Bean的顺序四、附录1.常用注解2.示例代码Spring容器中的B......
  • apache kafka系列之客户端开发-java
    1.依赖包    <dependency>      <groupId>org.apache.kafka</groupId>      <artifactId>kafka_2.10</artifactId>      <ver......
  • Java使用Pipeline对Redis批量读写(hmset&hgetall)
    一般情况下,RedisClient端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client。这有点类似于HBase的Scan,通常......
  • 第3章-Spring基于注解配置的容器
    目录一、Bean管理1.扫描类路径配置2.使用注解管理Bean二、依赖管理1.依赖注入1.1字段注入1.2构造器注入1.3Setter方法注入2.依赖关系3.懒加载三、附录1.配置属......
  • 第2章-Spring基于XML配置的容器
    目录一、Bean管理1.元数据2.Bean实例化2.1构造器实例化2.2静态工厂方式实例化2.3实例工厂方式实例化3.Bean作用域二、依赖注入1.依赖注入1.1构造器注入1.2Sett......
  • Spring mvc整合hibernate例子
    企业级项目实战(带源码)地址:[url]http://zz563143188.iteye.com/blog/1825168[/url]收集五年的开发资料及源码下载地址:[url]http://pan.baidu.com/......
  • spring gateway路由出现503、404错误解决方法
    查资料发现在网关出现503错误是因为全局过滤器没有加载(ReactiveLoadBalancerClientFilter),只需要将含有这个过滤器的依赖进行导入就行了<dependency><groupId>org.......
  • Spring中@Autowired注解、@Resource注解的区别
    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。@Resource的作用相当于@Autowired,只......