1)网站
1. Spring 官网 https://spring.io/
现在版本是 Spring Framework 5.3.9 https://spring.io/projects/spring-framework,它需要 JDK 版本 1.8
2. Maven https://mvnrepository.com/
输入网址后选择“我是人”,验证成功就进去了。
注意:一定要设置Maven本地仓库,如果没有设置,它会自动去境外官网下载Spring组件,下载速度很慢。
2)Spring两大核心功能:
1. 控制反转 IoC / 依赖注入 DI
控制反转
(Inversion of Control,缩写为IoC):是指将"对象"的创建管理权限,交给容器环境(Spring),应用软件要用对象时,从环境(Spring)中获得对象, 然后使用对象。 这种被动使用对象的方式,称为 控制反转 IoC.
Java Bean容器: 由于Spring可以管理大量的JavaBean对象, 可以看做是盛放了大量的Java Bean对象的"容器", 所以Spring 为 Java Bean容器, 简称 Bean容器, 也称为 IoC 容器.
容器: 某某某的容器, 是完全不同的事物. Spring是JavaBean容器,Tomcat是Servlet容器,这些容器完全不同
集合类是对象容器 , 有些人也称为"容器类" 或 "容器",可能是因为那些人用过其它的计算机语言
依赖注入
控制反转 最常见的方式是依赖注入(Dependency Injection,简称DI)
依赖注入是 Spring 容器提供的核心功能: 将程序运行期间业务过程使用(依赖)的对象注入(赋值)到合适位置, 称为依赖注入(DI).
- 依赖: 一个业务过程需要的前提条件
- 注入: 将一个业务过程依赖的事物放到合适位置.
在软件使用复杂对象时候, 由于不用关心对象组件的创建过程, 只关注使用, 这样就可以大大简化软件的开发.
2. 面向切面(儿)编程 AOP
面向切面编程 Aspect Oriented Programming(AOP)
可能需要导入的依赖
<dependencies>
<!-- Spring Context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 连接MySQL数据库的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
</dependencies>
3)@Configuration
用于标注在Spring配置类上,表示当前类作为Spring的配置文件, 该配置类中可以声明Spring中创建的对象。也就是说,标注了@Bean的方法,写在标注了@Configuration的类中.
4)@Bean
标注在创建对象的方法上,Spring启动时,会自动寻找 配置类中标注了@Bean注解的方法,找到后会执行方法,创建对象。简单说就是:Spring会自动调用@Bean标注的方法创建对象。也就是告诉Spring,我要创建哪个对象。
注意:@Bean标注的方法,必须是public的,方法名就是为对象分配的唯一 Bean ID,方法内必须创建一个新对象,且新对象要跟方法的类型保持一致。
5)AnnotationConfigApplicationContext
Annotation /ˌænəˈteɪʃn/ n. 注解;
Config /kənˈfɪɡ/ n. 配置;
Application /ˌæplɪˈkeɪʃn/ n. 应用程序;
Context /ˈkɒntekst/ n. 环境;上下文;
可以这样理解:注解配置应用程序上下文 == Spring
//1. 创建 AnnotationConfigApplicationContext 对象时,必须提供配置类的类名。
AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext(类名.class);
//2. Spring 提供了一个 getBean方法,参数是类型,返回值是Spring创建的对象。参数是什么类型,就用什么类型接收
类名 bean = acac.getBean(类名.class);
//3. 直接输出 bean,会自动调用bean里的方法
System.out.println(bean);
Bean ID
Spring在IoC容器中为对象分配为唯一的ID,默认情况下,对象的ID就是配置文件中创建对象的方法名
//1. 在配置文件中,创建两个类型一样的对象
@Configuration
public class Config {
@Bean
public 类名 Bean_1(){
return new 类名();
}
//创建对象的方法名, 就是为对象分配的唯一 Bean ID
@Bean
public 类名 Bean_2(){
return new 类名();
}
}
当按照类型获取对象,有冲突时,就需要按照对象的ID获取对象,如果ID错误,就会抛出异常
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
//当按照类型获取对象有冲突时候, 就可以按照对象的ID获取对象
//默认情况下, 对象ID就是配置文件中创建对象的方法名
//getBean方法根据对象的ID获取对象, 参数是对象的ID,
//如果对象ID错误, 抛出异常!
类名 Bean = ctx.getBean("Bean_1", 类名.class);
System.out.println(Bean);
}
}
Java Bean
符合一定规范的Java类型,称为javaBean.其实就是个类,按照规范约定的Java类.
JavaBean普遍规范
- 类需要生命包
- 提供无参构造器,可以是默认构造器
- 必须实现序列化接口 implements Serializable
- 使用 get set 方法访问属性
Spring建议,尽量在Spring中使用符合JavaBean规范的Java类。如果不严格遵守JavaBean规范的Java类,Spring也可以支持,如:
- @Bean 就是在配置文件中声明一个JavaBean对象
- getBean 方法 就是从Spring中查找一个JavaBean对象
- getBeanNamesForType 是按照类型找到JavaBean的名字(BeanID)
如果我们不知道或忘了BeanID,可以调用Spring提供的getBeanNamesForType()方法,来查看一下所有的BeanID。该方法时按照类型获取全部BeanID,所以参数是我们要获取BeanID的方法里边new出来的对象类,参数格式是(类名.class),返回值是字符串数组
序列化接口
- 将对象转换为字节序列, 存储到流中, 称为对象的序列化
- 将对象字节流反向组合为对象, 称为对象的反序列化
java 提供了 对象序列化和返回序列化的API
- ObjectOutputStream 代表对象输出流: wtriteObject(obj) 它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
- ObjectInputStream 代表对象输入流: readObject() 它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
序列化接口是"标识"接口
- Java编译器编译,实现这个接口的类时候,编译器会在类中自动添加3个方法,这3个方法就是实现对象序列化功能的方法
- 对象序列化流在读写对象时候, 会自动调用这3个方法
- 如果不实现序列化接口 将没有这3个方法, 无法对象序列化和反序列化
6)Spring单例对象
单例: 在一个软件系统中, 对象实例始终唯一的现象称为单例
单例模式: 利用语法, 将对象约束为始终唯一一个实例, 称为单例模式
Spring 默认情况下, JavaBean对象是单例的. 也就是在Spring里面, 一个JavaBean对象始终是唯一的一个实例! 无论多少次使用getBean获取的对象都是唯一的一个实例
7)@Scope
在配置文件中, 使用@Scope("prototype"), Spring会按照多个实例管理对象, 每次调用getBean方法, Spring都会创建一个新对象.这种情况其实并不常用
- 默认的单例规则管理 java bean 其优势是性能好, 资源消耗少, 尽量使用默认的单例规则管理对象
- 如果软件业务需要创建多个实例时候就需要添加 @Scope("prototype")
8)@ComponentScan(" ")
括号里写一个package包的全称,比如 com.csdn.bean
Component /kəmˈpoʊnənt/ n. 组件;
Scan /skæn/ vi. 扫描;
组件扫描
Spring 提供的,根据注解,自动创建Bean的方式. 这种方式的优势在于可以简化代码, 是开发中最常用的创建Bean对象的方式.
配置类上加这个注解,就是开启组件扫描功能,Spring启动后,会自动扫描 com.csdn.bean 包和其子包,如果包中提供了标注 @Component 的类, 就会在Spring中自动创建该类型的对象
组件扫描时候的BeanID
- 如果是驼峰命名的类名, BeanID是 类名首字母转换为小写
- 类 ExampleBean 的BeanID是 exampleBean
- 如果类名连续两个大写字母以上, 则BeanID就是类名本身
- 类 IExampleBean 的BeanID IExampleBean
- 类 MYExampleBean 的BeanID MYExampleBean
- 可以利用注解参数修改BeanID
- @Component("test") 的BeanID 是 test
- 在软件开发中尽量使用默认规则
9)@Component
@Component 该注解 用于标注通用组件
Spring 提供了多种组件注解
- @Component 组件, 用于标注通用
- @Service 服务, 用于标注业务层组件
- @Controller 控制器, 用于标识控制器层组件
- @Repository 仓库, 用于标注数据存储组件
- ...
其实这些注解功能都一样,都是为了让Spring开启组件扫面的时候能找到,只是名字不一样,在应用软件中按照组件功能, 使用对应注解声明响应的Bean对象, 如果是通用组件使用 @Component
@Lazy
默认情况下, 在Spring启动时候,立即初始化(创建)单例JavaBean对象. 在使用对象时候, 能立即得到对象.
懒惰初始化:在声明JavaBean时加一个 @Lazy,即在 @Component 注解的下边再写一个 @Lazy 注解,加上后,Spring在启动时候,不会创建对象, 直到第一次使用时候才创建对象. 如果一个对象很少使用, 有可能不会使用到, 就声明为懒惰.