@Bean 注解是非常常见的一个注解,我们将一个非 @Component 的类交给 Spring 容器管理,就需要用到 @Bean 注解。但是 @Bean 注解并不只是表面上看起来这么简单。

本文章将从 @Bean 的初步使用描述,源码待续。。

目录

@Bean 将类交给容器管理

@Bean注解内的信息

@Bean(autowireCandidate = false) 的使用


@Bean 将类交给容器管理

首先创建一个UserService, 不标记 @Component 注解。按照正常情况,Spring容器是不会创建 UserService 这样一个 Bean 的。

@Slf4j
public class UserService {public void show() {log.info("show()");}}

我们在 ***Application 启动类中添加如下代码,手动通过 @Bean 将 UserService 交给 Spring 容器管理。

@SpringBootApplication
public class StudyApplication {public static void main(String[] args) {SpringApplication.run(StudyApplication.class, args);}// add------------@Beanpublic UserService getUserService() {return new UserService();}
}

然后创建一个类,实现 CommandLineRunner 接口,@Autowire 自动注入 UserService, 并且重写方法 run() 里面调用 UserService 的 show() 方法:

@Component
@Slf4j
public class StudyBeanFirst implements CommandLineRunner {@Autowiredprivate UserService userService;@Overridepublic void run(String... args) throws Exception {userService.show();}
}

可以看到控制台成功输出了

结论:使用 @Bean 注解能将一个类交给容器管理

@Bean注解内的信息

当然,@Bean 不会这么简单,我们看一看注解内有什么东西,直接上源码:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {@AliasFor("name")String[] value() default {};@AliasFor("value")String[] name() default {};/** @deprecated */@DeprecatedAutowire autowire() default Autowire.NO;boolean autowireCandidate() default true;String initMethod() default "";String destroyMethod() default "(inferred)";
}
  1. value() name() 是给要交个容器管理的类取一个名字,@Autowired - byName 的时候,可以通过这些名字进行getBean。
  2. autowire() 是指指定注入的类型,默认为NO,可选择ByName、ByType,但是这个注解已经被建议不再使用了。
  3. autowireCandidate() 是指,其他地方是否能通过 @Autowire 注入当前 Bean。如果为 false,只能调用 @Bean 标注的方法进行获取 Bean。
  4. initMethod()destroyMethod() 是指声明周期的方法,在 Bean 初始化、被销毁的时候执行的方法。

@Bean(autowireCandidate = false) 的使用

UserService 保持原本的方式不变,我们再写入一个 SystemService:

@Slf4j
public class SystemService {private UserService userService;public SystemService(UserService userService) {this.userService = userService;}public void getSystemMethod() {userService.show();}}

由于 UserService 上面的 Bean为@Bean(autowireCandidate = false),所以不能直接注入,需要其他的处理。

我们也将 SystemService 再 XXXApplication 中以 @Bean 的方式进行操作:

@SpringBootApplication
public class StudyApplication {public static void main(String[] args) {SpringApplication.run(StudyApplication.class, args);}@Beanpublic UserService getUserService() {return new UserService();}@Beanpublic SystemService getSystemService() {return new SystemService(getUserService());}
}

这样,SystemService 就能获取到 UserSerive 进行操作了。

启动业务类:

@Component
@Slf4j
public class StudyBeanFirst implements CommandLineRunner {@Autowiredprivate SystemService systemService;@Overridepublic void run(String... args) throws Exception {systemService.getSystemMethod();log.info("1");}
}

输出:

源码待续。。

