Spring5 入门案例

​ IOC 是Spring框架的核心内容.使用多种方式完美的实现了IOC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置IOC.

​ Spring容器在初始化时候先读取配置文件,根据配置文件或者元数据创建与组织对象存入容器中,程序使用的时候再从IOC容器取出需要的对象

​ 了解了 Spring是一个包含众多方法的IOC容器,也知道spring的核心功能就是将对象存放到Spring中,再将对象从Spring中取出来.

​ 接下来我们创建一个Spring项目来实战一下,究竟Spring的IOC思想是怎么回事,怎么创建一个Spring项目,怎么将对象存放到Spring中,又怎么将对象从Spring中取出来..接下来我们逐一讲解.

Spring的创建和使用

如何创建Spring项目呢?

  1. 首先我们要先创建一个Maven项目
  2. 引入框架支持-->spring的依赖 spring-context 和 spring-beans
  3. 然后创建一个启动类

创建一个Spring项目

1.创建一个Maven项目

我们第一步是创建一个Maven项目

2.添加Spring依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
<!--添加依赖  spring-context(spring本身) 和 spring-beans(bean其实就是对象)-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>

加载之后就会出现相应的jar包

这个就是我们下载的jar包.

  • 我们不是只引入了spring-context依赖 和 spring-beans依赖么,为什么会下载这么多jar包??

这是因为我们引入的这些依赖,还依赖着其他的jar包.

spring-context : spring-context就代表spring本身(spring的上下文)

spring-beans : 代表管理对象的模块(因为我们要往spring里面存bean对象和取bean对象,所以要引入spring-beans依赖 在spring中对象就是bean,(对象会重复使用)).

3.添加一个启动类

  • 为啥要添加启动类呢?? 我记得Servlet不需要创建启动类啊.

因为我们现在创建的是Spring core项目,也就是最基础的spring项目,最基础的项目是没有Web模块的,所以需要添加启动类.

而对于Servlet来说,它是一个Web基础,需要配置Tomcat来使用,Servlet是一个Web技术(或者Web框架),它是在Tomcat服务器上运行的,对于Tomcat来说它是内置了启动类,也就是Tomcat源码中会有一个main方法的.

1
2
3
4
5
6
7
package com.company;

public class App {
public static void main(String[] args) {

}
}

我们创建好一个Spring项目之后..我们如何使用Spring呢??

将bean存放到Spring中

如何存储呢?? 我们需要以下几步

  • 先要有一个bean对象(bean在Java中就是对象,在Spring中叫做bean).
  • 然后再将bean对象存放到Spring当中

1.创建一个bean对象

1
2
3
4
5
6
7
8
9
10
11
package com.company;
/**
* 创建一个bean对象
* 就是一个普通的对象
*/
public class User {
//就是一个普通的方法
public void sayHello(){
System.out.println("hello,spring");
}
}

2.将bean存放到spring中

  • 将bean存放到spring当中,首先我们要添加配置文件.放到resource目录中.
1
2
3
4
5
6
7
<?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">

</beans>
  • 往spring中注册一个bean.

往spring中注册一个bean也就是在配置文件XML中,添加一个bean标签,就代表要往Spring中注册一个bean,至于注册哪一个bean(也就是哪一个类),需要通过bean标签的属性来指定.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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">
<!--使用spring配置文件的方式将bean注册到spring中-->
<!-- id : 代表这个bean的标识 class代表要将哪一个类的对象加入到spring中
(也就是要定位到哪一个类加入到spring中) 存储bean的位置可以定位到唯一的对象-->
<bean id = "user" class = "com.company.User">
<!-- 这里添加一个bean标签就意味着将一个bean对象注册到spring当中-->
<!-- 在spring中对象就为bean 在java中被重复使用的就为bean -->
</bean>
</beans>
  • 在spring-config 配置文件(XML)中加入一个bean标签就代表往spring容器中注册一个bean对象
  • bean标签有两个属性 id 和 class
  • id 代表这个bean对象的标识 ,一般为类名的小驼峰形式
  • class 可以定位到类的存储位置,可以定位到唯一的对象. 也就是你要把哪一个类的对象添加到spring当中; 包名+类名

从Spring中取出bean

既然我要从spring中取出bean,首先我得先要有一个Spring对象

获取到Spring上下文对象

得到spring上下文对象有两种方式可以获取到 一个是 ApplicationContext 一个是BeanFactory

