Spring

1、什么是框架?

人话就是:方便干活,架子有了,直接拿来用就完事了。

spring,springmvc,mybatis三大开框架

2、架构的演变过程

单一应用架构

垂直应用架构

分布式服务架构

流动计算架构

Doubou官网

Spring官网

官网地址:https://spring.io/projects/spring-framework#overview

压缩包下载地址:https://repo.spring.io/release/org/springframework/spring/

源码地址:https://github.com/spring-projects/spring-framework

核心解释

​spring是一个IOCAOP的容器框架。

​IOC:控制反转

AOP:面向切面编程

容器:包含并管理应用对象的生命周期,就好比用桶装水一样,spring就是桶,而对象就是水

为什么要引入IOC

创建一个普通的java项目,完成下述功能

UserDao.java

package com.yao.dao;

public interface UserDao {
public void getUser();
}

UserDaoImpl.java

package com.yao.dao.impl;

import com.yao.dao.UserDao;

public class UserDaoImpl  implements UserDao {
@Override
public void getUser() {
System.out.println("获取用户数据");
}
}

UserService.java

package com.yao.service;

public interface UserService {
public void getUser();
}

UserServiceImpl.java

package com.yao.service.impl;

import com.yao.dao.UserDao;
import com.yao.dao.impl.UserDaoImpl;
import com.yao.dao.impl.UserDaoMysqlImpl;
import com.yao.service.UserService; public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override
public void getUser() {
userDao.getUser();
}
}

SpringDemoTest.java

package com.yao.test;

import com.yao.service.UserService;
import com.yao.service.impl.UserServiceImpl; public class SpringDemoTest {
public static void main(String[] args) {
UserService service = new UserServiceImpl();
service.getUser();
}
}

在之前的代码编写过程中,我们都是这么完成我们的功能的,但是如果增加一个UserDao的实现类呢?

UserDaoMysqlImpl.java

package com.yao.dao.impl;

import com.yao.dao.UserDao;

public class UserDaoMysqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println("mysql");
}
}

如果我们想要使用mysql的话,那么就必须要修改UserServiceImpl.java的代码:

package com.yao.service.impl;

import com.yao.dao.UserDao;
import com.yao.dao.impl.UserDaoImpl;
import com.yao.dao.impl.UserDaoMysqlImpl;
import com.yao.service.UserService; public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override
public void getUser() {
userDao.getUser();
}
}

但是如果我们再增加一个oracle的类呢?

UserDaoOracleImpl.java

package com.yao.dao.impl;

import com.yao.dao.UserDao;

public class UserDaoOracleImpl implements UserDao {
@Override
public void getUser() {
System.out.println("oracle");
}
}

此时UserService还是要继续修改,很显然这样的方式已经不适用于我们的需求了,那么怎么解决呢,可以使用如下的方式

UserServiceImpl.java

package com.yao.service.impl;

import com.yao.dao.UserDao;
import com.yao.dao.impl.UserDaoImpl;
import com.yao.service.UserService; public class UserServiceImpl implements UserService {
private UserDao userDao; public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}

测试类SpringDemoTest.java

package com.yao.test;

import com.yao.dao.impl.UserDaoMysqlImpl;
import com.yao.dao.impl.UserDaoOracleImpl;
import com.yao.service.UserService;
import com.yao.service.impl.UserServiceImpl; public class SpringDemoTest {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoMysqlImpl());
userService.getUser(); userService.setUserDao(new UserDaoOracleImpl());
userService.getUser();
}
}

其实从刚刚的代码中,大家应该能体会解耦的重要性了,下面我们就开始学习Spring的IOC。

面试总结

想要搞明白IOC,那么需要搞清楚如下几个问题:

1、谁控制谁

2、控制什么

3、什么是反转

4、哪些方面被反转

Answer

1、谁控制谁:在之前的编码过程中,都是需要什么对象自己去创建什么对象,有程序员自己来控制对象,而有了IOC容器之后,就会变成由IOC容器来控制对象,
2、控制什么:在实现过程中所需要的对象及需要依赖的对象
3、什么是反转:在没有IOC容器之前我们都是在对象中主动去创建依赖的对象,这是正转的,而有了IOC之后,依赖的对象直接由IOC容器创建后注入到对象中,由主动创建变成了被动接受,这是反转
4、哪些方面被反转:依赖的对象