Spring-@Bean相关推荐

  1. spring Bean自动装配

    spring Bean自动装配 自动装配是使用spring满足bean依赖的一种方式. spring会在应用上下文中为某个bean寻找其依赖的bean. spring自动装配需要从两个角度来实现,或者 ...

  2. Spring Bean 中的线程安全

    在 使用Spring框架时,很多时候不知道或者忽视了多线程的问题.因为写程序时,或做单元测试时,很难有机会碰到多线程的问题,因为没有那么容易模拟多线 程测试的环境.但如果不去考虑潜在的漏洞,它就会变成 ...

  3. Spring Bean配置方式之一:Java配置

    简介: Spring bean 是使用传统的 XML 方法配置的.在这篇文章中,您将学习使用基于纯 Java 的配置而非 XML 来编写 Spring bean 并配置它们.本文将介绍可用来配置 be ...

  4. Spring bean 实现生命周期的三种解决方案

    Spring bean 实现生命周期的三种解决方案 参考文章: (1)Spring bean 实现生命周期的三种解决方案 (2)https://www.cnblogs.com/javawebsoa/a ...

  5. Spring ----Bean的生命周期

    这Spring框架中,一旦把一个bean纳入到Spring IoC容器之中,这个bean的生命周期就会交由容器进行管理, 一般担当管理者角色的是BeanFactory或ApplicationConte ...

  6. 【Spring实战】注入非Spring Bean对象

    2019独角兽企业重金招聘Python工程师标准>>> 大家经常用到Spring IOC去管理对象之间的依赖关系,但一般情况下都有一个前提:这些Bean对象必须是通过Spring容器 ...

  7. spring bean作用域_Spring面试知识点,这是我见过最全面的 - 知识铺

    知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停地来唤醒记忆深处的知识点. Q1.什么是Spring框架? Spring是最流行的企业应用程序框架之一.Spring ...

  8. 【一步一步学习spring】spring bean管理(上)

    1. spring 工厂类 我们前边的demo中用到的spring 工厂类是ClassPathXmlApplicationContext,从上图可以看到他还有一个兄弟类FileSystemApplic ...

  9. Spring bean加载多个配置文件

    在一个大的项目结构,Spring bean配置文件位于不同的文件夹以便于维护和模块化.例如,Spring-Common.xml在common 文件夹中,Spring-Connection.xml 在c ...

  10. spring bean生命周期管理--转

    Life Cycle Management of a Spring Bean 原文地址:http://javabeat.net/life-cycle-management-of-a-spring-be ...

最新文章

  1. 3的三个整数立方和有多少个解?全球40万台计算机助力,MIT研究登上PNAS
  2. Effective Java之对于实例控制,枚举类型优于readResolve(七十七)
  3. 华为智能家居app未能连接上远程云服务_【InForSec通讯】智能家居云平台实体间交互状态安全分析 | Usenix2019...
  4. 大数据学习笔记20:MR案例——按电影热度值排序
  5. tomcat加上了https后访问不了_西部数码使用指南:部署https后访问提示存在安全隐患的排查解决方法...
  6. JQuery实现ajax跨域
  7. WayOs扩展WAN口工具1.4隆重发布,同时发布BCM内置三天智能重启超级终端调试图...
  8. 安装CocoaPods常见命令
  9. php连接mysql的方式_php连接mysql的三种方式
  10. 虚拟机专用win7系统_手机上运行win系统!不是远程桌面!
  11. 统计fasta序列条数
  12. Android平台车牌识别开发手册
  13. Ftp客户端-C#程序
  14. C语言-投票选举问题
  15. 从机械硬盘和固态硬盘的结构来看IO
  16. 两个一维数组合成二维数组
  17. 计算机怎样发现路由器上u盘,360 P2 无线路由器通过电脑终端查看路由USB存储设备操作流程 路由器...
  18. 2022.10.14 英语背诵
  19. poi解决受保护视图问题
  20. Mysql的四表练习题(一)

热门文章

  1. 2021-06-21指针与变量 和字符数组作业。
  2. 软考成绩什么时候出?
  3. PLC信号处理系列之开关量信号(DI)防抖
  4. vue中实现电子签名
  5. Windows程序意外挂掉,但显存依然被占用
  6. 高斯消元——解线性方程组+球形空间产生器+开关问题
  7. 口语对话 谈判的基本技巧
  8. 【论文写作】有了这些网站,可以解决论文写作中99.9%的问题!
  9. STM VCP移植笔记
  10. tzc 1345 推箱子