用spring改造后的示例应用

文章介绍了如何将一个非Spring应用改造成Spring应用,通过添加spring-context依赖开始,然后展示了如何在XML文件中配置bean,包括bean的id、class属性以及属性注入。通过标签管理对象和它们的依赖,还提到了标签用于模块化配置。最后,通过示例代码说明如何从SpringIoC容器中获取并使用bean。
摘要由CSDN通过智能技术生成

对于前面不使用spring的例子,是时候将其改造成spring应用了。

从之前的练习模块spring-00-demo-without-spring拷贝一份,修改为spring-01-demo-with-spring,在此基础上应用Spring框架的功能。

首先引入spring相关的依赖,因为父模块是Spring源码工程,引入spring核心模块就变得很简单了,只要引入spring-context模块即可:

spring-01-demo-with-spring\build.gradle

dependencies {
    compile(project(":spring-context"))
}

接下来我们重点看spring如何配置bean(POJO),在源码包resources下新建这样几个xml文件:
在这里插入图片描述
文件命名没有特别要求,一般以-context结尾,表明是Spring IoC容器要加载的上下文配置。

application-context.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- id为该实例在IoC容器中的标识字段 -->
    <bean id="funnyBook" class="com.xiaoma.spring.example.reading.Book">
        <property name="name" value="金瓶梅" />
        <property name="type" value="文学" />
    </bean>

    <bean id="boringBook" class="com.xiaoma.spring.example.reading.Book">
        <property name="name" value="Spring入门" />
        <property name="type" value="IT" />
    </bean>

    <bean id="dabao" class="com.xiaoma.spring.example.reading.Child">
        <property name="name" value="大宝" />
        <!-- 通过ref属性引用其他bean -->
        <property name="book" ref="funnyBook" />
    </bean>

    <bean id="erbao" class="com.xiaoma.spring.example.reading.Child">
        <property name="name" value="二宝" />
        <property name="book" ref="boringBook" />
    </bean>

	<bean id="bookStoreApp" class="com.xiaoma.spring.example.bookstore.BookStoreApp">
		<property name="bookService" ref="bookService" />
	</bean>

	<!-- 当一个工程模块很多时可以使用<import />标签按模块将bean的声明维护到不同的xml片段中 -->
	<import resource="dao-context.xml" />
	<import resource="service-context.xml" />

</beans>

最外层的<beans>标签用来管理内部定义的<bean>标签。这里我们为每个<bean>标签指定了classid属性,表明我们要对哪种bean的类型进行实例化,实例化后的对象叫什么名字。<bean>标签内部可以指定<property>属性来为bean的属性赋值,也叫做注入。<property>标签的value属性可以赋基本类型的值,而ref属性则用于对依赖的bean对象进行注入,也就是给引用类型的属性赋值。

xml中定义的配置还可以以碎片文件的形式,通过<import>标签导入到当前文件中。比如这里我们将daoservice层的bean定义分散到各自的xml片段文件中,并通过<import>标签导入进来。

dao-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>

    <bean id="bookDao" class="com.xiaoma.spring.example.bookstore.dao.impl.BookDaoImpl" />

<!--    <bean id="bookDao" class="com.xiaoma.spring.example.bookstore.dao.impl.BookDaoMockImpl" />-->

</beans>

以上我们的id为bookDao的bean是一个BookDaoImpl类型的实例,当然我们也可以把它替换为BookDaoMockImpl类型,只要把第一个注释掉,把第二个注释放开即可。

service-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>

    <bean id="bookService" class="com.xiaoma.spring.example.bookstore.service.impl.BookServiceImpl">
        <property name="bookDao" ref="bookDao" />
    </bean>

</beans>

声明service的bean组件时,指定了对bookDao属性进行注入时引用的是哪一个bean,ref的值为beanName,也就是依赖的bean的名称,要确保ref指向的bean定义必须存在。

这种xml声明bean的形式相比我们之前在应用启动方法中手动的new实例并进行依赖关系的组装,我们会发现,开发人员无需再关注于如何构建实例,包括构造实例的细节,需要传什么样的实参,从哪里取这些实参,以及需要设置的属性为引用bean的情况,如何匹配合适的类型,不存在相应类型的bean以及多个同类型的bean如何做决定等等。对开发人员来说,仅仅只需要声明bean的创建形式,声明属性注入的形式,实例化bean、依赖注入这些交给容器来完成,做到了声明bean和实例化bean解耦。

spring的IoC容器负责加载开发人员声明的bean定义文件,容器的启动工作和对bean的管理对开发人员来说是透明的。我们要做的只是在容器正常启动后从中获取我们想要的bean来完成业务操作。看调整后的相关类:

ReadingApp.java

package com.xiaoma.spring.example.reading;

import ...

@Slf4j
public class ReadingApp {

   public void run() {
      // 根据指定的配置文件启动spring IoC容器
      ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
      // 根据标识名称和类型从IoC容器获取Bean
      Book funnyBook = context.getBean("funnyBook", Book.class);
      log.info("funnyBook: {}", funnyBook);

      Child dabao = context.getBean("dabao", Child.class);
      dabao.read();
      Child erbao = context.getBean("erbao", Child.class);
      erbao.read();
   }
}

BookStoreAppTest.java

package com.xiaoma.spring.example.bookstore;

import ...

class BookStoreAppTest {

   @Test
   void saveBook() {
      // 根据指定的配置文件启动spring IoC容器
      ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
      BookStoreApp bookStoreApp = context.getBean("bookStoreApp", BookStoreApp.class);
      bookStoreApp.saveBook("金瓶梅", "文学");
   }
}

运行单元测试,能得到和上一节一样的执行结果。

通过本小节的学习,我们体会到spring框架引入容器来帮我们完成bean的管理,而我们要做的就是索取bean并执行业务方法,生活变得美好起来了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java小卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值