Spring 的入门
# Spring 的入门
# 什么是控制反转(IOC)
控制反转:是一个理论,概念,思想。把对象的创建,赋值,管理工作都交给代码之外的容器实现,也就是对象的创建是有其它外部资源完成,这样做实现了与解耦合。
- 正转:对象的创建、赋值等操作交由程序员手动完成,即使用类似 new Xxx (Xxx Xxx)、Xxx.setXxx () 语句完成对象的创建与赋值,缺点是一旦程序功能发生改变,涉及到的类就要修改代理,耦合度高,不便于维护和管理。
- 反转:对象的创建、赋值等操作交由代码之外的容器实现,有容器代替程序员完成对象的创建、赋值;且当程序功能发生变化时,只需要修改容器的配置文件即可。
提示
java 实现创建对象的方式有哪些
构造方法:new student ()
反射
序列化
动态代理
容器:tomcat 容器、ioc 容器
# 什么是依赖注入(DI)
依赖注入:一种实现控制反转(Inversion of Control,IOC)的具体技术手段,用于解决对象之间的依赖关系。
# IOC 和 DI 有什么区别
IOC(Inversion of Control,控制反转)和 DI(Dependency Injection,依赖注入)是相关但不完全相同的概念。
IOC 是一种软件设计原则,它指的是将对象的创建和依赖关系的管理转移到容器中。在传统的编程模型中,对象通常会自己创建和管理其所依赖的其他对象,而在 IOC 中,对象不再负责自己的依赖对象的创建和管理,而是由外部的容器来负责。IOC 反转了对象的控制权。
DI 是 IOC 的一种具体实现方式,它是通过将依赖对象传递给对象的方式来实现控制反转。DI 通过构造函数注入、Setter 方法注入或接口注入等方式,将依赖对象注入到对象中。DI 可以看作是 IOC 的具体技术手段。
因此,可以说 DI 是实现 IOC 的一种具体方法,而 IOC 是一种更广义的概念。IOC 强调的是对象控制权的反转,而 DI 则强调的是通过注入依赖对象来实现控制反转。
在 Spring 框架中,IOC 是整个框架的核心思想,而 DI 是 Spring 实现 IOC 的具体方式。Spring 使用依赖注入来实现控制反转,通过配置文件或注解将对象之间的依赖关系声明出来,由 Spring 容器负责创建对象并注入依赖,使得对象之间的耦合度降低,代码更具扩展性和可维护性。
# 快速入门
# 导入依赖
这里只是演示 Spring 创建对象的方式。
入门 Spring 只需要引入核心依赖即可
<!-- 这里提供一个pom依赖-->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>hello-spring</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.17.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.17.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.17.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.17.RELEASE</version>
</dependency>
</dependencies>
</project>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 传统方式
- 如果的程序的底层实现改变了,如果不修改程序的源代码,而实现呢?
# Spring 的方式
- 创建一个
Maven
项目,并导入上面提供的依赖 - 在
resources
文件夹中创建applicationContext.xml
,创建Car
类 - 编写测试类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
声明bean(告诉spring要创建某个类的对象)
1、id:自定义名称,唯一值,spring通过该id的属性值找到对象
2、class:要创建类的全限定类名
3、下述的声明语句在spring底层类似与执行了以下代码:UserServiceImpl service = new UserServiceImpl();
4、一个bean标签声明一个java对象
5、spring容器根据bean标签创建对象,尽管存在class属性相同的bean标签,只要是id值不同,spring容器就会创建该class的对象
-->
<bean id="setCar" class="org.example.hello.spring.pojo.Car">
<property name="name" value="领克"></property>
<property name="price" value="29999.9"></property>
</bean>
<!--
spring容器也可以创建非自定义类的对象,例如java.lang.String类的对象,只要指定了
class属性,spring容器就可以创建该类的对象
-->
<bean id="myString" class="java.lang.String"/>
</beans>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@ToString
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Car {
private String name;
private Double price;
public String carInfo() {
return name + ":" + price;
}
}
2
3
4
5
6
7
8
9
10
11
public class AppTest
{
//使用spring容器创建对象
@Test
public void test01() {
//1、指定spring配置文件的名称
String config = "applicationContext.xml";
//2、创建表示spring容器的对象 ApplicationContext
//ClassPathXmlApplicationContext:表示从类路径中加载spring配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
//3、从容器中获取对象
Car car = (Car)ac.getBean("userService");
//4、调用方法
String info = car.carInfo();
System.out.println(info);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17