Spring-@Bean-注解

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

posted @ 2024-03-07 16:10  primaryC  阅读(21)  评论(0编辑  收藏  举报