Spring基础-Spring和Spring框架组成

一文学会Spring,Spring最简单的入门教程(万字好文) spring教程 阅读详情

前言

Spring是什么?它是怎么诞生的?有哪些主要的组件和核心功能呢? 本文通过这几个问题帮助你构筑Spring和Spring Framework的整体认知。

Spring简介

Spring 是分层的 full-stack(全栈) 轻量级开源框架,以 IoC 和 AOP 为内核,提供了展现层 Spring MVC 和业务层事务管理等众多的企业级应⽤技术,还能整合开源世界众多著名的第三⽅框架和类库,已经成为使⽤最多的 Java EE 企业应⽤开源框架。

Spring 官⽅⽹址:http://spring.io/

Spring 中文网址:https://springdoc.cn/spring/

我们经常说的 Spring 其实指的是Spring Framework(spring 框架)。 

Spring 发展历程  

  • 1997年 IBM 提出了EJB的思想;1998年,SUN 制定开发标准规范EJB1.0;1999年,EJB 1.1发 布;2001年,EJB 2.0发布;2003年,EJB 2.1发布;2006年,EJB 3.0发布;

  • Rod Johnson(spring之⽗)

    1. Expert One-to-One J2EE Design and Development(2002) 阐述了J2EE使⽤EJB开发设计的优点及解决⽅案

    2. Expert One-to-One J2EE Development without EJB(2004) 阐述了J2EE开发不使⽤EJB的解决⽅式(Spring雏形)

  • 2017 年 9 ⽉份发布了 Spring 的最新版本 Spring 5.0 通⽤版(GA)  

Spring优势

整个 Spring 优势,传达出⼀个信号,Spring 是⼀个综合性,且有很强的思想性框架,每学习⼀ 天,就能体会到它的⼀些优势。 

  • 方便解耦,简化开发

通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进⾏控制,避免硬编码所造成的 过度程序耦合。⽤户也不必再为单例模式类、属性⽂件解析等这些很底层的需求编写代码,可以更 专注于上层的应⽤。

  • AOP编程的⽀持

通过Spring的AOP功能,⽅便进⾏⾯向切⾯的编程,许多不容易⽤传统OOP实现的功能可以通过 AOP轻松应付。

  • 声明式事务的⽀持

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

  • 方便程序的测试

可以⽤⾮容器依赖的编程⽅式进⾏⼏乎所有的测试⼯作,测试不再是昂贵的操作,⽽是随⼿可做的 事情。

  • 方便集成各种优秀框架

Spring可以降低各种框架的使⽤难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、 Quartz等)的直接⽀持。

  • 降低JavaEE API的使⽤难度

Spring对JavaEE API(如JDBC、JavaMail、远程调⽤等)进⾏了薄薄的封装层,使这些API的使⽤ 难度⼤为降低。

  • 源码是经典的 Java 学习范例

Spring的源代码设计精妙、结构清晰、匠⼼独⽤,处处体现着⼤师对Java设计模式灵活运⽤以及对 Java技术的⾼深造诣。它的源代码无疑是Java技术的最佳实践的范例。 

Spring组件

图片

上图中包含了 Spring 框架的所有模块,这些模块可以满足一切企业级应用开发的需求,在开发过程中可以根据需求有选择性地使用所需要的模块。下面分别对这些模块的作用进行简单介绍(并且结合SpringFramework5.x源码模块帮助你对应好各模块关系)。

Core Container(Spring的核心容器)

容器是Spring框架最核⼼的部分,它管理着Spring应⽤中 bean的创建、配置和管理。在该模块中,包括了Spring bean工厂,它为Spring提供了DI的功能。基于bean⼯⼚,我们还会发现有多种Spring应⽤上下⽂的实现。所有的Spring模块都构建于核心容器之上。 

  • Beans 模块:提供了框架的基础部分,包括控制反转和依赖注入。

  • Core 核心模块:封装了 Spring 框架的底层部分,包括资源访问、类型转换及一些常用工具类。

  • Context 上下文模块:建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。

  • SpEL 模块:提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。

对应的源码模块如下:

图片

Data Access/Integration(数据访问/集成)

