博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装配SpringBean(一)--依赖注入
阅读量:5264 次
发布时间:2019-06-14

本文共 4514 字,大约阅读时间需要 15 分钟。

所谓依赖注入,我觉得说白了其实就是给成员变量赋值,不管这个成员变量是基本类型还是引用类型,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 
2
6 7
8
9
10
11
12
13
14
15 16

上面的配置文件中主要有以下几点需要注意:

  • 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 
2
6 7
8
9
10
11
12
13
14
15 16

注意⚠️:上面的配置中:

  • 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。查看测试结果(预期应该是张三)

结果符合预期,注入成功。

以上就是依赖注入的两种实现方式。

转载于:https://www.cnblogs.com/hellowhy/p/9710554.html

你可能感兴趣的文章
instanceof
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
python之GIL release (I/O open(file) socket time.sleep)
查看>>
2015/8/4 告别飞思卡尔,抛下包袱上路
查看>>
软件开发与模型
查看>>
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
C# GC 垃圾回收机制
查看>>
mysqladmin 修改和 初始化密码
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
【翻译自mos文章】当点击完 finishbutton后,dbca 或者dbua hang住
查看>>