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普遍规范

  1. 类需要生命包
  2. 提供无参构造器,可以是默认构造器
  3. 必须实现序列化接口 implements Serializable
  4. 使用  get   set 方法访问属性

Spring建议,尽量在Spring中使用符合JavaBean规范的Java类。如果不严格遵守JavaBean规范的Java类,Spring也可以支持,如:

  1. @Bean 就是在配置文件中声明一个JavaBean对象
  2. getBean 方法 就是从Spring中查找一个JavaBean对象
  3. getBeanNamesForType  是按照类型找到JavaBean的名字(BeanID)

如果我们不知道或忘了BeanID,可以调用Spring提供的getBeanNamesForType()方法,来查看一下所有的BeanID。该方法时按照类型获取全部BeanID,所以参数是我们要获取BeanID的方法里边new出来的对象类,参数格式是(类名.class),返回值是字符串数组

序列化接口

  1. 将对象转换为字节序列, 存储到流中, 称为对象的序列化
  2. 将对象字节流反向组合为对象, 称为对象的反序列化

java 提供了 对象序列化和返回序列化的API

  • ObjectOutputStream  代表对象输出流:   wtriteObject(obj)   它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列到一个目标输出流中。
  • ObjectInputStream   代表对象输入流:  readObject()   它的readObject()方法从一个源输入流中取字节序列,再把它们反序列化为一个对象,并将其返回。

序列化接口是"标识"接口

  1. Java编译器编译,实现这个接口的类时候,编译器会在类中自动添加3个方法,这3个方法就是实现对象序列化功能的方法
  2. 对象序列化流在读写对象时候, 会自动调用这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在启动时候,不会创建对象, 直到第一次使用时候才创建对象. 如果一个对象很少使用, 有可能不会使用到, 就声明为懒惰.