一、Spring核心内容IOC容器

1.IOC作用

负责对象的实例化、对象的初始化、对象和对象之间的依赖关系配置、对象的销毁、对象提供对象的查找等操作,对象的整个生命周期都是容器来控制的。使用IOC容器进行管理后,则不需要我们手动通过new的方式去创建对象,由容器帮我们组装好直接用即可。这就是Spring的容器。

2.Spring如何管理对象的

由Spring容器管理的对象统称为Bean对象。我们需要通过在配置文件中告诉Spring容器需要创建哪些Bean对象,所以需要先在配置文件中定义好需要创建的对象,这些配置统称为bean定义配置元素数据信息,Spring容器通过读取这些bean配置元素数据信息来构建和组装我们所需的对象。

BeanFactory

org.springframework.beans.factory.BeanFactory

spring容器中具有代表性的容器就是BeanFactory接,这个是spring容器的顶层接,提供了容器最基本的功能。

//按bean的id或者别名查找容器中的bean

Object getBean(String name) throws BeansException

//这个是个泛型法,按照bean的id或者别名查找指定类型的bean,返回指定类型的bean对象

<T> T getBean(String name, Class<T> requiredType) throws BeansException;

//返回容器中指定类型的bean对象

<T> T getBean(Class<T> requiredType) throws BeansException;

//获取指定类型bean对象的获取器,这个较特别,以后会专门来讲

<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);

ApplicationContext

org.springframework.context.ApplicationContext

这个接继承了BeanFactory,所以内部包含了BeanFactory所有的功能,并且在其上进了扩展,增加了很多企业级功能,AOP、国际化、事件持等等。

容器中创建对象的方式:

方法一:XML配置Bean

在配置文件中进行编写Bean,这个方法非常常见,举个例子:

<bean id="car" class="com.lm.spring.bean.Car">

这种定义方法相当于Car car = new Car() 然后 注册car到spring容器。用的时候直接用。

方法二:@Bean

这个方法是spring boot流行后的常用方法。本质和XML配置方法相同。所有用XML配置文件的方法都可以用这个方法改写。

@Configuration
public class ConfigUtil {@Beanpublic ActionOneyDay getActionOneyDay(){return new ActionOneDayImpl();}
}

方法三:BeanFacoty registerSingleton

通过配置方式或者注解方式,由Spring容器去创建对象。默认情况下为Singleton模式。

注解类型方式:

@Service—服务层

@Component—组建层

@Repository数据层

@Contrlloer—用户层

3.Spring注入对象的方式

方式一:Constructor注入

Constructor Injection是构造器注入,是我们日常最为推荐的一种使用方式。

@RestController public class OrderController {     //声明所要注入的对象     private OrderService orderService;
    //基于构造函数的方式注入对象     public OrderController(OrderService orderService) {         this.orderService = orderService;     }     @GetMapping("/order")     public String order() {         return orderService.order();     } }

方法二:Setter注入

Setter Injection也会用到@Autowired注解,但使用方式与Field Injection有所不同,Field Injection是用在成员变量上,而Setter Injection的时候,是用在成员变量的Setter函数上。

@RestController
public class OrderController {//声明所要注入的对象private OrderService orderService;@Autowiredpublic void setOrderService(OrderService orderService) {this.orderService = orderService;}@GetMapping("/order")public String order() {return orderService.order();}
}

方式三:Field 注入

@RestController
public class AirportController {@Autowiredprivate AirportService airportService;@RequestMapping("/airport")public List<AirPort> getInfo(String airPortNum){String aa=null;Optional.ofNullable(aa).ifPresent(name->{System.out.println("测试数据:111111");});double[] ds= new double[]{};for (double dd:ds){}return airportService.getInfo(airPortNum);}

}

这种注入方式通过Java的反射机制实现,所以private的成员也可以被注入具体的对象。这种方式在日常开发中比较常用。

二、Spring核心内容AOP

AOP:面向切面编程。

面向切面编程(Aspect Orient Programming)支持允许将一些通用的任务如缓存日志记录性能统计安全控制事务处理异常处理等进行集中式处理,从而提供了更好的复用,AOP通常用来处理一些具有横切性质的系统级服务。

利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

1.切面

@Aspect:定义一个切面,对应的一个实现AOP的类定义

2.切点

@Pointcut:定义一个切点

@Pointcut("execution(* com.ydb.service..*.*(..))")
@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")

比如:

@Pointcut("execution(* com.ydb.service..*.*(..))")
private void aopCheck() { }
@Around("aopCheck()")
public Object aroundAspect(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("Aspect--环绕通知方法开始执行!!!");Object o = joinPoint.proceed();System.out.println("Aspect--环绕通知方法开结束执行!!");return o;
}

3.通知

