你是新手吗?耐心来看Spring入门——Bean(1)

你能耐心看下去吗?Spring入门——Bean(1)

我也是个新手,所以看了各大网站资深人士视频资料后,也希望能像他们一下去分享自己的收获。同时也为了自己再熟悉一遍。

我会逐个介绍Spring的两大神器:Bean 与 AOP;
因为这节很简单,只写一个Bean的实现代码,所以本节会更多侧重去分享一些写代码时的细节与经验。而且,以后章节我也尽量引用Spring官方说明文档:分三块,由截图官方原话,保留原文本供大家自己去翻译,和我自己的理解来组成
首先先明确一下本节的目的,最基本的准备工作与预知识:

  • 目的:通过xml配置Bean,验证容器是否根据配置信息实例化了我们提供的类;

  • 创建项目:空文档(包括无内容的实现类,测试类和xml文档)

  • 导入jar包:spring-beans-5.1.8.RELEASE.jar(mvnrepository提供的最新版本)

  • 预知识:定义Bean,将创建类和管理类的任务交由容器去实现,我们只需要在用到的时候找容器要就行了

一,创建项目文档如下
文档结构
(1)项目创建,当创建源文件夹时,我更喜欢在项目属性中创建所需要的包;
右击项目名->Properties->java build path->在右侧菜单点击add Folder中进行创建
(2)jar导入,因为我们都是新手嘛,记不住那么多的包。我们根据Bean这单词会猜测这里面会有个Spring-Bean 包。那开始就只导入这一个包,有错再填上呗;
我是用maven本地仓库里的jar包,为了项目看的简单,我没建立maven项目,直接取用的;如果学过项目管理工具,可以跳过下载jar这段;
如果还没学的,为了本次项目目前可以这样:

  • 进入mvnrepository官网:https://mvnrepository.com/

  • 搜索我们能想到的包: Spring Bean(可能想到的关键字)
    因为关键字不准确(实际应搜 Spring Beans),我们可能不一定一下子就找到自己想要的jar包,所以需要认识介绍信息了
    在这里插入图片描述
    可以看到:红色框的是jar包的完整名称,也是我们判断的主要依据;
    而蓝色框是简称,有时候会不好判断;

  • 选择自己项目实际需要的版本:spring-beans-5.1.8.RELEASE.jar
    我们点击进去会发现很多很多版本,实际项目考虑到兼容,代码老等问题,会对版本有要求。但我们白纸一张,就选最新的发行版就好了。
    补充:它版本的名称是有意义的,有的代表发行候选版,有的是主版本等等,一般纯数字结尾或RELEASE结尾的是实际可用版本;

  • 点击版本号,我们会看到个表格,其中有“Files”行,点击链接就能下载了。

二,编辑Bean_1类
从熟悉的入手,这儿只是验证从Spring容器里取Bean_1对象;所以类只要有内容就行了;
为了不造成所写的方法名,id名等字符串命名有特定格式的错觉,我之后都会随意命名;
但实际操作中,为了代码易读性,可理解性的原则,再加上格式约定,一定程度上确实产生了一定的命名书写格式和命名风格;

public class Bean_1 {
	public void a() {
		System.out.println("我是Bean_1类");
	}
}

三,编辑xml文件

  1. 首先创建个xml空文件,我们从零开始熟悉它;
    引用 Schema:假设我们什么都不知道;

  2. 第一步,总得给它起个名字,就先叫a
    原始的状态
    但是发现做完之后不知道怎么办了,这时候,就可以点提示 Alt+/
    < a > 空一格,再按Alt+/,会出现 schema元素
    在这里插入图片描述

  3. 第二步:全部选择,除去noshemaLoc选项;我们点击的顺序也可以随意点,这样学起来不会太束缚,如图:
    在这里插入图片描述

  4. 它花括号想表达的基本意思我想都懂的,就是给它提供一个地址一个空间,因为我们需要< bean >标签对项目进行配置,所以我们就去寻找Bean的地址:
    这是我的方法,如果有更好的方法,还请大家推荐哈!!!
    打开相关的库:这里我们需要bean,就打开spring-beans,像图片所示,点击spring.schemas文件;
    在这里插入图片描述
    里面会有很多,我们选择默认版本就行了,没有版本号的;
    在这里插入图片描述
    复制粘贴到"="之前就行,这是key_value结构,我们拿到钥匙就行了,xml编辑器它会自动通过钥匙去找对应的真实地址的
    即复制http://www.springframework.org/schema/beans/spring-beans.xsd
    其中http://www.springframework.org/schema/beans是命名空间
    http:/ /www.springframework.org/ schema/ beans/ spring-beans.xsd是地址;
    可以理解:我们要引用 Schema,就需要给它Schema文件,那么首先就需要给它所在的目录,即命名空间;而目录下又有很多文件,我们要找的spring-beans.xsd也在里面,目录+文件名就是它的地址了。具体的可以看Schema相关文档,我说的不是很对