首先我们来使用ApplicationContext来获取Spring上下文对象

1
2
3
//1.获取到Spring上下文对象 , 因为我们是从XML文件进行获取Bean的. 要指定从哪个XML获取bean
ApplicationContext context = //注意这里的配置的XML不要写错了
new ClassPathXmlApplicationContext("spring-config.xml");

从Spring中获取bean对象

获取bean有很多方式...

通过 bean的id 来获取到Bean对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 启动类
*/
public class App {

public static void main(String[] args) {
//1.获取到Spring上下文对象 , 因为我们是从XML文件进行获取Bean的. 要指定从哪个XML获取bean
ApplicationContext context = //注意这里的配置的XML不要写错了
new ClassPathXmlApplicationContext("spring-config.xml");
//2.获取到bean对象
//以前获取对象的方式 User user = new User();//在spring中就不要出现了,耦合度高
//2.1 通过bean的id来获取到bean 通过传入String的参数 id
//这里需要进行强转
User user = (User) context.getBean("user");//通过Spring的方式来获取到bean的.
//3.使用bean 调用bean的方法
user.sayHello();
}

}

优点 : 通过 bean的id来获取bean对象的时候,如果有多个bean对象的时候可以通过id来区分我到底是获取哪一个对象.

缺点 : 通过bean的id来获取bean 缺点就是需要进行强转,如果为null的时候就会报异常.

通过 bean的类型来获取bean对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class App {

public static void main(String[] args) {
//1.获取到Spring上下文对象 , 因为我们是从XML文件进行获取Bean的. 要指定从哪个XML获取bean
ApplicationContext context = //注意这里的配置的XML不要写错了
new ClassPathXmlApplicationContext("spring-config.xml");
//2.获取到bean对象
//以前获取对象的方式 User user = new User();//在spring中就不要出现了,耦合度高

//2.2通过bean的类型来获取bean
User user = context.getBean(User.class);
//3.使用bean 调用bean的方法
user.sayHello();
}
}

缺点 : 使用类型来获取bean的缺点就是如果有多个bean对象的时候,就无法进行区分bean了.

通过bean的id + 类型 来获取 bean

--->这个是最推荐的做法.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class App {
public static void main(String[] args) {
//1.获取到Spring上下文对象 , 因为我们是从XML文件进行获取Bean的. 要指定从哪个XML获取bean
ApplicationContext context = //注意这里的配置的XML不要写错了
new ClassPathXmlApplicationContext("spring-config.xml");
//2.获取到bean对象
//以前获取对象的方式 User user = new User();//在spring中就不要出现了,耦合度高

//2.3通过 bean的 id 和 类型 来获取到bean对象 最稳妥的做法
User user = context.getBean("user",User.class);
//3.使用bean 调用bean的方法
user.sayHello();
}
}

ApplicationContext VS BeanFactory

BeanFactory也是一种获取bean的方式.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class APP1 {

public static void main(String[] args) {
//1.获取到Spring上下文对象 , 因为我们是从XML文件进行获取Bean的. 要指定从哪个XML获取bean
BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
//2.获取到bean对象
//以前获取对象的方式 User user = new User();//在spring中就不要出现了,耦合度高

//2.3通过 bean的 id 和 类型 来获取到bean对象 最稳妥的做法
User user = context.getBean("user",User.class);
user.sayHello();

}
}

显然这个是已经是很老的,不推荐使用.

那ApplicationContext 与 BeanFactory的区别是什么呢?

相同点 : ApplicationContext与BeanFactory都是可以获取到Spring上下文对象的.

不同点 :

  • 继承关系和功能上 :

ApplicationContext 是 BeanFactory 的 一个子类.ApplicationContext具备了BeanFactory的所有功能和能力,BeanFactory只具备了最基础访问Bean的能力,ApplicationContext具有更多的独有的功能,比如国际化支持,资源访问支持等....

  • 性能和加载方式上 :

BeanFactory是比较老派的类了,由于以前硬件设备和空间不足,所以,BeanFactory按需进行加载,也就是当使用Bean的时候,再去加载,更加轻量,节省资源,缺点是第一次加载Bean比较慢.

而ApplicationContext由于资源充足,采用一直空间来换时间..,它是一次性加载所有的bean(在创建对象的时候就将所有的bean进行初始化创建),所以后面再去访问的时候,就非常的块,性能高.但可能会造成资源的浪费。

参考:https://blog.csdn.net/m0_61210742/article/details/127720385