  • 前置通知(Before):在目标方法或者说连接点被调用前执行的通知;
  • 后置通知(After):指在某个连接点完成后执行的通知;
  • 返回通知(After-returning):指在某个连接点成功执行之后执行的通知;
  • 异常通知(After-throwing):指在方法抛出异常后执行的通知;
  • 环绕通知(Around):指包围一个连接点通知,在被通知的方法调用之前和之后执行自定义的方法。

比如:

@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")
private void annotation(){}@Before("annotation()")
public void aspectMethodBefore(){System.out.println("Aspect---方法执行前!!!");
}@After("annotation()")
public void aspectMethodAfter(){System.out.println("Aspect---方法执行后!!!");
}@Around("aopCheck()")
public Object aroundAspect(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("Aspect--环绕通知方法开始执行!!!");Object o = joinPoint.proceed();System.out.println("Aspect--环绕通知方法开结束执行!!");return o;
}

Spring核心内容相关推荐

  1. Spring核心——IOC处理器扩展

    为什么80%的码农都做不了架构师?>>>    非侵入式框架 Spring一直标注自己是一个非侵入式框架.非侵入式设计的概念并不新鲜,目标就是降低使用者和框架代码的耦合,毕竟框架的开 ...

  2. 小马哥spring编程核心思想_Spring源码高级笔记之——Spring核心思想

    Spring核心思想 注意:IOC和AOP不是spring提出的,在spring之前就已经存在,只不过更偏向于理论化,spring在技术层次把这两个思想做了非常好的实现(Java) 第1节loC 1. ...

  3. spring核心之IOC

    spring IOC   控制反转    核心思想 了解IOC,首先需要了解DI  --- 软件设计的重要思想            依赖注入 什么事依赖注入呢? 例子:设计行李箱类 传统写法:首先设 ...

  4. java 切面_Java笔试面试精心整理得到89道Spring 核心知识【收藏向】

    点击上方"蓝字",关注了解更多 Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 ...

  5. Spring教程 - Spring核心框架教程

    Spring教程 - Spring核心框架教程 Spring是最广泛使用的Java EE框架之一.我已经在Spring Tutorial上写了很多内容,这是一篇摘要文章,它将作为索引按顺序完成所有这些 ...

  6. 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  7. Spring核心机制IoC与AoP梳理

    Spring核心机制IoC与AoP梳理 文章目录 Spring核心机制IoC与AoP梳理 IoC介绍 IoC案例介绍 pom文件中IoC环境引入 自己new对象方法举例(正转) IoC创建对象 基于X ...

  8. 小白初写Spring核心容器功能

    Spring核心容器功能 1.spring优点 方便解耦,简化开发 AOP编程的支持 申明式事务的支持 方便程序的测试等等 一,Spring模块架构图 core container : 核心容器,是s ...

  9. Spring核心编程思想

    第01章:Spring Framework总览 (12讲)       01.课程介绍.mp4       02.内容综述.mp4       03.课前准备:学习三件套(工具.代码与大脑).mp4 ...

  10. spring源码分析01-(前期准备)spring核心原理解析和手写简易spring

    1.本文主要介绍内容 本文会把Spring中核心知识点大概解释下.可以对Spring的底层有一个整体的大致了解.主要内容包括: 手写简易spring框架,帮助更好理解spring. 代码点击链接自取 ...

最新文章

  1. html无序列表的滚动效果,html无序列表标签和有序列表标签使用示例
  2. 这10个让你笑的合不拢嘴的GitHub项目,居然拿了7万星
  3. javascript 回调函数
  4. 委托的Invoke 和 BeginInvoke 与Control的Invoke和BeginInvoke(转-因为写得很好)
  5. 前端学习(1289):nodejs模块化的开发规范
  6. C++编译时多态和运行时多态
  7. 6位密码锁的c语言编程,51单片机4*3矩阵键盘6位密码锁c语言程序
  8. Linux通过文件大小查找,linux 根据文件大小查找文件
  9. L2-011. 玩转二叉树
  10. AngularJS开发指南5:AngularJS表达式详解
  11. Java forEach() 方法的三种用法
  12. 如何用 SQL 做留存率分析?
  13. 用递归解决冒泡排序问题
  14. 配置codeblocks 的养眼colour theme ;鼠标颜色与型状配置,界面汉化,以及调试入门
  15. Css(常用的特殊效果)
  16. sublime中文件前缀的自动添加
  17. java.util.current_Java基础知识-java.util.concurrent包下常见类的使用
  18. linux系统如何查看tomcat版本,【Linux查看tomcat版本】
  19. JUnit 4 vs JUnit 5
  20. Shell 教程 - 菜鸟教程

热门文章

  1. 数字高程模型|DEM采集的主要方式
  2. java IO流学习总结
  3. VS中如何添加报表控件
  4. uniapp -nvue 轮播图与背景图的淡入淡出效果
  5. ImageJ的安装与简单使用
  6. 3D制图软件中怎么设计凸轮?3D设计凸轮教程
  7. jade---模板项目
  8. 人脸识别项目的测试用例
  9. C#毕业设计——基于C#+asp.net+cs的即时通信系统设计与实现(毕业论文+程序源码)——即时通信系统
  10. IIS无法启动:存储空间不足解决办法