【基础系列】Bean之基本定义与使用

文章目录
  1. I. Bean的几种创建方式
    1. 1. 注解方式
    2. 2. @Bean定义方式
    3. 3. 工厂类方式
  2. II. Bean的使用姿势
    1. 1. Autowired注入
    2. 2. Setter方法
    3. 3. 构造方法
    4. 4. 小结
  3. II. 其他
    1. 0. 项目
    2. 1. 一灰灰Blog
    3. 2. 声明
    4. 3. 扫描关注

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

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

  • bean的基本创建方式
  • bean的常见使用姿势

I. Bean的几种创建方式

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

1. 注解方式

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

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

1
2
3
4
5
6
7
8
@Component
public class AnoDemoBean {
private String type = "AnoDemoBean";

public String getName(String name) {
return name + " _" + type;
}
}

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

2. @Bean定义方式

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Data
public class ConfigDemoBean {
private String type = "ConfigDemoBean";

public String getName(String name) {
return name + " _" + type;
}
}

@Configuration
public class BeanLoadConfig {
@Bean
public ConfigDemoBean configDemoBean() {
return new ConfigDemoBean();
}
}

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

3. 工厂类方式

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class FacDemoBean {
private String type = "FacDemoBean";

public String getName(String name) {
return name + " _" + type;
}
}

public class DemoFactoryBean implements FactoryBean<FacDemoBean> {
@Override
public FacDemoBean getObject() throws Exception {
return new FacDemoBean();
}

@Override
public Class<?> getObjectType() {
return FacDemoBean.class;
}

@Override
public boolean isSingleton() {
return true;
}
}

@Configuration
public class BeanLoadConfig {
@Bean
public DemoFactoryBean demoFactoryBean() {
return new DemoFactoryBean();
}

@Bean
public FacDemoBean facDemoBean(DemoFactoryBean demoFactoryBean) throws Exception {
return demoFactoryBean.getObject();
}
}

II. Bean的使用姿势

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

1. Autowired注入

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

1
2
@Autowired
private ConfigDemoBean configDemoBean;

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

2. Setter方法

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

1
2
3
4
5
6
private FacDemoBean facDemoBean;

@Autowired
private void setFacDemoBean(FacDemoBean facDemoBean) {
this.facDemoBean = facDemoBean;
}

3. 构造方法

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

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

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

4. 小结

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

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

II. 其他

0. 项目

1. 一灰灰Blog

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

2. 声明

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

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals


打赏 如果觉得我的文章对您有帮助,请随意打赏。
分享到