所谓依赖注入,我觉得说白了其实就是给成员变量赋值,不管这个成员变量是基本类型还是引用类型,Spring中常用的依赖注入方式有两种:
1、构造器注入
2、setter注入
下面通过代码实例说明这两种注入的实现方式。
一、构造器注入
1、构造注入的原理
构造注入是利用类的构造方法,大部分情况下我们是通过类的构造函数(含参数或不含参数)创建一个对象,Spring中也可以通过反射方法通过构造函数完成注入。所以这种注入方式一般是用于引用类型。
2、代码实现
在spring中实现需要三个步骤:
1⃣️创建类,提供构造方法。
1 public class Employee { 2 private Integer id; 3 4 private String username; 5 6 private String pwd; 7 8 private String sex; 9 10 private String random;11 12 public Employee() {13 }14 //通过含参数的构造方法进行注入15 public Employee(Integer id, String username, String pwd, String sex, String random) {16 this.id = id;17 this.username = username;18 this.pwd = pwd;19 this.sex = sex;20 this.random = random;21 }22 }
2⃣️配置spring文件,如果构造函数含有参数,还需要定义参数。
1 26 7 8 9 15 1610 11 12 13 14
上面的配置文件中主要有以下几点需要注意:
- id:通过id获取该bean(资源)
- class:需要装配的类的全限定名
- constructor-arg:配置构造函数的参数,属性name是参数名称,value是参数值
注意⚠️:参数类型无需定义,spring会自动转化。因为我的类中定义的id是整形,在配置文件中没有定义数据类型,我debug时发现注入成功之后它已经被转换为Integer类型了。
3⃣️通过spring装配(之后的文章会介绍,本文先以XML方式实现)
1 public class SpringIocTest { 2 3 public static void main(String[] args) { 4 ClassPathXmlApplicationContext context = null; 5 String xmlPath = "classpath*:spring-iocconfig.xml"; 6 try { 7 context = new ClassPathXmlApplicationContext(xmlPath); 8 //装配bean 9 Employee user = (Employee) context.getBean("employee");10 System.out.println(user.getUsername());11 } catch (BeansException e) {12 System.out.println(e.getMessage());13 } finally {14 if (null != context) {15 context.destroy();16 }17 }18 }19 }
上面代码用来测试是否注入成功,ClassPathXmlApplicationContext是通过XML的方式装配bean,其中最重要的是context.getBean("employee")这句,其中的employee就是在配置文件中定义的id,这样就能获取到这个bean实例,下面看以下测试结果(预测应该就是上面配置的李四):
注意⚠️:因为调用了getName方法,所以在定义类的时候需要提供getter方法,我没有贴出来!!
看结果与预测是一致的,并且从打印出的信息看出注入的过程中加载了配置文件获取bean。
上面就是构造注入的实现过程。
二、setter注入
setter注入是Spring中最常使用的注入方式,它是利用java bean中定义的setter方法实现注入。使用构造注入时需要给构造函数传多个参数,如果改用setter方法,就不需要定义构造方法了,只要定义一个无餐构造函数和对应的setter方法即可。setter注入实现的步骤也有三步:
1⃣️创建类,提供无参构造方法和setter方法
1 public class Employee { 2 private Integer id; 3 4 private String username; 5 6 private String pwd; 7 8 private String sex; 9 10 private String random;11 12 public Employee() {13 }14 15 public Integer getId() {16 return id;17 }18 19 public void setId(Integer id) {20 this.id = id;21 }22 23 public String getUsername() {24 return username;25 }26 27 public void setUsername(String username) {28 this.username = username == null ? null : username.trim();29 }30 31 public String getPwd() {32 return pwd;33 }34 35 public void setPwd(String pwd) {36 this.pwd = pwd == null ? null : pwd.trim();37 }38 39 public String getSex() {40 return sex;41 }42 43 public void setSex(String sex) {44 this.sex = sex == null ? null : sex.trim();45 }46 47 public String getRandom() {48 return random;49 }50 51 public void setRandom(String random) {52 this.random = random == null ? null : random.trim();53 }54 }
一般定义setter和getter方法,setter设置值,getter获取值。
2⃣️配置bean文件
1 26 7 8 9 15 1610 11 12 13 14
注意⚠️:上面的配置中:
- id:获取这个bean的标识
- class:需要注入类的全限定名
- property:类中的成员变量(属性),需要设置哪些变量的值就设置哪些
- value:属性值
3⃣️通过spring装配
1 public class SpringIocTest { 2 3 public static void main(String[] args) { 4 ClassPathXmlApplicationContext context = null; 5 String xmlPath = "classpath*:spring-ioc.xml"; 6 try { 7 context = new ClassPathXmlApplicationContext(xmlPath); 8 //装配bean 9 Employee user = (Employee) context.getBean("employee1");10 System.out.println(user.getUsername());11 } catch (BeansException e) {12 System.out.println(e.getMessage());13 } finally {14 if (null != context) {15 context.destroy();16 }17 }18 }19 }
同构造注入中介绍的一样,也是通过XML方式获取bean,只不过为了区分在XML中将bean的id定义为employee1。查看测试结果(预期应该是张三)
结果符合预期,注入成功。
以上就是依赖注入的两种实现方式。