Java 自定义Spring框架以及Spring框架的基本使用
作者:李阿昀 发布时间:2021-05-29 19:35:57
从现在开始,大家可以跟随着我的脚步来自定义一个属于自己的Spring框架。但是,在学习自定义Spring框架之前,我们得先来回顾一下Spring框架的基本使用。知晓了Spring框架的基本使用之后,我们将会在此基础上分析Spring的核心,即IoC,最后我们会对该核心进行一个模拟。
相信大家都使用过Spring框架,现在恐怕是无人不知Spring了吧!我相信你在实际项目开发中肯定用到过它,一般在实际项目中用到它的话,都会采用Java EE的三层架构,这三层架构是:
数据访问层,也即Dao层
业务逻辑层,也即Service层
控制器层,也即Controller层
下面我们就采用这三层架构来编写我们的代码,以此来回顾一下Spring框架的基本使用。
回顾一下Spring框架的基本使用
首先,使用IDEA来创建一个Maven工程,工程名字你可以取为spring_demo,在该工程中我们就来使用一把Spring。
注意了,在使用Spring框架之前,我们先要做一件事,那就是在Maven工程的pom.xml文件中引入Spring框架的坐标。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.9</version>
</dependency>
然后,根据Java EE的三层架构创建好各层对应的包,为了让大家清楚地看到我都创建了哪些包,干脆我把最终Maven工程的结构给大家展示出来吧!
各层对应包创建好之后,接下来我们就要编写各层对应的代码了。
数据访问层
首先,创建数据访问层接口,该接口我们不妨就命名为UserDao。
package com.meimeixia.dao;
/**
* 数据访问层接口
* @author liayun
* @create 2021-09-19 18:17
*/
public interface UserDao {
public void add();
}
然后,创建数据访问层接口的子实现类,该类我们不妨就命名为UserDaoImpl。
package com.meimeixia.dao.impl;
import com.meimeixia.dao.UserDao;
/**
* 数据访问层实现类
* @author liayun
* @create 2021-09-19 18:29
*/
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("UserDao...");
}
}
业务逻辑层
首先,创建业务逻辑层接口,该接口我们不妨就命名为UserService。
package com.meimeixia.service;
/**
* 业务逻辑层接口
* @author liayun
* @create 2021-09-19 18:31
*/
public interface UserService {
public void add();
}
然后,创建业务逻辑层接口的子实现类,该类我们不妨就命名为UserServiceImpl。
package com.meimeixia.service.impl;
import com.meimeixia.dao.UserDao;
import com.meimeixia.service.UserService;
/**
* 业务逻辑层实现类
* @author liayun
* @create 2021-09-19 18:37
*/
public class UserServiceImpl implements UserService {
// 因为业务逻辑层是要调用数据访问层中的功能的,所以在这儿我们得声明一个UserDao类型的变量
private UserDao userDao; // 注意了,这儿我们并没有为该变量进行赋值,赋值的操作得交给Spring去做,只是这样做的前提是我们得为该变量提供一个setter方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void add() {
System.out.println("UserService...");
userDao.add();
}
}
控制器层
首先,编写Spring的配置文件,这里,我们在类路径(在IDEA看来,其实就是src > main > resources
目录)下编写了一个名为applicationContext.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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.meimeixia.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.meimeixia.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
然后,创建控制器,这里我们就命名为UserController了。注意了,在该控制器中我们是使用main方法来模拟Controller层的。
package com.meimeixia.controller;
import com.meimeixia.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author liayun
* @create 2021-09-19 18:41
*/
public class UserController {
public static void main(String[] args) throws Exception {
// 1. 创建Spring的容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2. 从容器对象中获取UserService对象
UserService userService = applicationContext.getBean("userService", UserService.class);
// 3. 调用UserService对象的方法进行业务逻辑处理
userService.add();
}
}
以上控制器的代码写完之后,随即我们来做一个测试。运行以上控制器的代码,打印结果如下图所示。
通过上面代码及结果可以看出:
UserService对象是从Spring容器对象中获取到的,也就是UserService对象是交由Spring来进行管理的。
从上面结果中可以看到调用了UserDao对象中的add方法,也就是说UserDao子实现类对象也交由Spring来管理了。
UserService中的userDao变量我们并没有进行赋值,但是可以正常使用,说明Spring已经将UserDao对象赋值给了userDao变量。
相信大家都能看出来,上面三点体现出来了Spring框架两个核心,即IoC(Inversion of Control,控制反转)和DI(Dependency Injection,DI,依赖注入)。
至此,我们就回顾完了Spring框架的基本使用。
来源:https://liayun.blog.csdn.net/article/details/120699914


猜你喜欢
- java.lang.NoClassDefFoundError错误解决办法前言在日常Java开发中,我们经常碰到java.lang.NoCla
- 消息的可靠投递在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用
- 如下所示:public static void main(String[] args) throws IOException {  
- 前言之前探讨过的 sealed class 和 sealed interface 存在 module 的限制,但其主要用于密封 class
- 1、前言 最近做项目需要用到监测网速及流量,我经过百度和墙内谷歌都没能快速发现监测IPV6流量和网速的用例;也经过自己的一番查询和调试,浪
- 本文研究的主要是Java回调函数与观察者模式的实现,具体介绍和实现代码如下。观察者模式(有时又被称为发布(publish )-订阅(Subs
- 如下所示:public static boolean isSdcardExists(Context context) {StorageMan
- RecyclerView是Android 5.0的新特性,可以直接代替ListView与GridView,并且能够实现瀑布流的布局,感觉Re
- 背景在实际开发过程中,会遇到需要编写各类打印模板模板的需求,当然这些在WPF开发中更为常见,但是使用XAML写编辑的打印模板又不能直接发送给
- C# goto 语句用于直接在一个程序中转到程序中的标签指定的位置,标签实际上由标识符加上冒号构成。语法形式如下。goto Labell;
- 最近正式入坑Flutter,首先从环境搭建开始,看了网上好多关于Windows环境搭建的资料,基本都是按官方文档写的,看完的感受是,还不如直
- c#里面封装了几乎所有我们可以想到的和我们没有想到的类,流是读取文件的一般手段,那么你真的会用它读取文件中的数据了么?真的能读完全么?通常我
- Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法。下面
- 这篇文章主要介绍了Java并发编程预防死锁过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- //程序下载升级 zhouxiang@JavascriptInterfacepublic void UpdateCAECP(final St
- 上一篇文章介绍了MediaPlayer相关内容,这次用两篇文章来介绍SurfaceView的用法。网上介绍SurfaceView的用法有很多
- 实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求。 为了解决这样的问题,spring Boot 为我们提供了一
- 1. 前言Guava是一个由Google开发的Java核心库,它提供了很多有用的方法和实用工具类,可以帮助开发人员提高代码质量和开发效率。在
- 进程间图怎么传递图形buffer写这篇文章的目的:讲解 进程间图怎么传递图形buffer的最近研究图形缓存怎么在进程之间传递的,谷歌了所有的
- 先看效果:输入内容,点击生成二维码:点击logo图案:代码:QRCodeUtil:package com.example.administr