数据访问/集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 模块,具体介绍如下。

  • JDBC 模块:提供了一个 JDBC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必需的事务控制,而且能享受到 Spring 管理事务的好处。

  • ORM 模块:提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。

  • OXM 模块:提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。

  • JMS 模块:指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

  • Transactions 事务模块:支持编程和声明式事务管理。

对应的源码模块如下:

图片

Web模块

Spring 的 Web 层包括 Web、Servlet、WebSocket 和 Webflux 组件,具体介绍如下。

  • Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。

  • Servlet 模块:提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。

  • WebSocket 模块:提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。

  • Webflux 模块:Spring WebFlux 是 Spring Framework 5.x中引入的新的响应式web框架。与Spring MVC不同,它不需要Servlet API,是完全异步且非阻塞的,并且通过Reactor项目实现了Reactive Streams规范。Spring WebFlux 用于创建基于事件循环执行模型的完全异步且非阻塞的应用程序。

此外Spring4.x中还有Portlet 模块,在Spring 5.x中已经移除

  • Portlet 模块:提供了在 Portlet 环境中使用 MVC 实现,类似 Web-Servlet 模块的功能。

对应的源码模块如下:

图片

AOP、Aspects、Instrumentation和Messaging

在 Core Container 之上是 AOP、Aspects 等模块,具体介绍如下:

  • AOP 模块:提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态地把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。

  • Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。

  • Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。

  • messaging 模块:Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。

  • jcl 模块:Spring 5.x中新增了日志框架集成的模块。

对应的源码模块如下:

图片

Test模块

Test 模块:Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。

包含Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient。

对应的源码模块如下:

图片

Spring框架如何应用

上文中,我们展示了Spring和Spring Framework的组件, 这里对于开发者来说有几个问题:

  1. 首先,对于Spring进阶,直接去看IOC和AOP,存在一个断层,所以需要整体上构建对Spring框架认知上进一步深入,这样才能构建知识体系。

  2. 其次,很多开发者入门都是从Spring Boot开始的,他对Spring整体框架底层,以及发展历史不是很了解;特别是对于一些老旧项目维护和底层bug分析没有全局观。

  3. 再者,Spring代表的是一种框架设计理念,需要全局上理解Spring Framework组件是如何配合工作的,需要理解它设计的初衷和未来趋势。

如下是官方在解释Spring框架的常用场景的图

图片

我加上一些注释后,是比较好理解的;引入这个图,重要的原因是为后面设计一个案例帮助你构建认知。

设计一个Spring的Hello World

结合上面的使用场景,设计一个查询用户的案例的两个需求,来看Spring框架帮我们简化了什么开发工作:

  1. 查询用户数据 - 来看DAO+POJO-> Service 的初始化和装载。

  2. 给所有Service的查询方法记录日志

创建一个Maven的Java项目

图片

引入Spring框架的POM依赖

   <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>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <version>1.16.22</version>            <scope>compile</scope>        </dependency>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.12</version>            <scope>compile</scope>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastjson</artifactId>            <version>1.2.25</version>            <scope>compile</scope>        </dependency>        <dependency>            <groupId>log4j</groupId>            <artifactId>log4j</artifactId>            <version>1.2.12</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>            <version>1.7.25</version>        </dependency>    </dependencies>

User对象​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 9:49 * @description */@Data@AllArgsConstructor@NoArgsConstructorpublic class User {
    /**     * user's name.     */    private String name;
    /**     * user's age.     */    private int age;
}

DAO 获取 POJO, UserDaoServiceImpl (mock 数据)​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 9:52 * @description */public class UserDaoImpl {
   public List<User> list(){       return Arrays.asList(new User("",18));   }}

增加daos.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.bcst.dao.xml.UserDaoImpl">        <!-- additional collaborators and configuration for this bean go here -->    </bean>    <!-- more bean definitions for data access objects go here -->
</beans>

业务层 UserService(调用DAO层)​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 9:52 * @description */public class UserService {
    private UserDaoImpl userDao;
    public void setUserDao(UserDaoImpl userDao) {        this.userDao = userDao;    }
    public List<User> list(){        return userDao.list();    }}

增加services.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="userService" class="com.bcst.service.xml.UserService">        <property name="userDao" ref="userDao"/>        <!-- additional collaborators and configuration for this bean go here -->    </bean>    <!-- more bean definitions for services go here --></beans>

