一.什么spring-bean:
Spring bean是Spring框架在运行时管理的对象。Spring bean是任何Spring应用程序的基本构建块。你编写的大多数应用程序逻辑代码都将放在Spring bean中。
Spring bean的管理包括:
- 创建一个对象
- 提供依赖项(例如其他bean,配置属性)
- 拦截对象方法调用以提供额外的框架功能
- 销毁一个对象
二:如何定义spring-bean
如你所知,Spring负责创建bean对象。但首先,你需要告诉框架它应该创建哪些对象。你是怎么做到的?
创建bean的几种方式:
(1):通过xml配置文件
创建bean.xml
![v2-25be70fd0986e8bb79e1b7fc8fbacbd2_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-25be70fd0986e8bb79e1b7fc8fbacbd2_b.jpg)
测试:
![v2-6eb339887b3beb019253d14dc3dde9ae_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-6eb339887b3beb019253d14dc3dde9ae_b.jpg)
打印结果:
![v2-7ff5a03794c7d912591e66800686769e_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-7ff5a03794c7d912591e66800686769e_b.jpg)
(2):基于@Configuration 和@bean注解
说明:
@Configuration相当于配置文件中的<beans />标签,里面可以配置bean。表示该类为一个配置文件类
@bean:用@Bean注解的方法,会实例化、配置并初始化一个新的对象,这个对象会由spring IoC 容器管理。Bean可理解为用spring的时候xml里面的<bean>标签
创建配置类:
![v2-d40ebad49aba92fcda4eab8757992617_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-d40ebad49aba92fcda4eab8757992617_b.jpg)
测试:
![v2-a797a1b29a5a72e30a695f78b8846b69_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-a797a1b29a5a72e30a695f78b8846b69_b.jpg)
打印结果:
![v2-ad0edf840f77ae6bf53cb249c14e5ae2_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-ad0edf840f77ae6bf53cb249c14e5ae2_b.png)
(3):基于@Configuration, @ComponentScan 和@Componet、@service 、@controller、@Repository 注解方式
说明:@Repository 据访问层,也可以说用于标注数据访问组件,即DAO组件.
@Componet:把普通pojo实例化到spring容器中,相当于配置文件中的bean
创建注入的bean:
![v2-903d7e9c4d4321d1373c7d2ff4420a97_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-903d7e9c4d4321d1373c7d2ff4420a97_b.jpg)
创建配置类:
![v2-5b5d6b904e78b05ed10bd72c45dc7c5e_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-5b5d6b904e78b05ed10bd72c45dc7c5e_b.jpg)
运行打印:
![v2-dc725fe86460d991168d8e5f80a236fd_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-dc725fe86460d991168d8e5f80a236fd_b.jpg)
输出结果:
![v2-d29d9d5d9926e7060d81d2777a38a762_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-d29d9d5d9926e7060d81d2777a38a762_b.jpg)
(4):基于@Configuration 和@Import注解
说明:@Import 将类导入到springIOC容器中,其他说明请自行百度
![v2-a501b46e73e569cdb8165c3362dcad09_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-a501b46e73e569cdb8165c3362dcad09_b.jpg)
(5):基于@Configuration 加@Import 和ImportSelector 接口
ImportSelector接口主要作用是收集需要导入的配置类,如果该接口的实现类同时实现EnvironmentAware, BeanFactoryAware ,BeanClassLoaderAware或者ResourceLoaderAware,那么在调用其selectImports方法之前先调用上述接口中对应的方法,如果需要在所有的@Configuration处理完在导入时可以实现DeferredImportSelector接口
创建application.properties:
![v2-cdc3ed6c384c99f809e6bccf4af2062f_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-cdc3ed6c384c99f809e6bccf4af2062f_b.jpg)
创建MyImportSelector 实现ImportSelector,EnvironmentAware:
![v2-52b0d612615f00126dbb59b6d2e40168_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-52b0d612615f00126dbb59b6d2e40168_b.jpg)
创建配置类:
![v2-243191d1165006eab9badb83fbc5b8ba_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-243191d1165006eab9badb83fbc5b8ba_b.jpg)
说明:@PropertySource注解加载指定的属性文件
测试打印:
![v2-d1639d4fff2bcf92eb7b283d905b8d2f_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-d1639d4fff2bcf92eb7b283d905b8d2f_b.png)
![v2-585fd6588b1d8b528f5b349f1604c5f3_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-585fd6588b1d8b528f5b349f1604c5f3_b.jpg)
若改为:
![v2-bc8adadbcc4034a81a1b1e0a5af7b43a_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-bc8adadbcc4034a81a1b1e0a5af7b43a_b.jpg)
输出结果:空指针异常:
![v2-b150da66c65bcc8f59e919231823c104_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-b150da66c65bcc8f59e919231823c104_b.jpg)
(6):基于@Configuration 加@Import 和ImportBeanDefinitionRegistrar接口
创建ImportBeanDefinitionRegistrar:
![v2-7d9c9ad9094f399db4de7077731ed225_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-7d9c9ad9094f399db4de7077731ed225_b.jpg)
创建配置类:
![v2-fdb645597ecb01613b30cd397996ff48_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-fdb645597ecb01613b30cd397996ff48_b.jpg)
测试打印:
![v2-a7484a72307f1cc0cfde3b563a537b64_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=6b938c66-1c2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-a7484a72307f1cc0cfde3b563a537b64_b.jpg)