5. 取代{namespace}花括号和"default namespace"内容;红框内容像黑框内容一样,修改成http://在这里插入图片描述
6. 取代{location}内容;同样修改成http://
在这里插入图片描述
这两个红框必须按顺序,且之间至少需要空格隔开;
(个人觉得:规约规定的严格程度与编译识别等机制大部分情况下是反比的,可以想想,如果不规定顺序,它编辑器就需要添加个判断的操作;而如果能容忍字符串连在一起,它就需要个算法来判断从哪儿到哪儿是命名空间的字符串,又哪个是位置的字符串。对于一个只负责加载信息的而言,犯不着。所以为了快速配置,那就只能从编写上下手了,就有了很多约束,限定顺序,限定格式等等手段,来减轻不必要的判断等操作;
当然还有就是在逻辑性,可理解性上的考虑,比如这里的顺序,我们是写命名空间在先,后写相对位置的,这很符合实际的文件搜索过程(需要进入目录,再去目录下取文件),但如果倒过来,就有点奇怪了)

7. 修改名称,它需要和命名空间名一致,即把< a >换成< beans >在这里插入图片描述

8. 全部修改完后,调下位置,让它更正式点

<?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>

9 填写< bean id="" class="’></ bean>,官方文档格式参考与属性定义:
格式定义

The id attribute is a string that you use to identify the individual
bean definition. The class attribute defines the type of the bean and
uses the fully qualified classname. The value of the id attribute
refers to collaborating objects.

简单说就是,Bean需要个id名,以后在被依赖或被调用时,能被辨别;它还需要个class属性值,而且要完整的(包+类名)这样才能被容器认识。

10寻找全限定类名:技巧如下:
在这里插入图片描述
找到需要加载到容器的类,右键点击红框所示的class -> Copy Qualified Name选项;之后粘贴到相关< bean > 的class属性中即可;

11:最终呈现结果

<?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">

	<bean id="aa" class="com.bean.Bean_1"></bean>

</beans>

四,测试类的编写
首先我们还是先思考下我们下步要干什么:一切步骤都围绕着目的。
回顾下目的:通过xml配置Bean,验证容器是否实例化了我们提供的类;
我们完成了xml配置,写了一个类,但是好像都没提到容器,没用容器将两者关联,xml也就是个没被读取的文本文档,而类也只是个没创建的类,内存都进不去。显而易见,我们下步要做的就是把他们用容器关联起来。
则要解决的问题就是怎么把他们连接在一起?有很多途径去找到答案,这儿,我用说明文档来解答
在这里插入图片描述

The interface org.springframework.context.ApplicationContext
represents the Spring IoC container and is responsible for
instantiating, configuring, and assembling the aforementioned beans.
The container gets its instructions on what objects to instantiate,
configure, and assemble by reading configuration metadata. The
configuration metadata is represented in XML, Java annotations, or
Java code.

ApplicationContext 接口负责着对Bean实例化,配置等工作,工作原理是读取相关配置信息;而这些信息来自于开发者编辑的xml文档,java注释或Java代码;

这段话可以看出它可能就是我们要找的答案了,我们只要找到合适的实现类就可以了。 而:
在这里插入图片描述

Several implementations of the ApplicationContext interface are
supplied out-of-thebox with Spring. In standalone applications it is
common to create an instance of ClassPathXmlApplicationContext or
FileSystemXmlApplicationContext.

文档介绍了两种常用的ApplicationContext 的实例:ClassPathXmlApplicationContext 和FileSystemXmlApplicationContext.

