Spring常⽤的三种注⼊⽅式+{集合注⼊(set注⼊⼀种)} Spring通过DI(依赖注⼊)实现IOC(控制反转),常⽤的注⼊⽅式主要有三种:构造⽅法注⼊,setter注⼊,基于注解的注⼊。
构造⽅法注⼊
先简单看⼀下测试项⽬的结构,⽤maven构建的,四个包:
entity:存储实体,⾥⾯只有⼀个User类
dao:数据访问,⼀个接⼝,两个实现类
service:服务层,⼀个接⼝,⼀个实现类,实现类依赖于IUserDao
test:测试包
在spring的配置⽂件中注册UserService,将UserDaoJdbc通过constructor-arg标签注⼊到UserService的某个有参数的构造⽅法
如果只有⼀个有参数的构造⽅法并且参数类型与注⼊的bean的类型匹配,那就会注⼊到该构造⽅法中。
测试打印结果:jdbc-登录成功
注:模拟⽤户登录的loginUser⽅法其实只是打印了⼀条输出语句,jdbc实现的类输出的是:jdbc-登录
成功,mybatis实现的类输出的是:mybatis-登录成功。
问题⼀:如果有多个有参数的构造⽅法并且每个构造⽅法的参数列表⾥⾯都有要注⼊的属性,那userDaoJdbc会注⼊到哪⾥呢?
spring ioc注解
问题⼆:如果只有⼀个构造⽅法,但是有两个参数,⼀个是待注⼊的参数,另⼀个是其他类型的参数,那么这次注⼊可以成功吗?
结果:会注⼊到只有⼀个参数的构造⽅法中,并且经过测试注⼊哪⼀个构造⽅法与构造⽅法的顺序⽆关
结果:失败了,即使在costract-arg标签⾥⾯通过name属性指定要注⼊的参数名userDao也会失败.
问题三:如果我们想向有多个参数的构造⽅法中注⼊值该在配置⽂件中怎么写呢?
参考写法:通过name属性指定要注⼊的值,与构造⽅法参数列表参数的顺序⽆关。
问题四:如果有多个构造⽅法,每个构造⽅法只有参数的顺序不同,那通过构造⽅法注⼊多个参数会注⼊到哪⼀个呢?
结果:哪个构造⽅法在前就注⼊哪⼀个,这种情况下就与构造⽅法顺序有关。
setter注⼊
配置⽂件如下:
注:上⾯这两种写法都可以,spring会将name值的每个单词⾸字母转换成⼤写,然后再在前⾯拼接上”s
et”构成⼀个⽅法名,然后去对应的类中查该⽅法,通过反射调⽤,实现注⼊。
切记:name属性值与类中的成员变量名以及set⽅法的参数名都⽆关,只与对应的set⽅法名有关,下⾯的这种写法是可以运⾏成功的
还有⼀点需要注意:如果通过set⽅法注⼊属性,那么spring会通过默认的空参构造⽅法来实例化对象,所以如果在类中写了⼀个带有参数的构造⽅法,⼀定要把空参数的构造⽅法写上,否则spring没有办法实例化对象,导致报错。
基于注解的注⼊
在介绍注解注⼊的⽅式前,先简单了解bean的⼀个属性autowire,autowire主要有三个属性值:constructor,byName,byType。
constructor:通过构造⽅法进⾏⾃动注⼊,spring会匹配与构造⽅法参数类型⼀致的bean进⾏注⼊,如果有⼀个多参数的构造⽅法,⼀个只有⼀个参数的构造⽅法,在容器中查到多个匹配多参数构造⽅法的bean,那么spring会优先将bean注⼊到多参数的构造⽅法中。
byName:被注⼊bean的id名必须与set⽅法后半截匹配,并且id名称的第⼀个单词⾸字母必须⼩写,这⼀点与⼿动set注⼊有点不同。
byType:查所有的set⽅法,将符合符合参数类型的bean注⼊。
下⾯进⼊正题:注解⽅式注册bean,注⼊依赖
主要有四种注解可以注册bean,每种注解可以任意使⽤,只是语义上有所差异:
1. @Component:可以⽤于注册所有bean
2. @Repository:主要⽤于注册dao层的bean
3. @Controller:主要⽤于注册控制层的bean
4. @Service:主要⽤于注册服务层的bean
描述依赖关系主要有两种:
1、@Autowired默认按照byType⽅式进⾏bean匹配,@Resource默认按照byName⽅式进⾏bean匹配
2、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看⼀下导⼊注解的时候这两个注解的包名就⼀清⼆楚了
Spring属于第三⽅的,J2EE是Java⾃⼰的东西,因此,建议使⽤@Resource注解,以减少代码和Spring之间的耦合。
集合注⼊:
java中的集合主要有:List,Set,Map,此外还有个Properties
新建⼀个web⼯程(我IDEMyEclipse6.5),新建两个包com.sw.action,st
1. 在com.sw.action包中新建⼀个java⽂件:DI,内容如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。