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