2022-01-23-Spring学习step001
学习B站江南一点雨的Spring视频。
以下内容我是我照着视频敲的,仅用于我个人学习。一切权利归江南一点雨所有。
String开篇:www.javaboy.org 江南一点雨个人网站
1. Spring简介:
我们通常说的Spring指的是Spring Framework,Spring Framework是Spring家族的一个分支而已。Spring家族包括很多例如:Spring Boot、Spring Framework、Spring Cloud Data、Spring Session、Spring Batch、Spring Security、Spring Cloud。其中Spring Framework是Spring家族的一个根基。
Spring是为了解决企业级应用开发的复杂性而创建的。在Spring之前,有一个重量级的工具叫EJB。
在Spring中一般常说的DI就是依赖注入,EJB中实际也提供了,其实呢你会发现Spring它本身也是一个重复造轮子的产物,但是轮子你如果造的好的话呢,前途不可限量,有的人鼓吹不要重复造轮子,如果我是轮子发明者,我肯定告诉你不要重复造轮子,用我的轮子就行了,如果我不是轮子的发明者的话,这句话我会将信将疑。
Spring中两个重要的功能,一个就是IOC。IOC实际上在JavaEE里面是有提供的,在JavaEE里它有一个JNDI,Java Naming and Directory Interface,Java命名和目录接口。实际上呢,这个IOC和JNDI有一定的相似性。Spring Framework相当于一定程度上颠覆了JavaEE最早的开发模式,以前讲JavaEE开发有JavaEE标准,现在呢,主要是用Spring提供的这一套方案来操作。
Spring的优点例如:可以对事务进行抽象,统一的数据库事务、分布式事务等等,还有面向切面的编程,让事务的操作变的非常的简单。另外一个就是Spring Framework里面另外一个,Spring MVC,让整个Spring家族整体框架达到了新的巅峰,我们现在开发RESTful接口或者普通的后台应用,Spring MVC是一个非常常用的选择。
从4个方面来讲解Spring:
- IoC/DI
- AOP
- 事务
- JdbcTemplate
2. Spring下载:使用Maven添加Spring。
3.1 IoC:
3.1.1 Ioc概念:IoC(Inversion of Control),中文叫做控制反转。这是一个概念,也是一个思想。控制反转,实际上就是指对一个对象的控制权的反转。例如,如下代码:
class class Book { private Integer id; private String name; private Double price; // 省略getter/setter } public class User { private Integer id; private String name; private Integer age; public void doSth() { Book book = new Book(); book.setId(1); book.setName("故事新编"); book.setPrice((double) 20); } }
在这种情况下,Book对象的控制权在User对象里边,这样,Book和User高度耦合,如果在其他对象中需要使用Book对象,得重新创建,也就是说,对象的创建、初始化、销毁等操作,统统都要开发者自己来完成。如果能够将这些操作交给容器来管理,开发者就可以极大的从对象的创建中解脱出来。
使用Spring之后,我们可以将对象的创建、初始化、销毁等操作交给Spring容器来管理。就是说,在项目启动时,所有的Bean都将自己注册到Spring容器中去(如果有必要的话),然后如果其他Bean需要使用到这个Bean,则不需要自己去new,而是直接去Spring容器去要。
3.1.2 IoC初体验:
idea创建Maven项目,引入spring-context依赖:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> </dependency> </dependencies>
在resource目录下创建一个Spring的配置文件,applicationContext.xml,在这个文件中,我们可以配置所有需要注册到Spring容器的Bean:
<?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 class="org.javaboy.ioc.model.User" id="user"/> </beans>
class属性表示需要注册的bean的全路径,id则表示bean的唯一标识,也可以以name作为bean的标识,在超过99%的情况下,id和name其实是一样的,特殊情况下不一样。
接下来,下面的main方法中,加载这个配置文件:
package org.javaboy.ioc; import org.javaboy.ioc.model.User; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; /** * @author konglc * @date 2022/1/23 15:17 */ public class Main { public static void main(String[] args) { // User user = new User(); // System.out.println("user = " + user); // FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext("E:\\study\\Spring\\code\\ioc01\\src\\main\\resources\\applicationContext.xml"); ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); User u1 = (User) ctx.getBean("user"); User u2 = ctx.getBean("user",User.class); User u3 = ctx.getBean(User.class); System.out.println("u1 = " + u1); System.out.println("u2 = " + u2); System.out.println("u3 = " + u3); } }
执行main方法,配置文件就会被自动加载,进而在Spring中初始化一个User实例。此时,我们显示的指定User类的无参构造方法,并在无参构造方法中打印日志,可以看到无参构造方法执行了,进而证明对象已经在Spring容器中初始化了。
最后,通过getBean方法,可以从容器中去获取对象。
在idea中鼠标放在类上,按CTRL+H,展示该类的继承关系。
在idea中在文件上右击选择Copy Path/Absolute Path,可直接得到绝对路径。
基本属性注入:
属性注入:
- 属性注入:基本数据类型
- 复杂属性注入:对象注入、数组注入、Map注入、Properties注入
进行到P06的01:01。