更多Spring文章,欢迎点击 一灰灰Blog-Spring专题java
咱们知道在Spring中,有两个很是有名的特性,依赖注入(DI)与切面(AOP),其中依赖注入其主要的做用,能够说就是维护Spring容器建立的Bean之间的依赖关系,简单来讲就是一个bean(假定名为A)持有另外一个Bean(假定名为B)的引用做为成员变量b,则由Spring容器自动将B赋值给A的成员变量bgit
所以在想理解依赖注入,就有必要了解下建立和使用Bean的几种姿式;本篇博文做为基础篇,将介绍github
<!--more-->spring
在SpringBoot的大环境下,基本上再也不使用之前的xml配置,因此本篇博文也再也不介绍以往Spring中,经过xml来声明bean的使用方式框架
这种也是咱们最多见的使用姿式,通常就是在类上添加@Component
, @Service
等注解(@Controller
表示提供http接口的bean, @Configuration
表示配置类Bean)ide
添加上这种注解的类,会被Spring容器扫描加载,自动生成单例的bean,一个典型的实例以下spring-boot
@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容器看为一个Beanui
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的基本建立和使用姿式,基本上也是咱们在日常的业务开发中使用得最广的方式了,是否是会这些就好了呢?业务作多了以后,随之而来就会有一些疑问
一灰灰的我的博客,记录全部学习和工做中的博文,欢迎你们前去逛逛
尽信书则不如,以上内容,纯属一家之言,因我的能力有限,不免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
一灰灰blog
知识星球