原创

Spring笔记一(概述)

温馨提示:
本文最后更新于 2023年11月30日,已超过 519 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

一.Spring简介

  • Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。
  • Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。
  • Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。

百度百科简介

二.spring特点

  • 非侵入式: 使用 Spring Framework 开发应用程序时,Spring 对应用程序本身的结构影响非常小。对领域模型可以做到零污染,对功能性组件也只需要使用几个简单的注解进行标记,完全不会破坏原有结构,反而能将组件结构进一步简化。这就使得基于 Spring Framework 开发应用程序时结构清晰、简洁优雅。
  • 控制反转: IOC--Inversion of Control,翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。
  • 面向切面编程: AOP--Aspect Oriented Programming,在不修改源代码的基础上增强代码功能.
  • 容器: SpringIOC 是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率
  • 组件化: Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML和 Java 注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭建超大型复杂应用系统.
  • 一站式:在IOC 和AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且 Spring 旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在 Spring Framework 的基础上全部使用 Spring 来实现。

三.spring模块组成

  • dependency injection: 依赖注入
  • events:事件
  • resources:资源
  • i18n:国际化
  • validation:数据校验
  • data binding:数据绑定
  • type conversion:类型转换
  • SpEL:表达式
  • AOP:面向切面

四.Spring6环境要求

JDK17+ maven3.6+

五. 入门

5.1 项目创建

使用jdk17创建一个maven父项目,再创建一个子项目。

在子项目中引入spring6依赖和test依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.12</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.7.2</version>
        </dependency>

5.2 测试

创建用户类

public class User {

    //无参构造
    public User(){
        System.out.println("无参构造对象。。。。。。。。。。。。。。");
    }

    //测试方法
    public void testUser() {
        System.out.println("testUser.......................");
    }

}

在根路径下创建xml配置文件(bean.xml),在xml文件中加入user配置,然后即可在spring中使用user对象

<?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配置文件,通过spring来管理对象的生命周期-->
    <bean id="user" class="com.wu.learn.user.User"></bean>
</beans>

测试

public class TestUser {

    @Test
    public void testUser(){
        //spring上下文,指定根路径下的xml文件生成
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        //从上下文中获取user对象
        User user = (User) context.getBean("user");

        //使用user对象
        user.testUser();
    }

}

5.3 总结

在使用ApplicationContext时,整体流程

  • 加载bean.xml文件
  • 解析xml文件
  • 获取xml文件中bean标签的id和class值
  • 通过反射进行对象创建(大致方式如下)
    @Test
    public void clazzUser() throws Exception{
        Class<?> aClass = Class.forName("com.wu.learn.user.User");
        User user = (User) aClass.getDeclaredConstructor().newInstance();
        user.testUser();
    }
  • 创建好的对象放到了spring容器中(就是一个map),DefaultListableBeanFactory
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
正文到此结束