在框架学习中,Spring框架是我们学习内容的重要部分。关于Spring的知识点,在面试当中也经常被问到,其一些基本知识和源码相关问题。下面我们将全面的解答Spring框架中属性的集中注入方式:
首先我们创建两个实体类,User类和Car类,我们使用这两个实体,其属性如下
![ab2051e93f5c9b7ba0b6d2091fdbef6d.png](https://i-blog.csdnimg.cn/blog_migrate/64c9727c693ec9e76e16a27fb785d3de.jpeg)
![9c49cf4c767ca2080034d5ffe5f59667.png](https://i-blog.csdnimg.cn/blog_migrate/4fcfc0a1f40ce883de47bd3b4183c590.jpeg)
构造方法注入
在User对象中,我们重载了如下构造方法:
![4d7cc273fa0a76dc7b48ffea7a71c5e5.png](https://i-blog.csdnimg.cn/blog_migrate/e3e715fe3bd839f0c0d30ce34a5f6bf2.jpeg)
在配置文件ApplicationContext.xml文件中做如下配置:
![5219ac06ee0610c567c48dcb7963202b.png](https://i-blog.csdnimg.cn/blog_migrate/ca69c066bbf3aae39d73e1f7e33a76ce.jpeg)
其中:index为属性在指定构造函数中参数列表的索引;type为属性的类型,这两个属性无论类中含有多少个构造方法都能锁定到唯一的构造函数上进行属性值注入。
junit测试方法:
![6bc1b3088c37cb523723d25c5eb5c4e8.png](https://i-blog.csdnimg.cn/blog_migrate/fecdd49031cfb174601352cc777a429f.jpeg)
测试结果:
![bd48693bab9eb6d0ee4d82cd6d352e1f.png](https://i-blog.csdnimg.cn/blog_migrate/55063194619fa9a498d89f6fb398786f.jpeg)
set方法注入
set方法注入属性值需要在user和car类中生成set和get方法。
配置文件书写:
![f72dc23d3cd234fba5ea6cff0eedf892.png](https://i-blog.csdnimg.cn/blog_migrate/d02b8a29e2a301631f14d3ffb1d73d9a.jpeg)
junit测试类方法:
![6e2d6c910634bc9d6eac8757593766c8.png](https://i-blog.csdnimg.cn/blog_migrate/24b175d4e93b6fa9c185bdbdc610b355.jpeg)
测试结果:
![d9d90fbe18bfd550833b0ca1a2a6f0e0.png](https://i-blog.csdnimg.cn/blog_migrate/7151f35d74e9b4d000b3fbefa194d327.jpeg)
p方法注入
p方法注入是一个使用比较少的方式,很少使用,只需要知道有这个方式即可,在使用p方式注入属性的值时,需要增加p约束
![ae6b7a889866032322692974d63bff48.png](https://i-blog.csdnimg.cn/blog_migrate/db993b0885fc2f6010e6590c0d8ca1b9.jpeg)
配置文件书写方式:
![b41c03db7ebf24d9859a3313c6ec7c43.png](https://i-blog.csdnimg.cn/blog_migrate/bface35b343f5736870e2d39ecfeb41a.jpeg)
junit测试类方法:
![a7f595d8b38193e76f111c17263dd0c5.png](https://i-blog.csdnimg.cn/blog_migrate/4a4b73adc37e2b98f02ab3c1682403fc.jpeg)
测试结果:
![f02e42364c62133b6001ed212839ceb6.png](https://i-blog.csdnimg.cn/blog_migrate/526856ddc15f87e3bf36cc6fbebfce12.jpeg)
SPEL注入 Spring Expression Language Spring 表达式语言注入
spel注入方式类似于EL表达式取值,value中的值使用#{}的形式获取,可以取任意对象的值。
配置文件书写如下:
![e93680a1bcc6d0e1f9b1f17687c210e2.png](https://i-blog.csdnimg.cn/blog_migrate/fd7a4278f74cafefc48c6d1b5535bd67.jpeg)
junit测试类方法:
![21af138613d6e8351c87789e32e0ae06.png](https://i-blog.csdnimg.cn/blog_migrate/b80c28b8388f30e2cce9d60b7a5511f8.jpeg)
测试结果:
![ad09136e2bdb2b385360640818ae5f0f.png](https://i-blog.csdnimg.cn/blog_migrate/94e9c3d9012bf96b05a963d6b6aeef63.jpeg)
复杂类型注入
复杂类型注入例如数组array、list和set集合、map集合、properties键值对形式的值注入。为了更好地展示,我们新建一个CollectionBean类,定义以上私有成员变量,并生成get和set方法:
![05ed88d78d25709805ab5bc644afb0c1.png](https://i-blog.csdnimg.cn/blog_migrate/42801516f699662142a4903bdab2d049.jpeg)
- array数组类型注入:
![9febfe2f763b44e2d35c8990a40b1052.png](https://i-blog.csdnimg.cn/blog_migrate/1acfe9c2c1889673d95c11d5c5ef386f.jpeg)
2.list集合注入(和set注入相同):
![cba2624f6783987a3e388f23227b6f2c.png](https://i-blog.csdnimg.cn/blog_migrate/c1f7d788a3154555eec2784dac3c449f.jpeg)
3.map集合注入
![4f7ec6a2dba9596048d04329f575bd28.png](https://i-blog.csdnimg.cn/blog_migrate/111c307fbfc0c1ee04013f9190f7b5bb.jpeg)
4.properties类型注入:
![4fe1ae335ad4536477bb875edacbb18a.png](https://i-blog.csdnimg.cn/blog_migrate/1c67a9505362f54dae6cc19398eeda21.jpeg)
junit测试类方法:
![30250e27b17b15e304b7cd8dbd64c334.png](https://i-blog.csdnimg.cn/blog_migrate/921a0a245cb3aa78c2c64b5d93cf4e1f.jpeg)
测试结果:
![38a91d5bc298566c2c71e348224d0631.png](https://i-blog.csdnimg.cn/blog_migrate/7efe64c2037c28640721c19a23ebc67f.jpeg)