Spring基础

1.Spring简介

spring的full-stack全栈是什么意思?

就是在每一层都有对应的解决方案,如web层有对应的spring MVC,在dao层有JDBC Template

1.1 Spring的思想

任何实际的应用程序都是由很多组件组成的,每个组件负责整个应用功能的一部分,这些组件需要与其他的应用元素进行协调以完成自己的任务。当应用程序运行时,需要以某种方式创建并引入这些组件

Spring的核心是提供了一个容器(container),通常称为Spring应用上下文(Spring application context),它们会创建和管理应用组件。这些组件也可以称为bean会在Spring应用上下文中装配在一起,从而形成一个完整的应用程序。这就像砖块、砂浆、木材、管道和电线组合在一起,形成一栋房子似的。

将bean装配在一起的行为是通过一种基于依赖注入(dependency injection DI)的模式实现的。此时,组件不会再去创建它所依赖的组件并管理它们的生命周期,使用依赖注入的应用依赖于单独的实体(容器)来创建和维护所有的组件,并将其注入到需要它们的bean中。通常,这是通过构造器参数和属性访问方法来实现的。

举例来说,假设在应⽤的众多组件中,有两个是我们需要处理的:库存服务(⽤来获取库存⽔平)和商品服务(⽤来提供基本的商品信息)。商品服务需要依赖于库存服务,这样它才能提供商品的完整信息。

图1.1阐述这些bean和Spring应⽤上下⽂之间的关系。

 

1.2 基于xml的配置方式

在核⼼容器之上,Spring及其⼀系列的相关库提供了Web框架、各种持久化可选⽅案、安全框架、与其他系统集成、运⾏时监控、微服务⽀持、反应式编程以及众多现代应⽤开发所需的特性。

在历史上,指导Spring应⽤上下⽂将bean装配在⼀起的⽅式是使⽤⼀个或多个XML⽂件(描述各个组件以及它们与其他组件的关联关系)。

例如,如下的XML描述了两个bean,也就是InventoryService bean和ProductService bean,并且通过构造器参数将InventoryService装配到了ProductService中:

1.3 基于Java的配置方式

但是,在最近的Spring版本中,基于Java的配置更为常⻅。如下基于Java的配置类是与XML配置等价的:

 

@Configuration注解会告知Spring这是⼀个配置类,会为Spring应⽤上下⽂提供bean。这个配置类的⽅法使⽤@Bean注解进⾏了标注,表明这些⽅法所返回的对象会以bean的形式添加到Spring的应⽤上下⽂中(默认情况下,这些bean所对应的bean ID与定义它们的⽅法名称是相同的)。

相对于基于XML的配置⽅式,基于Java的配置会带来多项额外的收益,包括更强的类型安全性以及更好的重构能⼒。即便如此,不管是使⽤Java还是使⽤XML的显式配置,只有当Spring不能进⾏⾃动配置的时候才是必要的

1.4 自动配置

在Spring技术中,⾃动配置起源于所谓的⾃动装配(autowiring)和组件扫描(component scanning)。借助组件扫描技术,Spring能够⾃动发现应⽤类路径下的组件,并将它们创建成Spring应⽤上下⽂中的bean。借助⾃动装配技术,Spring能够⾃动为组件注⼊它们所依赖的其他bean。

最近,随着Spring Boot的引⼊,⾃动配置的能⼒已经远远超出了组件扫描和⾃动装配。Spring Boot是Spring框架的扩展,提供了很多增强⽣产效率的⽅法。最为⼤家所熟知的增强⽅法就是⾃动配置(autoconfiguration),Spring Boot能够基于类路径中的条⽬、环境变量和其他因素合理猜测需要配置的组件并将它们装配在⼀起。

我⾮常愿意为你展现⼀些关于⾃动配置的⽰例代码,但是我做不到。⾃动配置就像⻛⼀样,你可以看到它的效果,但是我找不到代码指给你说,“看!这就是⾃动配置的样例!”事情发⽣了,组件启⽤了,功能也提供了,但是不⽤编写任何代码。没有代码就是⾃动装配的本质,也是它如此美妙的原因所在。Spring Boot⼤幅度减少了构建应⽤所需的显式配置的数量(不管是XML配置还是Java配置)。实际上,当完成本章的样例时,我们会有⼀个可运⾏的Spring应⽤,该应⽤只有⼀⾏Spring配置代码。

Spring Boot极⼤地改善了Spring的开发,因此很难想象在没有它的情况下,如何开发Spring应⽤。因此,我们会将Spring和Spring Boot当成⼀回事。我们会尽可能多地使⽤Spring Boot,只有在必要的时候才使⽤显式配置。因为Spring XML配置是⼀种过时的⽅式,所以我们主要关注Spring基于Java的配置。

 2.Spring优势

Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理
Spring工厂是用于生成bean

 3.Spring体系结构

 

 4.Spring开发步骤

 这是之前的开发,现在是想借助spring框架完成解耦合

spring框架的作用就是读取这个配置文件,从而获得全包名,帮助创建对象的。

 

步骤:

(1)导入Spring开发的基本包坐标。导入框架对应的jar包,这里是maven,就是导入spring对应的maven坐标

(2)编写Dao接口和实现类。要获得UserDaoImpl对象,因此要编写UserDao的接口和UserDaoImpl的实现

(3)创建Spring核心配置文件。创建xml配置文件

(4)在Spring配置文件中配置UserDaoImpl。将UserDaoImpl的全包名配置到xml配置文件中

(5)使用Spring的API获得Bean实例。通过这句话UserDao userDao = Spring客户端.getBean(id标识);把标识传进去,最终返回一个对象,这样的话,就去找Spring容器去要对象,而不是自己去new对象的。

 通过这五步可以完成解耦

后面如果替换成其他对象,直接在配置文件中修改就行了。

下面按照上面的五个步骤实现一下:

(0)创建maven工程

这个可以参考我的这一篇博客:https://www.cnblogs.com/GumpYan/p/13711056.html

(1)在pom.xml中导入坐标

 (2)编写Dao接口和实现类

 UserDao.java(接口)

package com.company.dao;

public interface UserDao {
    public void save();
}

UserDaoImpl.java(实现类)

package com.company.dao.impl;

import com.company.dao.UserDao;

public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("save running...");
    }
}

(3)创建Spring核心配置文件。创建xml配置文件,applicationContext.xml

 如果没有Spring config,可以看这三篇文档解决:

https://blog.csdn.net/Javaytp/article/details/79637101#commentBox

https://www.cnblogs.com/iceywu/p/12366871.html

https://blog.csdn.net/wt_better/article/details/78162332

注意:一定要刷新项目工程

 (4)在Spring配置文件中配置UserDaoImpl。将UserDaoImpl的全包名配置到xml配置文件中

 

 (5)使用Spring的API获得Bean实例

package com.company.demo;

import com.company.dao.UserDao;

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

public class UserDaoDemo {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        userDao.save();
    }
}

  打印出来结果:

 

posted @ 2020-09-22 20:10  GumpYan  阅读(153)  评论(0编辑  收藏  举报