Spring基础 - Spring简单例子引入Spring要点

Spring基础 - Spring简单例子引入Spring要点

设计一个Spring的Hello World

  • 设计一个查询用户的案例的两个需求,来看Spring框架帮我们简化了什么开发工作

pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>tech.pdai</groupId><artifactId>spring_framework_demo_hellowrold_xml</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><spring.version>5.3.9</spring.version><aspectjweaver.version>1.9.6</aspectjweaver.version></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectjweaver.version}</version></dependency></dependencies></project>
  • 工程整体框架如下:

在这里插入图片描述

  • App
package tech.pdai.springframework;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import tech.pdai.springframework.entity.User;
import tech.pdai.springframework.service.UserServiceImpl;import java.util.List;/*** @author pdai*/
public class App {/*** main interfaces.** @param args args*/public static void main(String[] args) {// create and configure beansApplicationContext context =new ClassPathXmlApplicationContext("aspects.xml", "daos.xml", "services.xml");// retrieve configured instance// 将原有的Bean的创建工作转给框架  需要用时从Bean的容器中获取即可,简化开发工作UserServiceImpl service = context.getBean("userService", UserServiceImpl.class);// use configured instanceList<User> userList = service.findUserList();// print info from beans
//        userList.forEach(a -> System.out.println(a.getName() + "," + a.getAge()));}
}
  • 有了Spring框架,可以将原有Bean的创建工作转给框架, 需要用时从Bean的容器中获取即可,这样便简化了开发工作

总结

  • Spring框架管理这些Bean的创建工作,用户管理Bean转变为框架管理Bean,这个叫做控制翻转 IOC (Inversion Of Control)
  • Spring框架托管创建的Bean放在IOC Container
  • Spring框架为了更好的让用户配置Bean,必然会引入不同方式来配置Bean,这便是xml配置 Java配置 注解配置
  • Spring框架既然接管了bean的生成,必然需要管理整个Bean的生命周期
  • 应用程序代码从IOC Container中获取依赖的bean,注入到引用程序中,这个过程称之为依赖注入,控制翻转是通过依赖注入实现的
  • 依赖注入有哪些方式@AutoWired @Resource @Qualifier 同时Bean之间存在依赖,存在先后顺序问题,以及循环依赖问题

面向切面 - AOP

  • 有了Spring框架,通过@Aspect注解 定义切面
  • 切面中定义拦截所有service的方法 并记录日志
  • 框架将日志记录和业务需求的代码解耦了 不再是侵入式了
package tech.pdai.springframework.aspect;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;import java.lang.reflect.Method;/*** @author pdai  拦截所以service方法*/
@Aspect
public class LogAspect {/*** aspect for every methods under service package.*/@Around("execution(* tech.pdai.springframework.service.*.*(..))")public Object businessService(ProceedingJoinPoint pjp) throws Throwable {// get attribute through annotationMethod method = ((MethodSignature) pjp.getSignature()).getMethod();System.out.println("execute method: " + method.getName());// continue to processreturn pjp.proceed();}}
  • Spring框架通过定义切面,通过拦截切点实现不同业务模块的解耦,这个叫做面向切面编程(AOP)
  • 如何实现AOP:代理技术,分为静态代理和动态代理,动态代理包含JDK代理和CGLIB代理

Spring框架设计如何逐步简化开发的

注解配置方式改造

BeanConfig 不再需要Java配置
package tech.pdai.springframework.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;/*** @author pdai*/
@Configuration
@EnableAspectJAutoProxy
public class BeansConfig {}
UserDaoImpl 增加了 @Repository注解
/*** @author pdai*/
@Repository
public class UserDaoImpl {/*** mocked to find user list.** @return user list*/public List<User> findUserList() {return Collections.singletonList(new User("pdai", 18));}
}
UserServiceImpl 增加了@Service 注解,并通过@Autowired注入userDao.

package tech.pdai.springframework.service;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tech.pdai.springframework.dao.UserDaoImpl;
import tech.pdai.springframework.entity.User;/*** @author pdai*/
@Service
public class UserServiceImpl {/*** user dao impl.*/@Autowiredprivate UserDaoImpl userDao;/*** find user list.** @return user list*/public List<User> findUserList() {return userDao.findUserList();}}
在App中扫描tech.pdai.springframework包
package tech.pdai.springframework;import java.util.List;import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import tech.pdai.springframework.entity.User;
import tech.pdai.springframework.service.UserServiceImpl;/*** @author pdai*/
public class App {/*** main interfaces.** @param args args*/public static void main(String[] args) {// create and configure beansAnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("tech.pdai.springframework");// retrieve configured instanceUserServiceImpl service = context.getBean(UserServiceImpl.class);// use configured instanceList<User> userList = service.findUserList();// print info from beansuserList.forEach(a -> System.out.println(a.getName() + "," + a.getAge()));}
}

SpringBoot托管配置

