![b0049aaea8caa08631bcabbb4b6f9a9d.png](https://i-blog.csdnimg.cn/blog_migrate/21ca2a0c10c28eb198f2fc70c365a6a6.jpeg)
今天是刘小爱自学Java的第85天。
感谢你的观看,谢谢你。
![4bd0e934dffa8fd98dbad042638f5e3d.png](https://i-blog.csdnimg.cn/blog_migrate/495b36249eb4d5fa61f71a8be01e1545.jpeg)
在spring核心配置文件中,有一个非常重要的bean标签,我们以前创建一个对象都是new。
而在spring框架中可以将对象交给spring管理,再通过spring工厂直接获取。
今天的学习内容就是关于bean标签:
- Bean的作用域:单例与多例说明。
- Bean属性依赖注入的两种方式,以及p名称空间、seEL表达式的引入。
- 补充说明一个IDEA插件。
一、bean的作用域
作用域也就是指:由spring创建的bean对象在什么情况下有效?主要有单例和多例两种。
![fc308eb070d36935346758013c94d340.png](https://i-blog.csdnimg.cn/blog_migrate/5ff8e0588be828f1a7fffbf29ad7a142.jpeg)
在spring核心配置文件中可以配置对象是单例还是多例,通过scope属性设定:
- 值为singleton即为单例,默认值,可省略。
- 值为prototype即为多例。
1单例测试
![f018530186541349a37e3582194c6b4d.png](https://i-blog.csdnimg.cn/blog_migrate/525d11979344aae6daf336c0f59955a5.jpeg)
多次获取单例对象,并打印输出。
我们会发现:如果是单例的话,构造方法只运行一次,多次获取的是同一个对象。
在spring IOC容器中仅存在一个bean实例,bean以单例方式存在。
**注意:**这边我大致提下,昨天忘记说明了,通过spring工厂获取对象时,参数可以是id,也可以是bean的类型,也就是对应接口/类的Class对象。
使用id获取最稳妥,如果根据类型获取,配置了多个类型的话,会抛出异常。
2多例测试
![fc926dcac457144e3b8c8f5d2bc54df4.png](https://i-blog.csdnimg.cn/blog_migrate/76b1106a75fcdad2cf11adae1bfc144d.jpeg)
多次获取单例对象,并打印输出。
我们会发现:多例构造方法会运行多次,多次获取的都是不同的对象。
每次从容器中调用bean时,都会返回一个新的实例,即每次调用getBean()的时候,相当于new了一次bean对象。
bean的生命周期
通过init-method属性,指定实例化后的调用方法。
通过destroy-method属性,指定销毁对象前的方法 。
二、bean属性的依赖注入
什么是Bean属性的依赖注入?
就可以理解成对一个对象的属性赋值,这个我们昨天就接触过,其有两种注入方式:
1构造器参数注入 constructor-arg
![6bc56f5505737dea2eab6b2587fd598a.png](https://i-blog.csdnimg.cn/blog_migrate/37ce139e10bf4912afbec7ec90e410e3.jpeg)
①创建Car类,定义构造方法
既然是通过构造器参数注入,那肯定需要有参构造方法,其中为了方便测试时观看,还在该类中重写一个toString方法。
②spring配置构造器参数
constructor-arg:该标签相当于在告诉spring容器,要调用有参构造方法了,不再调用默认的构造方法了。
所以必须要有有参构造方法,不然会报错。
- index:根据索引定位属性,0表示首位。
- name:根据属性参数名称定位属性。
- type:根据属性数据类型定位属性。
- value:简单的值,字符串。
- ref:复杂的值,就是通过该属性可以引用由spring容器创建的其它bean对象。
一般都是使用name属性赋值,这样最合理,也一目了然,name和type这两种都不靠谱。
配置完成,做一个测试
![86fbaa3417f9a594bc4a7825610be42a.png](https://i-blog.csdnimg.cn/blog_migrate/8f59904b7d4c5e075206ccbfc01a8821.jpeg)
根据运行结果我们能发现,通过spring的配置,可以给对象初始化赋值。
也就相当于new Car(1,"长安",20000)。
通过spring就不需要我们自己new了。
2setXXX方法属性注入
和上述构造器参数注入的效果是差不多的,只不过setXXX方法更具有选择性。
构造器参数注入有几个参数都得设置,少一个都不行,而该方法想设置哪个就设置哪个。
![648071758a2c3fa561a4cd4a783f499b.png](https://i-blog.csdnimg.cn/blog_migrate/631d7893314b6a8d7c24830b6f1a3369.jpeg)
①创建Person类,定义setXXX方法
使用Lombok插件可以快速创建一个Javabean,这个插件文章最后有说明。
②spring配置setXXX方法参数
property标签:spring中专门进行setXXX属性注入的标签 。
- name:setXXX方法的属性名字,例如setXXX()那么name的属性值为XXX。
- value:简单的值。
- ref:复杂的值,引用由spring容器创建的其它bean对象的名字。
配置完成,做一个测试
![f3b1e42d05602c0cdd9437774246b6d0.png](https://i-blog.csdnimg.cn/blog_migrate/837247e52669382dc7e0d7a4a21acefb.jpeg)
根据运行结果我们能发现,通过spring的setXXX方法属性注入,也可以给对象赋值。
该方法也就相当于通过对象调用方法setId(1),setName(“刘小爱”)…
三、p名称空间和spEL表达式
为简化XML文件的配置,Spring2.5版本开始引入了一个新的p名称空间。
准确地说,它的作用是为了简化setXXX方法属性依赖注入配置的,使用方式如下图:
![8c50bb72f1f759e9dcd4daa2577e6149.png](https://i-blog.csdnimg.cn/blog_migrate/fc0413053362a06a395247016f0f2a0d.jpeg)
在配置文件表头,引入p名称空间。
可以将property标签直接作为属性使用。
- 如果是引用简单对象,直接用属性名说明即可,比如p:id,p:name。
- 如果是引用复杂对象,需要用ref来补充说明,比如p:car-ref。
通过上图,我们能发现p名称空间能进一步地简化了代码的编写。
2spEL表达式
spEL全称Spring Expression Language,是一种表达式语言,和前面学的EL表达式很像。
![74f05f7f0e668f60d3aed1a1132cb178.png](https://i-blog.csdnimg.cn/blog_migrate/c71bfed4d618c3afb5d126096e859b6b.jpeg)
语法: #{…} ,通过该表达式可以引用属性、另一个Bean、甚至是运算,方法。
spEL表达式的使用功能比较多,Bean操作相关的通常有:
- #{bean的Id} 引用Bean,比如#{car}。
- #{bean的Id.属性} 引用Bean的属性,比如#{person1.name}。
- #{bean的Id.方法(参数)} 调用Bean的方法 。
附:补充一个Lombok插件
![82e65b91944efb33eeaf3a75bb96a305.png](https://i-blog.csdnimg.cn/blog_migrate/359cf8e1affa9a75f508be125379adfc.jpeg)
在idea开发工具中,选择File-settings,找到Plugins,在搜索框中搜索lombok。
如果以前没使用过该插件,右侧下载即可。
插件下载好后,还需要导入依赖才能使用。
![0883ad69931aae6864778c4a88a37d48.png](https://i-blog.csdnimg.cn/blog_migrate/f96eaacbb93f27e3e7f910a9e1f22d49.jpeg)
在maven网站中找到lombok,随便选择一个版本,将依赖复制到我们项目对应的pom文件中即可。
依赖导入完毕,就可以使用该插件了。
它有什么用呢?
![51959f2dd4ad4fda0face5d59c544d38.png](https://i-blog.csdnimg.cn/blog_migrate/55888813bb55de278c76724458203e7d.jpeg)
我们以前创建一个标准的JavaBean,有构造方法,有getset方法,有toString方法,一下子要写很多方法。
但是现在有了lombok插件后,只需要在类上加一个注释@Data,这些方法就都不用写了。
最后
谢谢你的观看。
如果可以的话,麻烦帮忙点个赞,谢谢你。