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
本文作者:Hi.PrimaryC
本文链接:https://www.cnblogs.com/cnff/p/17816779.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2023-03-07 Mysql 知识总结