目录
一、创建Spring项目
1、创建Maven项目
2、配置maven国内源
3、引入spring依赖
4、添加启动类
二、将Bean对象存储到Spring(IoC容器)
1、创建Bean对象
2、将Bean存储到spring(容器)中
3、获取Bean对象
3.1、ApplicationContext与BeanFactory的区别
3.2、getBean方法的更多用法(参数不同,用法不同)
4、总结
一、创建Spring项目
1、创建Maven项目
因为Spring项目是基于Maven的。这里小编使用的idea是社区版2021.3.2,使用的JDK是1.8。
2、配置maven国内源
1️⃣配置当前项目的maven国内源
找到setting.xml文件之后,添加maven国内阿里源
如果你的电脑上已经存在settings.xml文件,你只需要将这个mirror添加到settings.xml文件中的mirrors标签中即可。
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
2️⃣配置新项目的maven国内源
因为上述中已经在setting.mxl中添加了mirror,所以这里就直接勾选就可以,不用再配置settings.xml文件,通过这种方式配置了maven之后,之后创建了新的maven之后,就需要再配置了。
3、引入spring依赖
在项目的pom.xml中添加Spring框架的支持,添加spring-context(spring上下文)和spring-beans(管理对象模块)。
<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>
添加完成之后,出现了爆红,表示这些文件没有下载,点击左边的Maven之后,点击刷新。或者也可以直接点击刷新,在第一次添加依赖时,idea的左上角会出现一个小标签,点击刷新即可触发下载。
4、添加启动类
最后在创建好的Java文件下创建一个启动类,包含main方法即可。
public class App {
public static void main(String[] args) {
}
}
二、将Bean对象存储到Spring(IoC容器)
1、创建Bean对象
比如我们创建一个UserService类,然后注入到spring中。这里所谓的Bean就是Java语言中的一个普通的类,一点点区别就是可能会被多次使用的对象叫做Bean。
package com.zf.demo;
public class UserService {
public void func(){
System.out.println("hello UserService.");
}
}
2、将Bean存储到spring(容器)中
这里首先需要在resource中创建一个spring-config.xml配置文件。
配置内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
</beans>
然后Bean对象通过spring-config配置文件,注入到spring中,就是在配置文件中加入下面的一行代码。
<bean id="user" class="com.zf.demo.UserService"></bean>
这里id表示存储到容器中bean对象的名称,class表示的bean对象的路径(包名+类名)。这里只是进行了申明并没有真正的注入到spring中,只有使用到这个对象中的方法时,才会真正的被注入到spring中。
3、获取Bean对象
获取并使用Bean对象,首先我们需要得到spring上下文对象,因为对象都交给了spring管理,所以获取对象要从spring中获取,然后通过spring上下文,获取某个指定的Bean对象,然后使用
1️⃣使用ApplicationContext接口来获取spring上下文对象
这里需要使用ApplicationContext接口的实现类ClassPathXmlApplicationContext,并且需要指定配置文件,也就是我们刚刚创建的spring-config.xml文件。
import com.zf.demo.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
//1、先得到Spring上下文对象(得到容器对象)
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2、得到Bean,这里使用依赖查找的方法
UserService userService = (UserService) context.getBean("user");
//3、使用Bean对象(非必须)
userService.func();
}
}
这里使用getBean方法进行依赖查找,这里方法中使用的参数需要和我们在spring-config.xml文件中id属性值相同。
2️⃣使用BeanFactory接口来获取上下文对象。
import com.zf.demo.Student;
import com.zf.demo.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class App2 {
public static void main(String[] args) {
//1、得到Spring 上下文对象(得到容器对象)
BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
//2、获取Bean
UserService userService = (UserService) context.getBean("user");
//3、使用Bean
userService.func();
}
}
这个方式在实际中并不推荐使用,这个方式随着时代的发展已经过时了,之前由于电脑内存较小的情况下,需要考虑内存占用的问题,而现在并不需要考虑这些。
3.1、ApplicationContext与BeanFactory的区别
🍂相同点
- 都是容器管理对象,都可以获取Bean对象。
🍂不同点
- ApplicationContext属于BeanFactory的子类,BeanFactory提供了基础的访问容器的能力,而ApplicationContext不仅继承了BeanFactory的所有功能之外,它还拥有独有的特性,添加了对国际化的支持,资源访问支持,以及时间传播等方面的支持。
- 他们的加载机制不同:BeanFactory是按需加载Bean,属于懒加载,使用它程序启动的时候非常快,但是需要获取Bean对象时就会慢一些;而ApplicationContext在启动的时候,会将所有的Bean对象加载完成,所以启动会较慢,但是获取对象的时候就非常快的。
✨ 这里我们通过两个Bean对象来了解他们启动时的加载机制。
1️⃣在创建一个student类,并且给两个类中都写一个构造方法其中写一个打印的方法,可以观察启动时对象有没有加载。
package com.zf.demo;
public class UserService {
public UserService(){
System.out.println("hello UserService Init.");
}
public void func(){
System.out.println("hello UserService.");
}
}
package com.zf.demo;
public class Student {
public Student(){
System.out.println("Student Init.");
}
}
2️⃣然后将新创建的类,注入到spring中,也就是在spring-config.xml文件中配置bean.
3️⃣然后启动App类(使用ApplicationContext来获取上下问对象),App2类(使用BeanFactory来获取上下问对象)
3.2、getBean方法的更多用法(参数不同,用法不同)
1️⃣用法1:根据对象的名称来获取Bean对象
UserService userService = (UserService) context.getBean("User");
2️⃣用法2:根据类型获取Bean对象
UserService userService = context.getBean(UserService.class);
使用这种方式获取Bean对象,当Beans中只有一个类的实例是没有问题的,但是当有这个类的多个实例,就会产生问题。
通过上述方式来获取Bean对象 ,这里就报NoUniqueBeanDefinitionException异常,表示注入的对象不是唯一的。
3️⃣方式3:根据名称和类型来获取Bean对象
UserService userService = context.getBean("user",UserService.class);
这种获取Bean对象的方式,相比于第一种更加优雅,不需要使用强制类型转换。相比于第二种也不会出现方式2中的问题。
4、总结
1️⃣首先是创建spring项目
2️⃣存对象
- 创建普通类
- 然后将普通类配置到spring-config.xml文件中,也就是注入到spring容器中
3️⃣取对象
- 得到spring上下文,并读取spring的配置文件
- 获取某个Bean对象
- 使用Bean对象