拦截所有service中的方法,并输出记录​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 10:32 * @description */@Aspectpublic class LogAspect {
    @Around("execution(* com.bcst.service.*.*.*(..))")    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();        System.out.println("execute method:"+method.getName());        return joinPoint.proceed();    }}

增加aspects.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" xmlns:aop="http://www.springframework.org/schema/aop"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">    <context:component-scan base-package="com.bcst" />
    <aop:aspectj-autoproxy/>
    <bean id="logAspect" class="com.bcst.aspect.LogAspect">        <!-- configure properties of aspect here as normal -->    </bean>    <!-- more bean definitions for data access objects go here -->
</beans>

测试​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 9:58 * @description xml方式测试 */public class UserServiceTest {
    @Test    public void test1(){       // ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/daos.xml", "spring/services.xml");        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/daos.xml", "classpath:spring/services.xml","classpath:spring/aspects.xml");        UserService userService = applicationContext.getBean(UserService.class);        List<User> userList = userService.list();        System.out.println(JSON.toJSON(userList));    }}

Spring核心思想

上面的例子,体现了Spring IOC和AOP两个核心思想。

IOC和AOP不是spring提出的,在spring之前就已经存在,只不过更偏向于理论化,spring在技术层次把这两个思想做了⾮常好的实现(Java)  

控制反转-IOC

什么是IoC? 

IoC Inversion of Control (控制反转/反转控制),注意它是⼀个技术思想,不是⼀个技术实现。

描述的事情:Java开发领域对象的创建,管理的问题 。

传统开发方式:⽐如类A依赖于类B,往往会在类A中new⼀个B的对象 。

IoC思想下开发方式:我们不⽤⾃⼰去new对象了,⽽是由IoC容器(Spring框架)去帮助我们实例化对 象并且管理它,我们需要使⽤哪个对象,去问IoC容器要即可 。

我们丧失了⼀个权利(创建、管理对象的权利),得到了⼀个福利(不⽤考虑对象的创建、管理等⼀系列 事情)。

为什么叫做控制反转? 

控制:指的是对象创建(实例化、管理)的权利

反转:控制权交给外部环境了(spring框架、IoC容器)  

图片

IoC和DI的区别  

DI:Dependancy Injection(依赖注⼊)

怎么理解:IOC和DI描述的是同⼀件事情,只不过⻆度不⼀样罢了  

图片

案例分析

来看第一个需求:查询用户(service通过调用dao查询pojo),本质上如何创建User/Dao/Service等;

  • 如果没有Spring框架,我们需要自己创建User/Dao/Service等,比如:

UserDaoImpl userDao = new UserDaoImpl();UserService userService = new UserService();userService.setUserDao(userDao);List<User> userList = userService.list();
  • 有了Spring框架,可以将原有Bean的创建工作转给框架, 需要用时从Bean的容器中获取即可,这样便简化了开发工作

Bean的创建和使用分离了:​​​​​​​

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/daos.xml", "classpath:spring/services.xml","classpath:spring/aspects.xml");UserService userService = applicationContext.getBean(UserService.class);List<User> userList = userService.list();System.out.println(JSON.toJSON(userList));

图片

更进一步,你便能理解为何会有如下的知识点了:

  1. Spring框架管理这些Bean的创建工作,即由用户管理Bean转变为框架管理Bean,这个就叫控制反转 - Inversion of Control (IoC)

  2. Spring 框架托管创建的Bean放在哪里呢?这便是IoC Container;

  3. Spring 框架为了更好让用户配置Bean,必然会引入不同方式来配置Bean?这便是xml配置,Java配置,注解配置等支持

  4. Spring 框架既然接管了Bean的生成,必然需要管理整个Bean的生命周期等;

  5. 应用程序代码从Ioc Container中获取依赖的Bean,注入到应用程序中,这个过程叫 依赖注入(Dependency Injection,DI) ;所以说控制反转是通过依赖注入实现的,其实它们是同一个概念的不同角度描述。通俗来说就是IoC是设计思想,DI是实现方式

  6. 在依赖注入时,有哪些方式呢?这就是构造器方式,@Autowired, @Resource, @Qualifier... 同时Bean之间存在依赖(可能存在先后顺序问题,以及循环依赖问题等)

这边引入我们后续的相关文章:Spring基础 - Spring之控制反转(IOC)

面向切面 - AOP

什么是AOP

AOP: Aspect oriented Programming ⾯向切⾯编程/⾯向⽅⾯编程。

AOP是OOP的延续,从OOP说起

OOP三⼤特征:封装、继承和多态 。

OOP是⼀种垂直继承体系  。

图片

OOP编程思想可以解决⼤多数的代码重复问题,但是有⼀些情况是处理不了的,比如下⾯的在顶级⽗类 Animal中的多个⽅法中相同位置出现了重复代码,OOP就解决不了。

图片

横切逻辑代码 :

图片

横切逻辑代码存在什么问题:

  • 横切代码重复问题

  • 横切逻辑代码和业务代码混杂在⼀起,代码臃肿,维护不⽅便

AOP出场,AOP独辟蹊径提出横向抽取机制,将横切逻辑代码和业务逻辑代码分析  

图片

代码拆分容易,那么如何在不改变原有业务逻辑的情况下,悄⽆声息的把横切逻辑代码应⽤到原有的业 务逻辑中,达到和原来⼀样的效果,这个是⽐较难的 。

AOP在解决什么问题  

在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复 。

为什么叫做面向切面编程  

「切」:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以⾯向横切逻辑 。

「⾯」:横切逻辑代码往往要影响的是很多个⽅法,每⼀个⽅法都如同⼀个点,多个点构成⾯,有⼀个 ⾯的概念在⾥⾯ 。

案例分析

来看第二个需求:给Service所有方法调用添加日志(调用方法时),本质上是解耦问题;

  • 如果没有Spring框架,我们需要在每个service的方法中都添加记录日志的方法,比如:

public List<User> list(){        System.out.println("execute method  list");        return userDao.list();}

  • 有了Spring框架,通过@Aspect注解 定义了切面,这个切面中定义了拦截所有service中的方法,并记录日志;可以明显看到,框架将日志记录和业务需求的代码解耦了,不再是侵入式的了​​​​​​​

@Around("execution(* com.bcst.service.*.*.*(..))")    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();        System.out.println("execute method:"+method.getName());        return joinPoint.proceed();    }

更进一步,你便能理解为何会有如下的知识点了:

  • Spring 框架通过定义切面, 通过拦截切点实现了不同业务模块的解耦,这个就叫面向切面编程 - Aspect Oriented Programming (AOP)

  • 为什么@Aspect注解使用的是aspectj的jar包呢?这就引出了Aspect4J和Spring AOP的历史渊源,只有理解了Aspect4J和Spring的渊源才能理解有些注解上的兼容设计

    如何支持更多拦截方式来实现解耦, 以满足更多场景需求呢?这就是@Around, @Pointcut... 等的设计

    那么Spring框架又是如何实现AOP的呢?这就引入代理技术,分静态代理和动态代理,动态代理又包含JDK代理和CGLIB代理等

    这边引入我们后续的相关文章:Spring基础 - Spring之面向切面编程(AOP)

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

通过上述的框架介绍和例子,已经初步知道了Spring设计的两个大的要点:IOC和AOP;从框架的设计角度而言,更为重要的是简化开发,比如提供更为便捷的配置Bean的方式,直至0配置(即约定大于配置)。这里我将通过Spring历史版本的发展,来帮你理解Spring框架是如何逐步简化开发的。

Java配置方式改造

在上文的例子中, 通过xml配置方式实现的,这种方式实际上比较麻烦;我通过Java配置进行改造:

User,UserDaoImpl, UserService,LogAspect不用改,将原通过.xml配置转换为Java配置​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 11:06 * @description */@Configuration@EnableAspectJAutoProxypublic class BeanConfig {
    @Bean(value = "userDao")    public UserDaoImpl userDao(){        return new UserDaoImpl();    }
    @Bean(value = "userService")    public UserService userService(){        UserService userService = new UserService();        userService.setUserDao(userDao());        return userService;    }
    @Bean(value = "logAspect")    public LogAspect logAspect(){        return new LogAspect();    }
}

测试​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 11:10 * @description java配置方式改造 */public class UserServiceTest {
    @Test    public void test1(){        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);        UserService userService = applicationContext.getBean(UserService.class);        List<User> userList = userService.list();        System.out.println(JSON.toJSON(userList));    }}

