目录
1. 创建 Spring 项目
1.1 创键一个 Maven 项目【无需模板】
1.2 添加 Spring 依赖【Spring-context/Spring-beans】
1.3 创建一个启动类
2. 将对象存储到 Spring 中
2.1 创建一个 bean 对象
2.2 将 bean 注册到 Spring 中【使用 Spring 配置文件进行注册】
3. 从 Spring 中取出 bean 对象
3.1 得到 Spring 上下文对象
3.2 从 Spring 上下文对象中获取出 bean 对象
3.2.1 根据名称获取 bean 和 根据类型获取 bean 的弊端
3.2.2 根据名称和类型一起来获取 bean (bean id + Class 参数)
3.3 使用 bean
4. 总结 Spring 的创建和使用
1. 创建 Spring 项目
1.1 创键一个 Maven 项目【无需模板】
1.2 添加 Spring 依赖【Spring-context/Spring-beans】
大家可以去中央仓库拉取, 也可以直接复制下面代码粘贴到 Spring 项目中 pom.xml 下 <dependency></dependency> 标签中.
<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>
【注意事项】
我们在添加完依赖时, 一定要切记点击 IDEA 右边 maven 的 Reload, 如果 IDEA 项目中出现下图中相关依赖信息, 则表示添加依赖成功了.
1.3 创建一个启动类
public class App {
public static void main(String[] args) {
// 后续实现
}
}
2. 将对象存储到 Spring 中
2.1 创建一个 bean 对象
包名可以自己随意取, 也可以直接在 java 包下直接创建(不方便管理).
public class User {
public void doUser() {
System.out.println("do User !");
}
}
bean : 在 Java 中, 那些会被多次使用的对象就叫做 bean. 在 Spring 当中, 我们的对象要托管到 Spring 中, 就意味着有多个地方需要使用到这些对象, 所以就称之为 bean.
2.2 将 bean 注册到 Spring 中【使用 Spring 配置文件进行注册】
【第一步】创建 Spring 配置文件
我们首先需要在 resource 包下创建一个 spring-config.xml 配置文件, 当然名字随便取, 无所谓, 我只是为了词达意. 然后将以下代码复制粘贴到创建好的 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 中
<bean id="user" class="com.hl.User"></bean>
1. 一个这样的 bean 标签, 就表示我们要将一个 bean 对象托管到 Spring 中.
2. 此处的 id 就相当于寄快递时填写的电话号码, 因为我可能要托管多个 bean 对象到 Spring 中, 当我去获取对象的时候, 就需要根据这个 id 来取; 然后 class 就相当于是寄包裹时填写的地址.
id : 标识, 取对象 (bean) 使用 class : 存储 bean 位置 (包名 + 类名 -> 定义到唯一对象)
3. id 的名字可以随便取, 此处是为了词达意, 你取zhangsan, lisi 都没关系, 只是合法不合理.
经过以上操作, 我的 bean 对象是否已经存储到 Spring 中了呢 ?
其实并没有, 上述操作只是声明了我要存储对象到 Spring 当中. 当程序正儿八经的执行的时候, Spring 采用的是懒加载(单例模式中的懒汉模式), 在启动 Spring 项目的时候, 它不会立即的去将 bean 存储到 Spring 中, 这是它实现上的一个策略, 这也是广义上和狭义上的一个区别, 就类似于并和并行两者之间的区别一样, 初学的时候, 站在广义的角度上便于理解.
3. 从 Spring 中取出 bean 对象
3.1 得到 Spring 上下文对象
此处是在 App 类中的 main 方法实现的: 下面这两个类都来自于 Spring 框架.
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
【注意事项】
要 保证括号中的参数 spring-config.xml 要和前面创建的配置文件的名称一样.
如果不一样, 那么 IDEA 不会报错, 但是程序运行起来就会报错.
除了这种方法可以拿到 Spring 上下文对象之外, 我们还可以使用 BeanFactory 来作为 Spring 上下文对象. 使用 ApplicationContext 或者 BeanFactory 来获取 Spring 上下文对象, 是同样的效果, 只不过 ApplicaitonContext 是 BeanFactory 的一个子类.
BeanFactory beanFactory =
new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
【ApplicaitonContext 和 BeanFactory 的区别】
相同点: 都是用来获取 Spring 上下文对象的.
不同点:
- 继承关系层面分析: ApplicationContext 属于 BeanFactory 的子类, ApplicationContext 具备了 BeanFactory 所有的功能和能力.
- 功能层面分析: BeanFactory 只具备最基础访问 bean 的能力, 而 ApplicationContext 具备更多能力, 比如: 国际化支持, 资源访问支持....这就好比儿子不仅继承了父亲的商业帝国, 还有一些自己的能力.
- 性能和加载方式: BeanFactory 是按需加载 (懒加载), 当需要使用 bean 的时候再加载; 而 ApplicationContext 是一次性加载完所有的 bean. 这就好比儿子出国留学后学到了很东西, 接管了父亲的商业帝国后, 有了新的管理方式 (青出于蓝而胜于蓝). 懒加载的好处是节省资源, 而随着时间的推移, 对于程序来说最大的提升就是物理硬件的提升, 当我的资源足够充足时, 我不再去节省那一点资源了, 我要的是性能, 所以选择一次性加载并初始化所有的 bean 对象, 这种方式只有第一次加载比较慢, 当我加载完之后, 以后无论我是第一次访问还是第几次访问, 我的速度都是极快的.相当于是牺牲空间换取时间.
3.2 从 Spring 上下文对象中获取出 bean 对象
User user = new User(); // 传统的方式
// 3.2.1 根据一个 String 参数获取 bean 【根据名称获取 bean 对象】
User user = (User) context.getBean("user"); // 从 Spring 中获取
【注意事项】
getBean() 括号里的 "user" 就是前面在将 bean 注册到配置文件中时, <bean> 标签里面的 id 标识. bean 标识一定要写正确, 否则程序运行时就会报错.
【对比两种获取 bean 的方式】
1. 传统的方式得到 bean 对象, 对象的生命周期只在当前程序有效, 下次调用还得继续 new , 而且获取对象的时候, 还需要跟着构造方法的参数来改变, 很麻烦, 并且存在代码的耦合.
2. 而从 Spring 上下文中获取就可以做到随用随取, 不用 new , 也不用关心参数问题.
从 Spring 中获取出 bean 对象除了上面这种根据一个String 参数获取 bean 之外, 还有另外两种方式. 先介绍第二种方式: 根据 Class 参数获取 bean 【根据类型获取 bean 对象】
// 3.2.2 根据一个 Class 参数获取 bean
User user = context.getBean(User.class);
3.2.1 根据名称获取 bean 和 根据类型获取 bean 的弊端
前两种方式虽然很简单, 但都有美中不足的地方【弊端】, 怎么说 >>
对于从 Spring 中根据 String 获取 bean 对象的方式, 当张三和李四在同一家公司干活的时候, 假设他俩同时都需要使用到 User 对象, 由于协同开发, 当张三前面在 Spring 配置文件中已经注册了 User bean 对象时, 李四没有几时发现, 由于他也需要使用 User bean 对象, 于是他也在配置文件中存储了 User bean 对象, 并且两个 bean 标识都一样, 此时再根据 String 的方式去获取 User 对象时, 就会抛如下异常: 这种情况虽然可以避免, 但是它的这种强转的写法还是显得不够简单.
关键异常信息:
对于从 Spring 中根据 Class 参数获取 bean 对象的方式. 还是刚才那个例子, 张三和李四同时都需要使用 User bean 对象, 他俩都同时在 Spring 配置文件中注册了 User bean 对象, 但是这次李四及时发现了张三也注册了 User bean 对象, 于是他注册 bean 时, 就换了一个标识,叫做 user2 , 此时根据 Class 参数获取 User bean 对象时, 就会抛出如下异常:
关键异常信息:
3.2.2 根据名称和类型一起来获取 bean (bean id + Class 参数)
// 根据名称 + 类型来获取 bean
User user = context.getBean("user", User.class);
这种方式看似和第一种差不多, 但是第三种写法还是更加稳健的, 比如当我们获取到的 bean 对象为 null 时, 第一种方式进行强转就不太合适. 而根据 id + Class 来获取 bean 的写法是有双重保险的.
3.3 使用 bean
此处的使用 bean 是非必须步骤. 使用 bean 我们可以去调用它里面的 doUser() 方法.
user.doUser();
4. 总结 Spring 的创建和使用
1. 创建 Spring 项目, 相当于得到容器.
2. 存储 bean 对象
- 创建 bean
- 将 bean 对象注册到 Spring 配置文件中 (spring-config.xml)
3. 取对象
- 拿到 Spring 上下文
- 获取 bean 对象
- 使用 bean 对象
基本流程图:
下篇博客将讲解更加简单的读取和存储 bean 对象!!