以下是文档给出的简易例子:
在这里插入图片描述

  1. 加载xml文件:
    在这里插入图片描述
    报错,原因是无法解析该类,因为这接口是Spring容器提供的,没有这类只能说明该类不在spring-beans包里,进一步可以说明我们少导入jar包了;
    下一步就是确定该类在Spring的哪个jar包里:这里通过Sping-API文档说明
    在这里插入图片描述
    红色框就可以说明我们少导入spring-context包;(当然你可能看到包名认为是缺少了spring-context-support包,这么想逻辑是通的,为了验证我们都导入看看就知道了)
    这里也可以注意下黑色框,发现它还依赖着spring-core包,不过这里先不着急导入,先搁着不管,毕竟正常情况下我们看个文档不太可能观察得这么细。
    下面是两个context包的信息:
    在这里插入图片描述在这里插入图片描述

  2. 导入spring-context-5.1.6.RELEASE.jar包后,添加import,再捕捉异常,会发现又有问题了:在这里插入图片描述
    如果查看API文档可以看到它的直接父类是org.springframework.core.NestedRuntimeException,
    所以说明缺少了spring-core
    但这次我用查看源代码的方式会更直观点:
    鼠标放在"BeanException"上,按下Ctrl键,点击进入。(即打开声明的操作) 这种方法也能快速地发现错误,如下图所示:
    如果是没下载或没绑定源文件的,会看不到源代码,关于这问题我也很苦闷。
    在这里插入图片描述

  3. 导入spring-core-5.1.6.RELEASE.jar后,就是名字编写的问题了,这个我还没找到规律,只能多试试;以后有机会会单独写一篇。 这里特殊,因为xml是直接在path路径下的,可以直接写xml名;再说下前提xml文件在源文件夹目录下。 本例是名字写"Bean_1.xml"

  4. 调用getBean方法,取Bean_1对象,
    我们可以看API文档,去找ClassPathXmlApplicationContext类,然而发现并没有这方法,就只能看类继承了,会发现:在这里插入图片描述
    在这里插入图片描述
    我们选择第一个简单的,参数name值就是容器里我们定义Bean的id,本例是"aa";
    因为返回的是object类型,我们需要再强制成Bean_1类

package com.bean;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Tbean_1 {

public static void main(String[] args) throws BeansException {
	ApplicationContext context1=
			new ClassPathXmlApplicationContext("Bean_1.xml");	
	
	Bean_1 s = (Bean_1) context1.getBean("aa");

	s.a();
}
}

运行会发现
在这里插入图片描述
也就是缺少了这个类,而这个类属于commons-logging包。则需要导入。
补:也可以spring-jcl-5.1.6.RELEASE.jar替代,因为它含commons-logging部分功能;
我们可以看看它们的结构: 虽然有类似,但是它们是不等同的,这需要注意
在这里插入图片描述

再运行试试:

但是运行后,还是发生异常:在这里插入图片描述
还是缺少类,根据命名风格,可以猜到它是spring-expression包的。再导入运行:
在这里插入图片描述
会发现终于成功了。

为什么缺少这些包就不行了呢?我们能想到的是,有依赖。如果愿意的话,我们甚至可以根据刚刚的操作过程知道哪个包依赖哪个包。下面我通过maven依赖树简单说明下:
在这里插入图片描述

总结:我想分享和自己需要加强的有以下几点:

  1. 空xml文件的完善与书写;
  2. 围绕着目的,遇到卡顿时,尽量想想已经有了什么?还需要什么?怎么得到这需要?
  3. 多看说明文档,API文档。里面有大量的实例,我们可以参考;
  4. 多去看异常的说明,像该例,我们知道ClassNotFoundException讲的是什么,我们就知道我们缺少类了;
  5. 我不喜欢去看原理,但是很多情况下这很重要,知道了更能让人理解。就比如Spring包的导入吧。我刚开始学的时候,看网上大部分教程,都是一上来就把Spring-xx包全部导入,然后。。。虽然最后写的是很顺利,但是我整个过程完全不知道导入这些包是干什么的。

后记:
本节分享结束,写博客真是个一步一步的过程,要讲明白,又不能讲的繁琐。不过通过写博客,我对这Spring过程有点更深的印象了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值