在SpringBoot的大环境下,基本上不再使用以前的xml配置,所以本篇博文也不再介绍以往Spring中,通过xml来声明bean的使用方式
这种也是我们最常见的使用姿势,一般就是在类上添加@Component
, @Service
等注解(@Controller
表示提供http接口的bean, @Configuration
表示配置类Bean)
添加上这种注解的类,会被Spring容器扫描加载,自动生成单例的bean,一个典型的实例如下
@Component
public class AnoDemoBean {
private String type = "AnoDemoBean";
public String getName(String name) {
return name + " _" + type;
}
}
如果在实际测试时,发现无法获取上面的bean,就需要注意下bean的包路径,是否在被你程序的扫描路径包含
@Bean
定义方式这种方式,主要是结合Configuration
来定义bean,首先是声明一个配置类,然后再配置类中,通过返回bean对象的方法形式来声明bean,一般使用姿势如下
@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
FactoryBean本质上也是一个Bean,但是可以通过他来生成你期待的Bean,在实际的业务场景中可能使用场景不多,但是在抽象的框架层面应用很广,一个简单的使用姿势如
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();
}
}
前面介绍了如何创建Bean,创建完之后,接着就是使用了,下面介绍最基本的几种使用方式
Autowired
注入将注解@Autowired
或者@Resource
添加到成员变量上,即表示这个成员变量会由Spring容器注入对应的Bean对象
@Autowired
private ConfigDemoBean configDemoBean;
由Spring容器依赖注入的方式,从代码上看,是不会找到有什么地方主动的塞入了这个值,但是使用处却可以直接使用,因此需要注意有可能会出现npe
和前面其实也差不多,只不过注解放在了setter方法上
private FacDemoBean facDemoBean;
@Autowired
private void setFacDemoBean(FacDemoBean facDemoBean) {
this.facDemoBean = facDemoBean;
}
顾名思义,就是在构造方法中传入Bean对象来初始化
public class DemoController {
private AnoDemoBean anoDemoBean;
public DemoController(AnoDemoBean anoDemoBean) {
this.anoDemoBean = anoDemoBean;
}
}
这种方式的好处是可以避免潜在的NPE问题(后面将有博文专门提及),而且针对Bean不存在的情况,系统会抛出异常,提早知道问题
本篇主要介绍了Bean的基本创建和使用姿势,基本上也是我们在平常的业务开发中使用得最广的方式了,是不是会这些就行了呢?业务做多了之后,随之而来就会有一些疑问