spring介绍

  1. Spring核心IOC跟AOP
    IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,可以很好地实现解耦合。
    简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
    一. IOC
    (1) 引入
    如以前都是在【业务层】实例化【持久层】对象,耦合性强!
    当持久层代码变动时,业务层代码也要改变! 所以有了IOC控制反转,即由IOC容器将持久层的对象注入到业务层;

(2) 定义
控制反转即主动变成被动;
IOC控制反转,即 主动new对象 变成由于 外部(IOC容器)去提供对象,被IOC容器所管理的对象也被称为 bean;

(3) 作用
解耦合,如果dao层有变化,则不需要改变service层代码!

(4) 实现
Spring技术对IOC思想进行了实现:
  Spring提供了Core Container容器,称为IOC容器,用来充当IOC思想中的外部;
  即在Spring中,IOC可以理解为由主动new对象,转换为由IOC容器提供对象;
  IOC会管理大量的对象(用到了 反射机制 ,根据路径名获取类文件,进而完成对象创建,创建对象调用的是无参构造);
  IOC会管理对象的创建和初始化的过程;
  IOC容器负责对象的创建、初始化等一些列工作,被创建或管理的对象在IOC容器中统称为
(5) DI依赖注入
在容器中建立Bean与Bean之间的依赖关系的过程,称为依赖注入!
Spring通过DI(依赖注入)实现IOC(控制反转);
效果:在需要使用Service对象时,里面的dao对象就已经由IOC容器生成并注入了!
目标:充分解耦;
总结:
IOC :用对象的时候不用程序去new,而是由IOC容器提供;
DI:当IOC中的Bean有关系时,会绑定依赖;

举例:我们创建一个对象user,我们如何去拿到呢?

在这里插入图片描述

加载获取对象

在这里插入图片描述

在这里插入图片描述

实现原理

AOP的理解
作用: 面向切面编程,通过预编译方
式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个
热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑
的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高
了开发的效率。
Authentication 权限检查
Context passing 内容传递
Error handling 错误处理
Logging日志处理

AOP通知类型(绑定的类型)
@Before :前置
@After:后置 (不管抛不抛异常都会运行)
@AfterReturning:返回后通知
@AfterThrowing:抛出异常后通知

@Around:环绕,用的最多;
在原始方法前执行前置,原始方法后面执行后置;
需要有东西来表示对原始方法的调用;此处需要抛异常,因为不知原始操作是否会有异常;
@Pointcut 切入点类型
@Pointcut切点表达式非常丰富,可以将 方法(method)、类(class)、接口(interface)、包(package) 等作为切入点,非常灵

举例子

在这里插入图片描述

  1. 项目创建的目录规范
  2.  	controller 控制层
    
  3.        dto	 请求参数	
    
  4.          vo	  返回参数		
    
  5.  	entity  实体
    
  6.  	server  接口
    
  7.  	mapper映射
    
  8.        enums 枚举
    

3.spring boot启动原理
我们开发任何一个Spring Boot项目,都会用到如下的启动类
1 @SpringBootApplication
2 public class Application {
3 public static void main(String[] args) {
4 SpringApplication.run(Application.class, args);
5 }
6 }

从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘面纱,我们要从这两位开始就可以了。
一、SpringBootApplication背后的秘密
@SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解:
1 @Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Inherited
5 @SpringBootConfiguration
6 @EnableAutoConfiguration
7 @ComponentScan(excludeFilters = {
8 @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
9 @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
10 public @interface SpringBootApplication {
11 …
12 }

虽然定义使用了多个Annotation进行了原信息标注,但实际上重要的只有三个Annotation:
• @Configuration(@SpringBootConfiguration点开查看发现里面还是应用了@Configuration)
• @EnableAutoConfiguration
• @ComponentScan
即 @SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
所以,如果我们使用如下的SpringBoot启动类,整个SpringBoot应用依然可以与之前的启动类功能对等:
1 @Configuration
2 @EnableAutoConfiguration
3 @ComponentScan
4 public class Application {
5 public static void main(String[] args) {
6 SpringApplication.run(Application.class, args);
7 }
8 }

每次写这3个比较累,所以写一个@SpringBootApplication方便点。接下来分别介绍这3个Annotation。
1、@Configuration
这里的@Configuration对我们来说不陌生,它就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration,SpringBoot社区推荐使用基于JavaConfig的配置形式,所以,这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。
举几个简单例子回顾下,XML跟config配置方式的区别:
(1)表达形式层面
基于XML配置的方式是这样:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns=“http://www.springframework.org/schema/beans”
3 xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
4 xsi:schemaLocation=“http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd”
5 default-lazy-init=“true”>
6
7

而基于JavaConfig的配置方式是这样:
1 @Configuration
2 public class MockConfiguration{
3 //bean定义
4 }

任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类。
(2)注册bean定义层面
基于XML的配置形式是这样:
1
2 …
3

而基于JavaConfig的配置形式是这样的:
1 @Configuration
2 public class MockConfiguration{
3 @Bean
4 public MockService mockService(){
5 return new MockServiceImpl();
6 }
7 }
任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。
(3)表达依赖注入关系层面
为了表达bean与bean之间的依赖关系,在XML形式中一般是这样:
1
2
3
4
5

而基于JavaConfig的配置形式是这样的:
1 @Configuration
2 public class MockConfiguration{
3 @Bean
4 public MockService mockService(){
5 return new MockServiceImpl(dependencyService());
6 }
7
8 @Bean
9 public DependencyService dependencyService(){
10 return new DependencyServiceImpl();
11 }
12 }

2、@ComponentScan
@ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。
注:所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。
3、@EnableAutoConfiguration
个人感觉@EnableAutoConfiguration这个Annotation最为重要,所以放在最后来解读,大家是否还记得Spring框架提供的各种名字为@Enable开头的Annotation定义?比如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,@EnableAutoConfiguration的理念和做事方式其实一脉相承,简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。
• @EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
• @EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。
而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器,仅此而已!
@EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置,如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,Spring Boot会对Tomcat和Spring MVC进行自动配置。

@EnableAutoConfiguration作为一个复合Annotation,其自身定义关键信息如下:
1 @SuppressWarnings(“deprecation”)
2 @Target(ElementType.TYPE)
3 @Retention(RetentionPolicy.RUNTIME)
4 @Documented
5 @Inherited
6 @AutoConfigurationPackage
7 @Import(EnableAutoConfigurationImportSelector.class)
8 public @interface EnableAutoConfiguration {
9 …
10 }

其中,最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。就像一只“八爪鱼”一样,借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成!

Spring 全家桶视频教学
https://www.bilibili.com/video/BV16q4y1n7Fd/?spm_id_from=333.999.0.0&vd_source=f856facbe30db14005ac84f082eb8808

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值