前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot基础篇Bean之基本定义与使用

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

作者头像
一灰灰blog
发布2019-05-26 15:55:02
2K0
发布2019-05-26 15:55:02
举报
文章被收录于专栏:小灰灰小灰灰

I. Bean的几种创建方式

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

1. 注解方式

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

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

代码语言:javascript
复制
@Component
public class AnoDemoBean {
    private String type = "AnoDemoBean";

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

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

2. @Bean定义方式

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

代码语言:javascript
复制
@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,在实际的业务场景中可能使用场景不多,但是在抽象的框架层面应用很广,一个简单的使用姿势如

代码语言:javascript
复制
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对象

代码语言:javascript
复制
@Autowired
private ConfigDemoBean configDemoBean;

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

2. Setter方法

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

代码语言:javascript
复制
private FacDemoBean facDemoBean;

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

3. 构造方法

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

代码语言:javascript
复制
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是否可以解决?
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • I. Bean的几种创建方式
    • 1. 注解方式
      • 2. @Bean定义方式
        • 3. 工厂类方式
        • II. Bean的使用姿势
          • 1. Autowired注入
            • 2. Setter方法
              • 3. 构造方法
                • 4. 小结
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档