Spring概览——最佳入门实践

1、Spring Framework

Spring 基础框架,可以视为 Spring 基础设施,基本上任何其他 Spring 项目都是以 Spring Framework 为基础的。

1.1、Spring Framework特性

建议新手先看完的最佳实践,再回头看这一段。

非侵入式:使用 Spring Framework 开发应用程序时,Spring 对应用程序本身的结构影响非常 小。对领域模型可以做到零污染;对功能性组件也只需要使用几个简单的注解进行标记,完全不会 破坏原有结构,反而能将组件结构进一步简化。这就使得基于 Spring Framework 开发应用程序 时结构清晰、简洁优雅。

控制反转:IOC——Inversion of Control,翻转资源获取方向。把自己创建资源、向环境索取资源 变成环境将资源准备好,我们享受资源注入。 面向切面编程:AOP——Aspect Oriented Programming,在不修改源代码的基础上增强代码功 能。 容器:Spring IOC 是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化 的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发 效率。

组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML 和 Java 注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭 建超大型复杂应用系统。

声明式:很多以前需要编写代码才能实现的功能,现在只需要声明需求即可由框架代为实现。

一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且 Spring 旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在 Spring Framework 的基 础上全部使用 Spring 来实现。

1.2、Spring Framework五大功能模块

功能模块功能介绍
Core Container核心容器,在 Spring 环境下使用任何功能都必须基于 IOC 容器。
AOP&Aspects面向切面编程
Testing提供了对 junit 或 TestNG 测试框架的整合。
Data Access/Integration提供了对数据访问/集成的功能。
Spring MVC提供了面向Web应用程序的集成功能。

2、IOC

2.1 IOC容器

1、IOC思想

IOC:Inversion of Control,翻译过来是反转控制。

传统程序设计中,通常由调用者来决定被调用者的生命周期,这包括何时创建实例、消亡、使用等。

IOC思想中,被调者的上述控制工作,交给了Spring提供给我们的容器,此行为称之为 控制反转。

DI :Dependcy injection  依赖注入。 是Spring框架的核心,也是实现IOC的重要手段。

Spring的DI有两种方式,构造注入 (依赖无参构造器)和设置注入(使用Getter Setter)

2、IOC在spring中的实现:

Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件 叫做 bean。在创建 bean 之前,首先需要创建 IOC 容器。Spring 提供了 IOC 容器的两种实现方式:

①BeanFactory

这是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。

②ApplicationContext

BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用 ApplicationContext 而不是底层的 BeanFactory。

我们查看官网API 发现 BeanFactory接口下,有很多子接口和实现类。

 随意列举几个常用的:

 

下面我们直接开练:

3、最佳实践

1、练习1:基于XML 管理Bean

1) 创建Maven工程

2)导入相关依赖

我们从spring官网 或maven repository上 可以看到,关于 spring  的 依赖,有很多,到底该用哪一个?

 

对于spring项目,我们首选 Spring-context ,我们也可以通过它的描述看到,此处 我们选择较为稳定的发行版:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.22.RELEASE</version>
</dependency>

完整配置文件,我会放在github上

为什么不选其他的呢?

我们看到repository上有个编译依赖表:

 再看看自己的maven工程依赖:

 对于spring工程来说,spring-contex 已经包含了大多数我们需要使用的spring相关依赖。

3)创建HelloWord

4)创建spring 配置文件

        

 

文件名默认为 applicationContext.xml 配置在当前项目的资源路径下  。

package com.alex.spring.Demo;

/**
 * @Title:
 * @Description: Spring Demo
 * @author: Alex
 * @Version:
 * @date 2023-01-29-22:31
 */
public class HelloWorld {

    public void sayHello(){
        System.out.println("hello world!!!");
    }
}

5)在spring 配置文件中配置bean

<?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="HelloWorld" class="com.alex.spring.Demo.HelloWorld"></bean>
</beans>

6)创建测试类

package com.alex.spring.Demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Title:
 * @Description: Test Bean 
 * @author: Alex
 * @Version:
 * @date 2023-01-29-22:40
 */
public class HelloWorldTest {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        //获取实例 :容器已经帮我们创建实例
        HelloWorld he = (HelloWorld)context.getBean("HelloWorld");
        he.sayHello();
    }
}

 

7)思路图:

 

8)注意事项:

Spring 底层默认通过反射技术调用组件类的无参构造器来创建组件对象,这一点需要注意。如果在需要 无参构造器时,没有无参构造器,则会抛出下面的异常:

前面我们说过,DI的主要方式就是 构造器注入,利用无参构造器。

如果我们故意丢掉无参构造器会怎样?

 结果是这样:

警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'HelloWorld' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alex.spring.Demo.HelloWorld]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.alex.spring.Demo.HelloWorld.<init>()    没有找到该类的 类的初始化函数,缺少默认的空参构造器
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'HelloWorld' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alex.spring.Demo.HelloWorld]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.alex.spring.Demo.HelloWorld.<init>()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值