从零开始学习Spring Framework 5

点击蓝字java

关注咱们面试


Hi~新朋友,记得点蓝字关注咱们哟spring


1. Spring


1.1 简介

  • Spring框架是因为软件开发的复杂性而建立的, 简化企业开发的复杂性,可适用于任何JAVA应用微信

  • Spring最大的特色:①控制反转 ②面向切面网络

  • SSM:  Spring+ Spring MVC + Mybatis架构

  • Spring framework:  5.3.3 RELEASE, https://spring.io/projects/spring-frameworkapp

  • Spring中文文档 (4.3.21)框架

    https://www.docs4dev.com/docs/zh/spring-framework/4.3.21.RELEASE/referenceide


1.2 特色:

  • 是一个开源的免费的框架svg

  • 是一个轻量级的、非侵入式的框架

  • 控制反转 IOC 和 面向切面AOP

  • 支持事务以及框架的整合


1.3 架构体系

1.4 拓展

Spring Boot是构建全部基于spring应用程序的起点,是快速开发的脚手架。开发必备!面试必问!

Spring Cloud 是基于spring boot实现的。


2 .  IOC 思想推导


UserDao 接口 :数据访问层,具体到对某个表或实体进行crud,

UserDaoImpl 实现类 : 编写具体的对数据操做的具体crud的代码

UserService 业务接口 :业务层,根据具体的业务逻辑来访问不一样的DAO层,须要对事务进行控制

UserServiceImpl 实现类 :编写具体的业务代码


(1) UserDao.java

public interface UserDao {
  public void getUser();
}


(2) UserAssetDaoImpl.java

public class UserAssetDaoImpl implements UserDao{

  @Override
  public void getUser() {
      System.out.println("get User Asset from DB");
  }
}


(3) UserInfoDaoImpl.java

public class UserInfoDaoImpl implements UserDao {

  @Override
  public void getUser() {
      System.out.println("get USER INFO from DB");
  }
}


(4) UserService.java

public interface UserService {
    public void getUser();
}


(5) UserServiceImpl.java

public class UserServiceImpl implements UserService {

  // service calls dao
  private UserDao info = new UserInfoDaoImpl();

  @Override
  public void getUser() {
      userDao.getUser();
  }


(6) MyTest.java

public static void main(String[] args) {

  //用户实际调用的业务层,而不接触DAO层
  UserServiceImpl ui = new UserServiceImpl();
ui.getUser();
}


当前外层调用的是UserInfoDaoImpl的业务逻辑,若是想要调用UserAssetDaoImpl,就要修改业务层代码。

在原有的业务里,须要根据用户需求频繁改动原有代码,代价比较大。

可是利用set进行动态绑定DAO,实现业务动态查询,其实质发生革命性的变化!

优化后的UserServiceImpl.java

public class UserServiceImpl implements UserService {

  private UserDao userDao;

  // 利用set进行动态绑定DAO,实现业务动态查询
  public void setUserDao(UserDao userDao) {
      this.userDao = userDao;
  }

  @Override
  public void getUser() {
      userDao.getUser();
  }
}

MyTest.java

UserServiceImpl ui = new UserServiceImpl();
  ui.setUserDao(new UserHealthDaoImpl());
  ui.getUser();
  • 前者是外层控制内层,只要外层想改需求,内层必须修改大量代码。控制权在外层!

  • 后者是内层控制外层,提供多个可选的接口,供外层调用。控制权在内层!

这种思想本质上就是控制反转(Inversion of Control)的核心——控制权反转,下降的系统的耦合性。


3. IOC本质


控制反转是一种设计思想,DI ( Dependency Injection) 是实现IOC的一种手段。对象的建立不是彻底硬编码在程序中,而是经过注入依赖的方式去动态建立对象。

IOC官方说明:

 It is a process whereby objects define their dependencies (that is, the other objects they work with) only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method. The container then injects those dependencies when it creates the bean.

在此过程当中,对象仅经过构造函数参数,工厂方法的参数或在对象实例从工厂方法构造或返回后设置的属性来定义其依赖关系,即与它们一块儿使用的其余对象。而后,容器在建立 Bean 时“注入”那些依赖项。

接口org.springframework.context.ApplicationContext表明 Spring IoC 容器,并负责实例化,配置和组装上述 bean。

容器经过读取配置元数据来获取有关要实例化,配置和组装哪些对象的指令。配置元数据以 XML,Java 注解或 Java 代码表示。


4. IOC Demo


User.java

package com.fullstack.pojo;

/**
* @author Horace
*/
public class User {
   private String name;
   private int age;
 
   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public int getAge() {
       return age;
  }

   public void setAge(int age) {
       this.age = age;
  }

   @Override
   public String toString() {
       return "User{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
  }
}

Beans.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">
<!--配置元数据-->

   <!--spring中建立的对象统称为bean-->
   <bean id="user" class="com.fullstack.pojo.User">
       <property name="name" value="Horace"/>
       <property name="age"  value="30"/>
   </bean>
   <!-- more bean definitions go here -->

</beans>


Test.java

import com.fullstack.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {

   public static void main(String[] args) {
       /**
        * 实例化容器
        */

       // 获取 spring 上下文对象
       ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
       User user = (User) context.getBean("user");
       System.out.println(user.toString());

  }
}

思考:

Q1: 没有任何new的代码,User 是谁建立出来的?

A1: Spring

Q2: User中的属性是如何赋值的?

A2: Spring 中xml配置, 即spring 容器设置的


这个过程就是控制反转。

传统上对象是程序显式地主动地new出来   <——> spring 建立管理对象,动态地绑定所须要注入的对象

要实现不一样的操做,只须要再xml配置生成对应的Bean便可直接使用。


总之, 对象由spring来建立,管理和装配


Spring 5 系列文章还在更新...

参考:

https://www.bilibili.com/video/BV1WE411d7Dv?p=5&spm_id_from=pageDriver 

《碰见狂神说》


声明:本文归 “Java全栈” 版权全部,如需转载请联系。文章封面图来源于网络,为非商业用途使用,若有侵权联系删除。


Java全栈开发
一个软实力硬技术同步成长的公众号
长按识别二维码,关注公众号


本文分享自微信公众号 - Java全栈学习(taoquanquansh)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索