注解配置方式改造

更进一步,Java 5开始提供注解支持,Spring 2.5 开始完全支持基于注解的配置并且也支持JSR250 注解。在Spring后续的版本发展倾向于通过注解和Java配置结合使用

BeanConfig 不再需要Java配置

/** * @description  * @author  * @date 2023/8/31 0031 11:06 * @description */@Configuration@EnableAspectJAutoProxypublic class BeanConfig {}

UserDaoImpl 增加了 @Repository注解​​​​​​​​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 9:52 * @description 注解配置改造 */@Repositorypublic class UserDaoImpl {
   public List<User> list(){       return Arrays.asList(new User("",18));   }}

UserService 增加了@Service 注解,并通过@Autowired注入userDao​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 9:52 * @description 注解配置改造 */@Servicepublic class UserService {
    @Autowired    private UserDaoImpl userDao;
    public List<User> list(){        return userDao.list();    }}

LogAspect增加@Component注解​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 10:32 * @description 注解改造 */@Aspect@Componentpublic class LogAspect {
    @Around("execution(* com.bcst.service.*.*.*(..))")    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();        System.out.println("注解方式 execute method:"+method.getName());        return joinPoint.proceed();    }}

测试​​​​​​​

/** * @description  * @author  * @date 2023/8/31 0031 11:10 * @description 注解配置方式改造 */public class UserServiceTest {
    @Test    public void test1(){        ApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.bcst");        UserService userService = applicationContext.getBean(UserService.class);        List<User> userList = userService.list();        System.out.println(JSON.toJSON(userList));    }}
Spring全面讲解(无比详细) 希望大家共同进步,有兴趣的可以互相加个关注。 阅读详情

相关推荐

Spring安装配置教程

1.Spring简介 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。 2002 Rod Johnon &lt;Ex...

ly's Blog 5061

Spring 最全入门教程详解

Spring 基础框架,可以视为Spring 基础设施,基本上任何其他 Spring 项目都是以 SpringFramework 为基础的。Spring 5 的模块结构图: lOC: Inversion of Control,翻译过来是反转控制。把对象创建和对象之间的调用过程,交给 Spring 进行管理Spring 的IOC 容器就是IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建 bean 之前,首先需要创建IOC容器。Spring 提供了IOC容器的两种实现方式:

lucky_fd的博客 1万+

深入探索Spring框架的模块组成

通过本文的探讨,我们深入理解了Spring框架的各个模块及其功能。从Spring Core的依赖注入,到Spring Context的国际化支持,再到Spring AOP的面向切面编程,Spring DAO的数据访问支持,Spring ORM的ORM集成,以及Spring Web的Web开发支持,Spring框架提供了丰富的功能,帮助开发者构建高效、可靠的Java应用程序。无论你是初学者还是有经验的开发者,理解Spring框架的模块组成都将帮助你更好地利用这一强大的工具,构建高效、可靠的Java应用程序。

xycxycooo的博客 137

Spring 入门教程

Spring 入门教程 1、参考资料 尚硅谷-Spring5框架最新版教程(idea版) 雷丰阳spring、springmvc、mybatis、spring一站式学习 项目地址:oneby1314/spring-learn 2、Spring 概述 2.1、Spring 框架概述 Spring 是轻量级的开源的 JavaEE 框架 Spring 为简化企业级开发而生,使用Spring,Javabean就可以实现很多以前要靠EJB才能实现的功能 Spring 有两个核心部分:IOC 和 AOP

Oneby的博客 1万+

最新版 Akamai 逆向 风控破解

经过测试,捷星 jetstar.com,德州仪器 ti.com,w6 wizzair.com,还有一些航空公司的都是可以实现一个并发的有需要的可以。

m0_72605044的博客 6627

Day2 十分钟带你解决逆向中对称加密算法 (RC4)

在密码学中,RC4(来自Rivest Cipher 4的缩写)是一种串流加密算法,密钥长度可变。他加密解密使用相同的密钥,因此也被称为“流加密算法”。RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。由于异或运算的对合性,RC4加密解密使用同一套算法。

m0_73779708的博客 1289

Spring框架组成

Spring框架技术 Spring是什么 轻量级框架 发布仅单一jar包 非侵入性 容器 管理对象的生命周期,控制对象的创建方式 IOC/DI(控制反转,依赖注入) 配置及管理对象的依赖关系 AOP(面向切面编程) OOP以及IOC的补充 通用解决方案及最佳实践 Spring是一个开源的JavaEE框架,可以简化企业应用的开发的复杂性。 Spring框架组成...

呼卓宇的博客 2381

基于dify平台批量分析excel格式信息

如何以表格形式批量输入一些信息,然后让大模型以对话应用形式逐条进行推理分析?请逐行分析以下数据,给出推理结果:{{input}}这里提供一个分步解决方案,结合。

knightissocool的博客 8013

Spring和Spring框架组成

Spring是什么?它是怎么诞生的?有哪些主要的组件和核心功能呢?本文通过这几个问题帮助你构筑Spring和Spring Framework的整体认知。首先,Spring是什么?它是怎么诞生的?它的诞生是为了解决什么问题?

埃泽漫笔 990

Yocto下载加速秘籍:用清华镜像+PREMIRRORS配置让构建速度翻倍

本文详细解析了如何通过配置Yocto的PREMIRRORS优先级策略,并利用清华大学等国内镜像源,显著加速构建过程中的源码下载。文章提供了具体的配置示例和验证方法,帮助开发者解决网络瓶颈,实现构建速度翻倍,提升开发效率。

game4的博客 277

onnxruntime-gpu版本选择与CUDA环境配置实战指南

本文是onnxruntime-gpu版本选择与CUDA环境配置的实战指南。针对AI模型部署中常见的GPU无法调用问题,核心在于确保onnxruntime-gpu版本与系统CUDA Toolkit版本严格匹配。文章详细讲解了如何精准确定CUDA版本、查找官方对应关系、执行正确安装命令,并通过完整测试脚本验证GPU是否成功启用,最后提供了常见问题排查与生产环境调优建议。

weixin_29164091的博客 525

Spring 框架组成

回到首页☞ Spring 由7大模块组成 Core模块 核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 Spring 上下文: Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下...

JDIT的博客 542

Pre-suite 开发之MFi功能搭建

Pre-suite 固件中只有带无线硬件的Ezairo 7160sl才具备无线通信能力,其无线功能包括标准BLE 5.2 低功耗蓝牙功能以及非标准的低功耗无线音频流功能。Ezairo 7160sl 支持3种低功耗无线音频流协议:来自APPLE的MFi,来自Google的ASHA以及来自onsemi的remote mic。其中MFi音频流走的G.722编码的Mode1,速率为64kbps;而非MFi音频流走的G.722的Mode3,速率为48kbps.

SnowYang2017的博客 1506

Spring基础 - Spring和Spring框架组成

Spring基础 - Spring和Spring框架组成 Spring 特性 非侵入式:基于Spring 开发的应用中的对象可以不依赖于Spring 的API 控制反转:IOC,对象的创建权交给Spring去创建 依赖注入:依赖的对象不需要手动调用set方法去设置,而是通过配置赋值 面向切面编程:AOP 容器:Spring是一个容器,包含并且管理应用对象的生命周期 组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用,在Spring中可以使用XML和JAVA注解组合这些对象 一站式:在IOC和

qq_44653420的博客 634

矿石生成(1)

这个提供了标准化的矿石放置配置模板简化了常见和稀有矿石的配置过程遵循了Minecraft原版的世界生成模式提高了代码的可读性和可维护性通过使用这个类,模组开发者可以更轻松地配置矿石的生成规则,而不需要每次都手动编写完整的放置修饰符列表。这种设计模式在原版Minecraft和其他大型模组中也很常见,是一种良好的编程实践。// 导入语句...// 字段和方法...包声明表明这个类位于luckymod模组的WorldGen包中,专门处理世界生成相关配置。导入语句。

qq_24992377的博客 137

8、使用 TPCx - HCI 基准测试表征 HCI 集群的性能和弹性

本文详细介绍了 TPCx - HCI 基准测试,用于衡量超融合基础设施(HCI)集群的性能、稳定性和扩展性。TPCx - HCI 扩展了 TPCx - V 的理念,通过 Tile 架构和弹性特性,全面评估硬件、虚拟化、存储和网络组件的表现。文章还通过多个实验场景分析了负载均衡、数据布局和重新同步策略对性能的影响,并提出了部署和优化 HCI 集群的建议。

sun99的博客 180

spring框架学习2 spring的组成及拓展

technologyleader的专栏 132

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Spring框架与架构组成

Spring解决原生web开发中存在的以下问题 传统Web开发存在硬编码所造成的过度程序耦合(例如:Service中拥有Dao属性对象)。 部分Java EE API较为复杂,使用效率低(例如:JDBC开发步骤)。 侵入性强,移植性差(例如:DAO实现的更换,从Connection到SqlSession)。 概念 Spring是一个项目管理框架,同时也是一套Java EE解决方案。 Spring是众多优秀设计模式的组合(工厂、单例、代理、适配器、包装器、观察者、模板、策略)。

小白的记录 344

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

关于Spring框架有哪几部分组成?

Spring框架有七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,主要功能表现如下: Spring 核心容器(Core):提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,她是工厂模式的实现。BeanFactory使用控制反转(Ioc)模式将应用程序的配置和依赖性规范与实际的应用代码程序分开。 Spring AOP:通过配置管理特性,Spring AOP模块直接面向方面的编程功能集成到了Spring框架中,所以可以很容易的使Spring框架

你难忘的 1168

Spring 学习手札(一)Spring框架的组成

本系列主要源于对网络、书籍(以>为主)的摘抄,有感之处加上自己的注释。 Spring提供的模块: 1、核心容器 :包含BeanFactory,DI依赖的基础。使Spring成为容器。 2、上下文模块 Application Context:支持很多企业级服务,扩展了BeanFactory,使Spring成为框架。 3、AOP模块:为Spring应用开发切面的基础,与DI一样,支

胡同里的庇护所(Pirate Leo's Shelter) 2066

Spring模块组成(框架组成、整体架构、体系架构、体系结构)

Spring的核心容器是其他模块建立的基础,有spring-core、spring-beans、spring-context、spring-context-support和spring-expression(Spring表达式语言)等模块组成。:提供了基本的Web开发集成功能,包括使用Servlet监听器初始化一个IOC容器以及Web应用上下文,自动载入WebApplicationContext特性的类,Struts集成类、文件上传的支持类、Filter类和大量辅助工具类。

2501_90226133的博客 818

Spring框架的组成及使用spring的好处

Spring框架有七个模块组成,这七个模块或(组件)均可以单独存在,也可以与其他一个或多个模块联合使用,具体分析如下: 1. Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。 2.Spring

yebaihedeyangguang的博客 960

Spring框架系列(1) - Spring和Spring框架组成

要谈Spring的历史,就要先谈J2EE。J2EE应用程序的广泛实现是在1999年和2000年开始的,它的出现带来了诸如事务管理之类的核心中间层概念的标准化,但是在实践中并没有获得绝对的成功,因为开发效率,开发难度和实际的性能都令人失望。曾经使用过EJB开发JAVA EE应用的人,一定知道,在EJB开始的学习和应用非常的艰苦,很多东西都不能一下子就很容易的理解。EJB要严格地实现各种不同类型的接口,类似的或者重复的代码大量存在。而配置也是复杂和单调,同样使用JNDI进行对象查找的代码也是单调而枯燥。虽然有一

pdai的博客 284

Spring框架的组成结构

Spring Framework Runtime(Spring框架运行时) Data Access/Integration(数据访问和集成) JDBC - Java Database Connectivity(Java数据库连接) Java数据库连接——JDBC基础知识(操作数据库:增删改查) ORM - 0bject/Relational Mapping(对象 - 关系映射) OR...

Kant2048的博客 1802

组成Spring框架的7个模块

北斗草堂记之组成Spring框架的7个模块         本文章为读书笔记,文献参考《Spring in Action 第二版 中文版》。         Spring框架由7个模块组成,这七个模块为我们提供了企业级应用所需要的一切,我们可以自由选择使用其中的模块。事实上Spring提供了与其他框架和库的集成点,因此我们可以自由使用。但是《Spring in Action 第二版 中文版》中

遥望星河,飞向太空 3663
上一篇: Java程序员应该如何规划未来走向?应该何去何从????
下一篇: 【重写SpringFramework】从零开始构建Spring框架:序言
JavaASDN
博客等级 码龄2年 236粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值