首页 > 其他分享 >Spring-@Bean-注解

Spring-@Bean-注解

时间:2024-03-07 16:24:23浏览次数:23  
标签:容器 Spring bean Bean 注解 方法 public

1. 作用

  • 用于将对象存入spring的ioc容器中。

  • @controller、@Service、@Component、@Configuration、@Repository 等几个注解是一样的,都是负责将对象存入容器当中,而@Bean是用在方法上,将当前方法的返回值对象放到容器当中。

2. 使用

  • @Bean 一般出现在方法上面,也可用于自定义注解上。

  • @Bean 修饰的方法,可以放在 @controller、@Service、@Component、@Configuration、@Repository 修饰的类当中,这样项目在启动的时候,@Bean 方法返回的对象也会立马存入容器当中!放在启动类也是可以的哦!光通过 @Bean 是无法将对象放入容器当中的

  • @Bean 生成的 Bean 名字默认是方法名,也可以通过 name 或 value 属性指定。

  • 对方法的要求: 可以使用static final修饰、但是有个前提方法一定要有返回值,否则启动报错!

3. Springboot 中获取 bean

1. 启动类中获取

@SpringBootApplication
public class AnnotationMain {

    public static ConfigurableApplicationContext ac;

    public static void main(String[] args) {
        ac = SpringApplication.run(AnnotationMain.class, args);

        ac.getBean("myPerson");
    }
}

2. 手动注入 ApplicationContext

@RestController
public class DemoController {

    @Autowired
    private ApplicationContext applicationContext;

    @RequestMapping("/demo1")
    public void demo1(){
       
        for(String beanDefinition : applicationContext.getBeanDefinitionNames()){
            System.out.println(beanDefinition);
        }
    }

}

4. 依赖注入

@Bean 也可以依赖任意数量其他的 bean,是通过方法参数实现依赖注入的,就是 @Bean 修饰的方法上的参数

//会在创建 Person bean 时,从容器中查找 dog 依赖,实现方式类似 @Resource
@Bean
public Person myPerson(Dog dog){
    Person person = new Person();
    person.setDog(dog);
    return person;
}

5. 属性解析

1. name/value

生成 bean 指定 name,默认方法名。

2. initMethod

执行初始化 bean 的时候执行的方法

3. destroyMethod

销毁 bean 时执行的方法。
这里的销毁,必须时从 容器中移除,直接关闭 spring 容器是不会执行的。

6. Bean 增强

@Bean
@Profile("dev")
@Scope("prototype")
@Order(-100)
public MyBean myBean() {
    // instantiate and configure MyBean obj
    return obj;
}
  • @Profile: 指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件

  • @Scope: 他用来配置Bean实例的作用域对象。@Scope 具有以下几种作用域:

    • singleton:单实例的(单例)(默认)----全局有且仅有一个实例
    • prototype:多实例的(多例)---- 每次获取Bean的时候会有一个新的实例
    • reqeust:同一次请求----request:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
    • session:同一个会话级别---- session:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
  • @Lazy: 可以延迟加载bean对象,即在使用时才去初始化。一是可以减少Spring的IOC容器启动时的加载时间,二是可以解决bean的循环依赖问题。

  • @DependsOn: 主要用于指定当前bean所依赖的beans。任何被指定依赖的bean都由Spring保证在当前bean之前创建。在少数情况下,bean不是通过属性或构造函数参数显式依赖于另一个bean,但却需要要求另一个bean优先完成初始化,则可以使用@DependsOn这个注解。

  • @Primary: 假如容器当中有两个A对象,使用@Autowired根据类型注入就会异常,@Primary是一种在注入点级别解决歧义的机制,可以解决该问题!

  • @Order: 主要用来控制配置类的加载顺序,设置的值越小越优先加载!

  • @Conditional:这是 Spring 的注解,它接受一个或多个Condition类,这些类需要实现Condition接口,并重写其matches方法。只有当所有Condition类的matches方法都返回true时,带有@Conditional注解的Bean才会被创建。

  • @ConditionalOnProperty:这个注解表示只有当一个或多个给定的属性有特定的值时,才创建带有该注解的Bean。

  • @ConditionalOnClass 和 @ConditionalOnMissingClass:这两个注解表示只有当Classpath中有(或没有)特定的类时,才创建带有该注解的Bean。

  • @ConditionalOnBean 和 @ConditionalOnMissingBean:这两个注解表示只有当Spring ApplicationContext中有(或没有)特定的Bean时,才创建带有该注解的Bean。

