文章目录
- 1.什么是DI依赖注入
- 2. set方法注入
- 3. ref属性
- 4. 有参构造方法注入
- 5. Lombok
- 6. SpEL
1.什么是DI依赖注入
依赖注入(Dependency Injection,简称DI)是一种设计模式,也是Spring框架的核心概念之一。其基本思想是将程序中的各个组件之间的依赖关系从程序内部转移到外部容器中,从而实现松耦合,以便于开发测试。
具体来说,依赖注入是指在程序运行期间,由外部容器动态地将依赖对象注入到组件中。例如,可以通过构造函数注入、Setter注入、注解注入等方式来实现依赖注入。
⭐ 简单来说DI依赖注入就是要让Spring来给Bean对象的属性进行赋值
2. set方法注入
在Java中,set方法注入是一种依赖注入的方式。它通过调用对象的setter方法来注入依赖关系。这种方式通常用于将一个对象的属性设置为另一个对象。
例如,假设我们有一个名为Student的类,它有一个属性为name的String类型变量和一个属性为age的int类型变量。我们可以使用set方法注入来将这些属性设置为其他对象。
可以在Spring的配置文件配置Bean对象时进行设置,使用<property>
标签
示例: 比如这里有一个Student类,有age和name两个属性
接下来通过bean
标签将bean对象注入Spring容器中,同时通过<property>
这个标签对Student类的这两个属性进行注入
接下来获取Bean对象,并进行打印
可以看到配置的值已经注入进去了
🔺注意: 虽然上面是在配置文件中进行的属性注入,但是本质上还是set方法注入.很好验证, 如果把set方法注释掉,那么配置文件中配置的相应属性就会报错
3. ref属性
除此之外,如果成员变量中有引用数据类型,类如:一个类中有另外一个类的实例,会需要使用bean标签中的ref
属性
还是Student类,除此之外还有School这个类的实例,
public class Student {
private int age;
private String name;
private School school;
}
age和name因为是Student类的属性,很好进行注入. 那如何注入School这个属性呢?
这时候就需要使用ref这个属性了
看下图:
对于School这个类实例成员变量,不能直接注入,我们要先把School注入到Spring容器中,然后在Student的bean标签中使用ref属性将School进行注入,同时别忘了前提条件是有对应的setter方法.
如果要注入School类中的成员变量,就需要在school这个bean标签中使用<property>
这个标签进行注入
4. 有参构造方法注入
有参构造注入是一种依赖注入的方式,它
通过在类的构造函数中传入依赖对象来实现依赖注入
。这种方式通常用于将一个对象的属性设置为另一个对象。
还是刚才的Student类,同样是在配置文件中进行注入,使用的标签:<constructor-arg>
. 与set方法注入类似,只是换了一个方法和标签而已
示例:
public class Student {
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
}
在Java中除了基本数据类型,还有一些其它的数据类型.例如:List,Set和Map等. 这种类型的数据要如何注入呢?其实也是类似的,复杂类型可以差分成简单的类型进行注入.
5. Lombok
在前面的示例中以及在平时的开发中,我们可以看到一些类的setter和getter方法以及构造方法都需要使用到,虽然IDEA可以帮我们生成,但是如果类中的成员变量很多,就会不可避免的会觉得代码比较臃肿.
接下来来学一个小工具Lombok
Lombok是一个Java库,它能够自动插入编辑器并构建工具,从而简化Java开发。
这个库的主要功能是通过注解的方式,让开发人员不需要手动编写例如getter或setter等样板式代码。
此外,Lombok还提供了自动化日志变量,通过简单的注解,可以让类拥有完全功能的构建器。
先来体验一下Lombok
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int age;
private String name;
public static void main(String[] args) {
User user1 = new User();
user1.setAge(16);
user1.setName("zhangsan");
User user2 = new User(18,"lisi");
System.out.println(user1.toString());
System.out.println(user2.toString());
}
}
- @Data: 此注解可以帮助我们生成一些setter,getter,toString等方法
- @NoArgsConstructor: 空参的构造方法
- @AllArgsConstructor: 全参的构造方法
如图所示:
⭐需要注意的是,Lombok并非一个标准的Java库,在使用时,还需要在项目的构建文件中添加对应的maven依赖以及安装Lombok 对应的插件。
Lombok所需要的依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
Lombok插件
6. SpEL
Spring表达式语言,全称“Spring Expression Language”,简称为“SpEL”,是一种功能强大的Spring表达式语言,全称“Spring Expression Language”,简称为“SpEL”,是一种功能强大的表达式语言。它类似于Struts2x中使用的OGNL表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能完美整合,如能用来配置Bean定义。
示例:
@Data
public class Student {
private int age;
private String name;
}
之前在注入Student类的成员变量是,都是直接写的具体数字.
上面这种的话数据是写死的,不够灵活,如果想要动态变化,就可以使用SPEL表达式,是需要使用#{表达式}
这种形式来实现.
例如:
上述只是一个简单的示例.
SpEL具有丰富的表达式类型,例如字面表达式、布尔和关系运算符、正则表达式、类表达式、访问属性、数组、列表和映射、方法调用等。表达式语言一般是用最简单的形式完成最主要的工作,以此减少工作量。例如,我们可以使用# {expression}
作为SpEL表达式的默认格式,表达式主体包围在花括号中。