DI

很多人把IOC和DI说成一个东西,笼统来说的话是没有问题的,但是本质上还是有所区别的,希望大家能够严谨一点,IOC和DI是从不同的角度描述的同一件事,IOC是从容器的角度描述,而DI是从应用程序的角度来描述,也可以这样说,**IOC是设计思想,而DI是具体的实现方式。**

Spring从入门到源码(一)的更多相关文章

  1. Spring Boot入门,源码解析

    目录 1.Spring Boot简介 2.微服务 3.Spring Boot HelloWorld 3.1 创建一个Maven工程 3.2 导入依赖Spring Boot相关的依赖 3.3 编写一个主 ...

  2. Spring从入门到源码—IOC基本使用(二)

    1.spring_helloworld 使用maven的方式来构建项目(Mavaen) 添加对应的pom依赖 pom.xml <dependencies> <!-- https:// ...

  3. 【Spring】Spring IOC原理及源码解析之scope=request、session

    一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...

  4. spring boot 2.0 源码分析(一)

    在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...

  5. Spring JPA实现逻辑源码分析总结

    1.SharedEntityManagerCreator: entitymanager的创建入口 该类被EntityManagerBeanDefinitionRegistrarPostProcesso ...

  6. spring boot 2.0 源码分析(二)

    在上一章学习了spring boot 2.0启动的大概流程以后,今天我们来深挖一下SpringApplication实例变量的run函数. 先把这段run函数的代码贴出来: /** * Run the ...

  7. spring boot 2.0 源码分析(四)

    在上一章的源码分析里,我们知道了spring boot 2.0中的环境是如何区分普通环境和web环境的,以及如何准备运行时环境和应用上下文的,今天我们继续分析一下run函数接下来又做了那些事情.先把r ...

  8. spring boot 2.0 源码分析(三)

    通过上一章的源码分析,我们知道了spring boot里面的listeners到底是什么(META-INF/spring.factories定义的资源的实例),以及它是创建和启动的,今天我们继续深入分 ...

  9. spring 各个版本的源码、jar包和源码jar包下载地址

    spring各个版本的源码jar包.文档jar包和spring的jar包 http://maven.springframework.org/release/org/springframework/sp ...

随机推荐

  1. Linux C++ 实现一个简易版的ping (也就是imcp协议)

    背景: 想实现一个在没外网的时候就自动重启路由器的功能. 又不想用ping命令,因为在代码里调用system("ping"); 可能会比较耗时,得单开线程.于是找了个实现ICMP协 ...

  2. spring学习四:springMVC

    ref:http://www.cnblogs.com/ysocean/tag/SpringMVC%E5%85%A5%E9%97%A8%E7%B3%BB%E5%88%97/ Spring MVC的处理流 ...

  3. 监听watch?

    对应一个对象,键是观察表达式,值是对应回调.值也可以是methods的方法名,或者是对象,包含选项.在实例化时为每个键调用 $watch()

  4. ApplicationContext通常的实现是什么?

    FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数. ClassPathXmlA ...

  5. String、StringBuiler、StringBuffer的区别

    一.三者的区别概述 1.可变与不可变:String底层使用final修饰的字符数组来存储字符串,它属于不可变类,对String对象的任何改变操作都不会改变原对象,而是生成一个新对象.StringBui ...

  6. 说出 5 条 IO 的最佳实践?

    IO 对 Java 应用的性能非常重要.理想情况下,你不应该在你应用的关键路径上 避免 IO 操作.下面是一些你应该遵循的 Java IO 最佳实践: a)使用有缓冲区的 IO 类,而不要单独读取字节 ...

  7. 说出 5 个 JDK 1.8 引入的新特性?

    Java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性: Lambda 表达式,允许像对象一样传递匿名函数 Stream API,充分利用现代多核 CPU,可以写 ...

  8. Spring 支持的 ORM?

    Spring 支持以下 ORM:HibernateiBatisJPA (Java Persistence API)TopLinkJDO (Java Data Objects)OJB

  9. 3_Phase Portrait_相图_相轨迹

  10. 使用Bootstrap typeahead插件实现搜索框自动补全的配置参数。

    示例代码: <input type="text" id="addr"/> <input type="text" hidde ...