参考文献

https://blog.csdn.net/weixin_43888891/article/details/127416437

标签:容器,Spring,bean,Bean,注解,方法,public
From: https://www.cnblogs.com/cnff/p/17816779.html

相关文章

  • 若依集成CIM(即时推送系统)实现将服务端修改为SpringBoot+Vue前后端分离版(文末见代码
    ​ 场景若依前后端分离版本地搭建开发环境并运行项目的教程:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 CIMGitee地址:https://gitee.com/farsunset/cimCIM项目是基于mina或者netty框架下的推送系统,我们平常使用第三方的推送SDK,如极光推送,百度......
  • Spring-@ControllerAdvice-全局处理注解
    1,@ControllerAdvice介绍@ControllerAdvice是Spring框架提供的一个注解,用于定义全局的异常处理器和全局数据绑定。它通常用于集中处理应用程序中的异常,并提供统一的异常处理逻辑。2,@ControllerAdvice的基本使用packageorg.springframework.web.bind.annotation;importj......
  • spring-JSON序列化
    1,使用场景。SpringBoot默认json为JackJson。在Controller需要返回Json数据时,我们使用了RestController,如果想对返回的数据进行一定的处理,也就是序列化对象为Json时使用。反序列化,就是当接收的参数想做一定处理,获取到处理后的数据时候。2,JsonSerializer序列化1,自定......
  • spring-HandlerMethodArgumentResolver-参数解析器
    1,参数解析器介绍  HandlerMehtodArgumentResolver,中文成为方法参数解析器,是SpringMvc组件的众多解析器之一,主要用来对Controller的方法参数进行处理。2,参数解析器的使用1,实现HandlerMethodArgumentResolver,自定义解析器publicclassMyHandlerMethodArgumentResolver......
  • Spring-@Validated-参数校验
    1.什么是javax.validationJSR303是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面(面向注解编程的时代),就可以在需要校验的时候进行校验了,在SpringBoot中已经包含在starter-web中,再其他项目中可以引用依赖,并自行......
  • Springcloud Alibaba-8-链路追踪
    1.基本概念在微服务架构中,一个请求可能需要调用很多个服务,若其中出现了错误很难去定位。链路追踪,就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等......
  • Spring反序列化失败 Type definition error: [simple type, class xxx.xxx.xxx]
    也许更好的阅读体验Typedefinitionerror:[simpletype,classcom.elm.po.CommonResult];nestedexceptioniscom.fasterxml.jackson.databind.exc.InvalidDefinitionException:Cannotconstructinstanceofcom.elm.po.CommonResult(noCreators,likedefaultconstru......
  • SpringBoot使用外部Web容器的解决方案
    SpringBoot默认内嵌了Web容器(如Tomcat、Jetty或Undertow),这使得应用可以作为独立的可执行JAR或WAR文件运行,无需外部Web容器。然而,在某些情况下,你可能想要将SpringBoot应用部署到外部的Web容器中,比如ApacheTomcat或Jetty。嵌入式的Web容器:应用可以打包成可执行的Jar。优点:简单......
  • META-INF/spring.factories自动化配置
    META-INF/spring.factories文件是SpringBoot项目中非常重要的一个文件,用于声明各种自动配置类、监听器、初始化器等。这个文件通常用来启用和配置各种SpringBoot自动配置模块。具体来说,spring.factories文件采用Java的属性文件格式,其中包含了多个键值对,每个键代表一个......
  • 玩转SpringBoot:SpringBoot的几种定时任务实现方式
    引言在现代软件开发中,定时任务是一种常见的需求,用于执行周期性的任务或在特定的时间点执行任务。这些任务可能涉及数据同步、数据备份、报表生成、缓存刷新等方面,对系统的稳定性和可靠性有着重要的影响。SpringBoot提供了强大且简单的定时任务功能,使开发人员能够轻松地管理和执......