  • Springboot实际上通过约定大于配置的方式,使用xx-starter统一的对Bean进行默认初始化,用户只需要很少的配置就可以进行开发了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/462125.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问题:孔隙比总是1.0。 #知识分享#微信

问题&#xff1a;孔隙比总是1.0。 /ananas/latex/p/1242 参考答案如图所示

Android应用图标微技巧,8.0系统中应用图标的适配

大家好,2018年的第一篇文章到的稍微有点迟,也是因为在上一个Glide系列结束之后一直还没想到什么好的新题材。 现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了。三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接着小米、华为、OV等国产手机厂…

基于BatchNorm的模型剪枝【详解+代码】

文章目录 1、BatchNorm&#xff08;BN&#xff09;2、L1与L2正则化2.1 L1与L2的导数及其应用2.2 论文核心点 3、模型剪枝的流程 ICCV经典论文&#xff0c;通俗易懂&#xff01;论文题目&#xff1a;Learning Efficient Convolutional Networks through Network Slimming卷积后能…

如何写一个其他人可以使用的GitHub Action

前言 在GitHub中&#xff0c;你肯定会使用GitHub Actions自动部署一个项目到GitHub Page上&#xff0c;在这个过程中总要使用workflows工作流&#xff0c;并在其中使用action&#xff0c;在这个使用的过程中&#xff0c;总会好奇怎么去写一个action呢&#xff0c;所以&#xff…

亲测解决vscode的debug用不了、点了没反应

这个问题在小虎登录vscode同步了设置后出现,原因是launch文件被修改或删除。解决方法是重新添加launch。 坏境配置 win11 + vscode 解决方法 Ctrl + shift + P,搜索debug添加配置: 选择python debugger。 结果生成了一个文件在当前路径: launch内容: {// Use Int…

【Java八股面试系列】JVM-垃圾回收

目录 垃圾回收 堆空间的基本结构 内存分配和回收原则 分代收集机制 Minor GC 流程 空间分配担保 老年代 大对象直接进入老年代 长期存活的对象将进入老年代 GC的区域 对象存活判定算法 引用计数法 可达性分析算法 finalize() 字符串常量判活 类判活 垃圾回收算…

网络原理——数据链路层

以太网是数据链路层的核心协议 1. 以太网数据帧的组成部分 帧起始符&#xff08;Preamble&#xff09;&#xff1a;8字节的连续数据0xAA&#xff0c;标识一个新数据帧的开始&#xff0c;用于同步收发双方的时钟。 目的MAC地址&#xff08;Destination MAC Address&#xff09…

微软.NET6开发的C#特性——委托和事件

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性&#xff0c;然后比较其他各种语言进行认识。 C#经历了多年发展…

Lua 教程

Lua 教程 (今天又又又开新坑啦) Lua 教程 手册简介 Lua 是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并以源代码形式开放。 手册说明 Lua是什么? Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学&#xff08;Pontifical Catholic University of Rio de …

flink反压及解决思路和实操

1. 反压原因 反压其实就是 task 处理不过来&#xff0c;算子的 sub-task 需要处理的数据量 > 能够处理的数据量&#xff0c;比如&#xff1a; 当前某个 sub-task 只能处理 1w qps 的数据&#xff0c;但实际上到来 2w qps 的数据&#xff0c;但是实际只能处理 1w 条&#…

年-月-日的输入方法

大家对于输入的函数一定有所认识&#xff0c;比如c中位于 #include <iostream> 中的 cin 函数&#xff0c;这个函数输入单个十分好用&#xff0c;但是对于年月日这种较为复杂的就行不通了&#xff0c;就只能输入最前面的一个 那怎么输入像这样的年月日呢 答案就是用 scan…

FPGA_ip_Rom

一 理论 Rom存储类ip核&#xff0c;Rom是只读存储器的简称&#xff0c;是一种只能读出事先存储数据的固态半导体存储器。 特性&#xff1a; 一旦储存资料&#xff0c;就无法再将之改变或者删除&#xff0c;且资料不会因为电源关闭而消失。 单端口Rom: 双端口rom: 二 Rom ip核…