SpringBoot基础篇Bean之基本定义与使用

更多Spring文章,欢迎点击 一灰灰Blog-Spring专题

我们知道在Spring中,有两个非常有名的特性,依赖注入(DI)与切面(AOP),其中依赖注入其主要的作用,可以说就是维护Spring容器创建的Bean之间的依赖关系,简单来说就是一个bean(假定名为A)持有另一个Bean(假定名为B)的引用作为成员变量b,则由Spring容器自动将B赋值给A的成员变量b

因此在想理解依赖注入,就有必要了解下创建和使用Bean的几种姿势;本篇博文作为基础篇,将介绍

  • bean的基本创建方式
  • bean的常见使用姿势
<!--more-->

I. Bean的几种创建方式

在SpringBoot的大环境下,基本上不再使用以前的xml配置,所以本篇博文也不再介绍以往Spring中,通过xml来声明bean的使用方式

1. 注解方式

这种也是我们最常见的使用姿势,一般就是在类上添加@Component, @Service等注解(@Controller表示提供http接口的bean, @Configuration表示配置类Bean)

添加上这种注解的类,会被Spring容器扫描加载,自动生成单例的bean,一个典型的实例如下

1@Component 2public class AnoDemoBean { 3 private String type = "AnoDemoBean"; 4 5 public String getName(String name) { 6 return name + " _" + type; 7 } 8}

如果在实际测试时,发现无法获取上面的bean,就需要注意下bean的包路径,是否在被你程序的扫描路径包含

2. @Bean定义方式

这种方式,主要是结合Configuration来定义bean,首先是声明一个配置类,然后再配置类中,通过返回bean对象的方法形式来声明bean,一般使用姿势如下

1@Data 2public class ConfigDemoBean { 3 private String type = "ConfigDemoBean"; 4 5 public String getName(String name) { 6 return name + " _" + type; 7 } 8} 9 10@Configuration 11public class BeanLoadConfig { 12 @Bean 13 public ConfigDemoBean configDemoBean() { 14 return new ConfigDemoBean(); 15 } 16}

需要说明的一点是BeanLoadConfig类本身也被Spring容器看为一个Bean

3. 工厂类方式

FactoryBean本质上也是一个Bean,但是可以通过他来生成你期待的Bean,在实际的业务场景中可能使用场景不多,但是在抽象的框架层面应用很广,一个简单的使用姿势如

1public class FacDemoBean { 2 private String type = "FacDemoBean"; 3 4 public String getName(String name) { 5 return name + " _" + type; 6 } 7} 8 9public class DemoFactoryBean implements FactoryBean<FacDemoBean> { 10 @Override 11 public FacDemoBean getObject() throws Exception { 12 return new FacDemoBean(); 13 } 14 15 @Override 16 public Class<?> getObjectType() { 17 return FacDemoBean.class; 18 } 19 20 @Override 21 public boolean isSingleton() { 22 return true; 23 } 24} 25 26@Configuration 27public class BeanLoadConfig { 28 @Bean 29 public DemoFactoryBean demoFactoryBean() { 30 return new DemoFactoryBean(); 31 } 32 33 @Bean 34 public FacDemoBean facDemoBean(DemoFactoryBean demoFactoryBean) throws Exception { 35 return demoFactoryBean.getObject(); 36 } 37}

II. Bean的使用姿势

前面介绍了如何创建Bean,创建完之后,接着就是使用了,下面介绍最基本的几种使用方式

1. Autowired注入

将注解@Autowired或者@Resource添加到成员变量上,即表示这个成员变量会由Spring容器注入对应的Bean对象

1@Autowired 2private ConfigDemoBean configDemoBean;

由Spring容器依赖注入的方式,从代码上看,是不会找到有什么地方主动的塞入了这个值,但是使用处却可以直接使用,因此需要注意有可能会出现npe

2. Setter方法

和前面其实也差不多,只不过注解放在了setter方法上

1private FacDemoBean facDemoBean; 2 3@Autowired 4private void setFacDemoBean(FacDemoBean facDemoBean) { 5 this.facDemoBean = facDemoBean; 6}

3. 构造方法

顾名思义,就是在构造方法中传入Bean对象来初始化

1public class DemoController { 2 private AnoDemoBean anoDemoBean; 3 public DemoController(AnoDemoBean anoDemoBean) { 4 this.anoDemoBean = anoDemoBean; 5 } 6}

这种方式的好处是可以避免潜在的NPE问题(后面将有博文专门提及),而且针对Bean不存在的情况,系统会抛出异常,提早知道问题

4. 小结

本篇主要介绍了Bean的基本创建和使用姿势,基本上也是我们在平常的业务开发中使用得最广的方式了,是不是会这些就行了呢?业务做多了之后,随之而来就会有一些疑问

  • 提供的jar包给第三方使用,如何保证其他人能顺利加载jar包中的bean?
  • bean初始化的先后顺序是怎样的?
  • 可以手动注册一个Bean么,改怎么做?
  • BeanFactory与FactoryBean的区别是啥,各自的典型应用场景又是什么?
  • 重名的Bean是否可以解决?

II. 其他

0. 项目

1. 一灰灰Blog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )