首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【SSM-Spring(一)】初上手Spring?别急!从最底部开始学习Spring吧!从Bean开始!本文介绍Spring程序的开发、Bean的声明周期与依赖注入概念

【SSM-Spring(一)】初上手Spring?别急!从最底部开始学习Spring吧!从Bean开始!本文介绍Spring程序的开发、Bean的声明周期与依赖注入概念

作者头像
凉凉心.
发布2025-10-13 17:20:28
发布2025-10-13 17:20:28
1530
举报
文章被收录于专栏:CSDN专栏CSDN专栏

1. Spring是什么?

Spring是分层的javaSE/EE 应用 full-stack(全栈) 轻量级开源框架,以 loC ( Inverse Of control : 反转控制)AOP ( Aspect Oriented Programming : 面向切面编程) 为内核

Spring提供了展现层 SpringMVC持久层 Spring JDBCTemplate 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架

1.1 Spring的发展历程:

  • 时间线:
    • 1997年,IBM提出了EJB的思想 |
    • 1998年,SUN指定开发标准规范 EJB1.0 |
    • 1999年,EJB1.1发布 |
    • 2001年,EJB2.0发布 |
    • 2003年,EJB2.1发布 |
    • 2006年,EJB3.0发布 ↓
    • 2017年9月份,发布了Spring的最新版本SPring5.0通用版(GA)

人物:Rod Johnson (Spring之父) 书籍: 《Expert One-on-One J2EE Design and Development 》 ​ · 这是 Rod Johnson 在2002年写的书,该书讲述了 J2EE 使用 EJB 开发设计的优点及解决方案 ​ 《 Expert One-on-One J2EE Development without EJB 》 ​ · 两年后 Rod 在2004年写出了这本书,该书讲述了 J2EE 使用 EJB 开发设计的缺点,并对该种模式提出了解决方案 (Spring雏形)

1.2 Spring 的优势:

  1. 方便解耦,简化开发

通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过渡耦合。

用户也不必再为单例模式类,属性文件解析等这些很底层的需求编写代码,可以更专注于上层应用。

  1. AOP 编程的支持

通过Spring的 AOP 功能,方便进行面向切面编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松实现。

  1. 声明式事务的支持

可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明方式灵活的进行事务管理,提高开发效率和质量

  1. 方便程序的测试

可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情

  1. 方便集成各种优秀框架

Spring对各种优秀框架 (Struts、 Hibemate、 Hessian、 Quartz 等) 的支持

  1. 降低JavaEE API 的使用难度 Spring 对 JavaEE API (如 JDBC、 JavaMail、 远程调用等) 进行了薄薄的封装层,使这些 API 的使用难度大为降低
  2. Java 源码是经典学习范例

Spring 的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对 Java 设计模式灵活运用以及对 Java 技术的高深造诣。

它的源代码无疑是 Java 技术的最佳实践范例

1.3 Spring的体系结构:

在这里插入图片描述
在这里插入图片描述

2. Spring程序开发步骤

  1. 导入框架的基本包坐标
  2. 编写类的接口和实现类
  3. 创建Spring核心 xml 配置文件
  4. 将 类的标识 配置进 xml 配置文件中
  5. 通过Spring客户端 getBean(id标识) 的方式
    • 使用 Spring 的 API 获得 Bean 实例
    • 让 Spring 去 xml 配置文件中根据 id 标识 返回bean全限定名
  6. Spring获得 Bean 全限定名,通过反射创建Bean对象
  7. Spring返回对象
  • 类 TestDemo = Spring客户端.getBean(id) 的方式接受对象

3. Bean

3.1 Bean 标签的基本配置

用于配置对象交由Spring来创建。

默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。

基本属性:

  • id: Bean实例在Spring容器中的唯一标识id - Bean实例在Spring容器中的唯一标识
  • class: Bean的全限定名称

3.2 Bean标签的范围配置:

scope:指对象的作用范围,取值如下
  • singleton(默认) : 单例的,同一bean在被创建时,地址都指向同一个
  • protatype : 多例的,同一bean在被创建时,地址分别指向第一个创建和第二个创建
  • request : Spring创建一个Bean的对象,将对象存入到request域中
  • session : Spring创建一个Bean的对象,将对象存入到session域中
  • global session : 应用在 Portlet 环境,如果没有Portlet环境,那么 gloablSession 相当于 session
  1. 当scop的取值为 singleton 时:
    • Bean 的实例化个数:1个
    • Bean 的实例化时机:当 Spring 核心文件被加载时,实例化配置的 Bean 实例
    • Bean 的生命周期:
      1. 对象创建:当 xml 应用加载,创建容器时,对象就被创建了
      2. 对象运行:只要容器在,对象一直活着
      3. 对象销毁:当应用卸载,销毁容器时,对象就被销毁了
  2. 当scpe的取值为prototype时:
  • Bean 的实例化个数:多个
    • Bean 的实例化时机:当调用getBean()方法时实例化Bean:
      1. 对象创建:当使用对象时,创建新的对象实例
      2. 对象运行:只要对象在使用中,就一直活着
      3. 对象销毁:当对象长时间不用时,被Java的垃圾回收器回收了
Bean 生命周期配置:
  • init-method:指定类中的初始化方法名称
  • destroy-method:指定类中销毁方法的名称
Bean 实例化的三种方式:

无参构造方法实例化

代码语言:javascript
复制
<bean id="唯一标识" class="全限定名"></bean>

工厂静态方法实例化

代码语言:javascript
复制
<bean id="唯一标识" class="全限定名-指定工厂的类" factory-mthod="工厂类中的方法"></bean>

工厂实例方法实例化

代码语言:javascript
复制
<bean id="唯一标识-工厂" class="全限定名-指定工厂的类"></bean><!--实例方法需要先创建工厂类-->
<bean id="唯一标识" factory="唯一标识-工厂" factory-method="工厂类中的方法"></bean>
Bean 的依赖注入概念:

依赖注入 ( Dependency Injection) :它是Spring框架核心 IOC 的具体实现

​ 在编写程序时,通过控制反转,把对象的创建交给了Spring,但是代码中不可能出现没有依赖的情况。

IOC 解耦知识降低它们的依赖关系,但不会消除。 ​ 例如:业务层仍会调用持久层的方法。

​ 那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。 ​ 简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取

例: 将DAO注入进Service中,在使用容器时,指向该Service,可以获取到该Service的实例 并可以针对Service进行操作,而Service中,存在DAO,在编写Service时,使用容器,也可以针对DAO进行操作

Bean 的依赖注入方式:

构造方法

代码语言:javascript
复制
<bean id="指定的另一个bean标识符" class="标识符对象路径"></bean>
<bean id="指定标识符" class="标识符对象路径">
    <constructor-arg name="有参构造方法的参数名" ref="指定的另一个bean标识符"></constructor-arg>
</bean>

set 方法

代码语言:javascript
复制
<bean id="指定的另一个bean标识符" class="标识符对象路径"></bean>
<bean id="指定标识符" class="标识符对象路径">
    <property name="set方法的属性" ref="指定的另一个bean标识符"></property>
</bean>

set方法的简单写法:

代码语言:javascript
复制
xmlns:p="http://www.springframework.org/schema/p" <!--需要引入-->

<bean id="指定标识符" class="标识符对象路径" p:userDao-ref="指定的另一个bean标识符"></bean>
Bean的依赖注入的数据类型:

除了对象的引用可以注入,普通的数据类型,集合等都可以在容器中进行注入

注入数据的三种数据类型:

普通数据类型

代码语言:javascript
复制
<bean id="标识符" class="标识符路径">
    <property name="属性名" value="属性值"></property>
</bean>

引用数据类型

集合数据类型

  • List:
代码语言:javascript
复制
<bean id="标识符" class="标识符路径">
    <property name="属性名">
		<list>
             <value>a1</value>
			<value>c3</value>
          </list>
	</property>
</bean>

Map:

代码语言:javascript
复制
<bean id="标识符" class="标识符路径">
    <property name="属性名">
        <map>
            <entry key="键1" value-ref="bean标识名1"></entry>
            <entry key="键2" value-ref="bean标识名2"></entry>
        </map>
	</property>
</bean>
<bean id="bean标识名1" class="标识符对象路径">
    <property name="属性" value="值"></property>
</bean>
<bean id="bean标识名2" class="标识符对象路径">
    <property name="属性" value="值"></property>
</bean>
3.3 引入其他配置文件 (分模块开发)

实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积大, 所以,可以将部分配置拆解到其他配置文件中,而Spring主配置文件通过 import 标签进行加载

代码语言:javascript
复制
<import resource="配置文件路径"></import>
3.4 知识要点:

Spring的重点配置:

代码语言:javascript
复制
<Bean><!--标签:Spring的关键-->
    <!--id属性:在容器中Bean实例的唯一标识,不允许重复-->
    <!--class属性:要实例化的Bean的全限定名-->
    <!--scope熟悉的:Bean的作用范围,常用时Singleton(默认)和prototype-->
    
    <property><!--标签:属性注入-->
        <!--name属性:属性名称-->
        <!--value属性:注入的普通属性值-->
        <!--erf属性:注入的对象引用值-->
        <list><!--用于list数据类型的数据传递-->
            <value></value><!--用于list数据类型里值的设置-->
        </list>
        <map><!--用于map数据类型的数据传递-->
            <entry></entry><!--用于设置map数据类型里的值-->
        </map>
    </property>
			
    <construcor-arg><!--标签:构造方法注入-->
    </construcor-arg>
</Bean>

<import><!--标签:导入其他的Spring的分文件-->

4. ApplicationContext的继承体系

ApplicationContext:

​ 接口类型,代表应用上下文,可以通过其实例获得Spring容器中的Bean对象

ApplicationContext的实现类:
  1. ClassPathXmlApplicationContext 它是从类的根路径下加载配置文件(推荐使用)
  2. FileSystemXmlApplicationContext 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置
  3. AnnotationConfigApplicationContext 当使用注释配置容器对象是,需要使用此类来创建spring容器。它用来读取注解
getBean()方法使用 (源码展示):
代码语言:javascript
复制
/*
* 此方法可以使用多个userService地址,
* 因为它并没有对getBean声明所需类名,只是针对唯一标识符
* */
public Object getBean(String name) throws BeansException {
	this.assertBeanFactoryActive();
	return this.getBeanFactory().getBean(name);
}

/*
* 当存在多个UserService地址时,此方法将会报错
* 因此,此方法只能确保UserService地址只有一个的情况下使用
* */
public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
    this.assertBeanFactoryActive();
    return this.getBeanFactory().getBean(name, requiredType);
}
知识要点:
代码语言:javascript
复制
ApplicationContext app = new ClassPathXmlApplicationContext("xml文件");
app.getBean("唯一标识符");
app.getBean(class);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Spring是什么?
    • 1.1 Spring的发展历程:
    • 1.2 Spring 的优势:
    • 1.3 Spring的体系结构:
  • 2. Spring程序开发步骤
  • 3. Bean
    • 3.1 Bean 标签的基本配置
    • 3.2 Bean标签的范围配置:
      • 3.3 引入其他配置文件 (分模块开发)
      • 3.4 知识要点:
  • 4. ApplicationContext的继承体系
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档