Spring核心机制

1 Spring IoC 和 AOP

Spring 框架Java开发的行业标准

Spring 全家桶

Web:Spring Web MVC/Spring MVC、Spring Web Flux

持久层: Spring Data/ Spring DataJPA、Spring Data Redis、Spring Data MongoDB

安全校验: Spring Security

构建工程脚手架:Spring Boot

微服务:Spring Cloud

IoC是Spring全家桶各个功能模块的基础,创建对象的容器。

AOP也是以loC为基础,AOP是面向切面编程,抽象化的面向对象

1、打印日志

2、事务

3、权限处理

1.1 IoC

控制反转,将对象的创建进行反转,常规情况下,对象都是开发者手动创建的,使用loC开发者不再需要创建对象,而是由loC容器根据需求自动创建项目所需要的对象。

不用IoC:所有对象开发者自己创建

使用IoC:对象不用开发者创建,而是交给Spring框架来完成

1.pom.xml

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.12.RELEASE</version>
</dependency>

引入IoC的环境下


基于XML和基于注解

基于XML:开发者把需要的对象在XML中进行配置,Spring框架读取这个配置文件,根据配置文件的内容来创建对象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/tx/spring-tx.xsd"><bean class="nuc.edu.springdemo.DataConfig" id="config"><property name="driverName" value="Driver"></property><property name="url" value="loaclhost:8080"></property><property name="username" value="root"></property><property name="password" value="654321"></property></bean>
</beans>
package nuc.edu.springdemo;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {//        DataConfig dataConfig = new DataConfig();
//        dataConfig.setDriverName("Driver");
//        dataConfig.setUrl("localhost:3306/dbname");
//        dataConfig.setUsername("root");
//        dataConfig.setPassword("123456");ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");System.out.println(context.getBean("config"));}
}

基于注解

1、配置类

package nuc.edu.springdemo.configuration;import nuc.edu.springdemo.DataConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfiguration {@Bean(value = "config")public DataConfig dataConfig() {DataConfig dataConfig = new DataConfig();dataConfig.setDriverName("Driver");dataConfig.setUrl("localhost:3306/dbname");dataConfig.setUsername("root");dataConfig.setPassword("123456");return dataConfig;}
}
package nuc.edu.springdemo;import nuc.edu.springdemo.configuration.BeanConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {//        DataConfig dataConfig = new DataConfig();
//        dataConfig.setDriverName("Driver");
//        dataConfig.setUrl("localhost:3306/dbname");
//        dataConfig.setUsername("root");
//        dataConfig.setPassword("123456");ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfiguration.class);
System.out.println(context.getBean(DataConfig.class));
System.out.println(context.getBean("config"));

当配置类存在多个时,直接使用包名

ApplicationContext context = new AnnotationConfigApplicationContext("nuc.edu.springdemo.configuration");

2、扫包+注解

更简单的方式,不再需要依赖于XML或者配置类,而是直接将bean的创建交给目标类,在目标类添加注解来创建

package nuc.edu.springdemo.ioc;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Data
@Component
public class DataConfig {@Value("localhost:3306")private String url;@Value("Driver")private String driverName;@Value("root")private String username;@Value("654123")private String password;}
ApplicationContext context = new AnnotationConfigApplicationContext("nuc.edu.springdemo.ioc");
System.out.println(context.getBean(DataConfig.class));

自动创建对象,完成依赖注入

package nuc.edu.springdemo.ioc;import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Data
@Component
public class GlobalConfig {@Value("8080")private String port;@Value("/")private String path;@Autowiredprivate DataConfig dataConfig;
}

@Autowired 通过类型进行注入,如果需要通过名称取值,通过@Qualifier注解完成名称的映射

package nuc.edu.springdemo.ioc;import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Data
@Component
public class GlobalConfig {@Value("8080")private String port;@Value("/")private String path;@Autowired@Qualifier("config")private DataConfig dataConfig;
}
package nuc.edu.springdemo.ioc;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Data
@Component("config")
public class DataConfig {@Value("localhost:3306")private String url;@Value("Driver")private String driverName;@Value("root")private String username;@Value("654123")private String password;
}

1.2AOP

面向切面编程,是一种抽象化的面向对象编程,对面向对象编程的补充,底层使用动态代理机制来实现

打印日志

业务代码和打印日志耦合起来

package nuc.edu.springdemo.aop;public class CalImpl implements Cal {@Overridepublic int add(int num1, int num2) {System.out.println("add方法的参数是[" + num1 + "," + num2 + "]");int result = num1 + num2;System.out.println("add方法的结果是" + result);return result;}@Overridepublic int sub(int num1, int num2) {System.out.println("sub方法的参数是[" + num1 + "," + num2 + "]");int result = num1 - num2;System.out.println("sub方法的结果是" + result);return result;}@Overridepublic int mul(int num1, int num2) {System.out.println("mul方法的参数是[" + num1 + "," + num2 + "]");int result = num1 * num2;System.out.println("mul方法的结果是" + result);return result;}@Overridepublic int div(int num1, int num2) {System.out.println("div方法的参数是[" + num1 + "," + num2 + "]");int result = num1 / num2;System.out.println("div方法的结果是" + result);return result;}
}

计算器方法中,日志和业务混合在一起,AOP要做的就是将日志代码全部抽象出去统一进行处理,计算器方法中只保留核心的业务代码。

做到核心业务和非业务代码的解耦合

1、创建切面类

package nuc.edu.springdemo.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;import java.util.Arrays;@Component
@Aspect
public class LoggerAspect {@Before("execution(public int nuc.edu.springdemo.aop.CalImpl.*(..))")public void before(JoinPoint joinPoint){String name = joinPoint.getSignature().getName();System.out.println(name+"方法的参数是"+ Arrays.toString(joinPoint.getArgs()));}@AfterReturning(value = "execution(public int nuc.edu.springdemo.aop.CalImpl.*(..))",returning = "result")public void afterReturning(JoinPoint joinPoint,Object result){String name = joinPoint.getSignature().getName();System.out.println(name+"方法的结果是"+ result);}
}

2、实现类添加@Component注解

package nuc.edu.springdemo.aop;import org.springframework.stereotype.Component;@Component
public class CalImpl implements Cal {@Overridepublic int add(int num1, int num2) {int result = num1 + num2;return result;}@Overridepublic int sub(int num1, int num2) {int result = num1 - num2;return result;}@Overridepublic int mul(int num1, int num2) {int result = num1 * num2;return result;}@Overridepublic int div(int num1, int num2) {int result = num1 / num2;return result;}
}

3、配置自动扫包,开启自动生产代理对象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/tx/spring-tx.xsd"><!--自动扫包--><context:component-scan base-package="nuc.edu.springdemo.aop"></context:component-scan><!--开启自动生成代理--><aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>

4、使用

package nuc.edu.springdemo.aop;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");Cal bean = context.getBean(Cal.class);System.out.println(bean.add(9, 8));System.out.println(bean.sub(9, 8));System.out.println(bean.mul(9, 8));System.out.println(bean.div(9, 8));}
}

Spring核心机制——IoC和AOP相关推荐

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

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

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

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

  3. spring框架两大核心:IOC和AOP的详解

    目录 一.IOC和AOP的介绍 二.IOC 1.IOC初始化属性的方式 1.使用构造方法完成属性初始化 2.使用type数据类型完成属性初始化 3.使用p命名空间初始化对象 4.使用c命名空间初始化对 ...

  4. spring核心之IOC

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

  5. Spring总结(IOC、AOP原理以及Spring事务)

    一.概述 1.Spring是一个开源免费且轻量级的框架 , 非侵入式的 . 2.控制反转 IoC , 面向切面 Aop 3 .对事物的支持 , 对框架的支持 一句话概括: Spring 是一个轻量级的 ...

  6. Spring 原理初探——IoC、AOP

    前言 众所周知, 现在的 Spring 框架已经成为构建企业级 Java 应用事实上的标准了,众多的企业项目都构建在 Spring 项目及其子项目之上,特别是 Java Web 项目. Spring ...

  7. 谈谈Spring中的IOC和AOP概念 - 倪升武的博客 - CSDN博客

    转载于https://blog.csdn.net/eson_15/article/details/51090040 IOC和AOP是Spring中的两个核心的概念,下面谈谈对这两个概念的理解. 1. ...

  8. 认识Spring核心容器IoC/DI

    对于 Java 编程来说,使用 Spring 能完成的更加快速,更容易并更安全.Spring 专注于速度,便捷与开发效率,也正是如此,让Spring成为了全世界最流行的 Java 框架.从配置到安全, ...

  9. Spring中的IOC和AOP是什么意思?

    (1) Spring是什么? IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AO ...

  10. Spring 面试之IoC 和 AOP

    Spring IoC 什么是IoC Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象 ...

最新文章

  1. 调查用QQ企业邮箱的smtp需要添加spf1
  2. 【 karle 专栏 】Android 初探底层知识系列
  3. 《Adobe After Effects CC完全剖析》——动画:完全是由“关系”组成的
  4. python 逐行调试工具_在线编译或编辑Python的5个最佳工具
  5. python opencv cv2.VideoCapture(),read(),waitKey()的使用 ret,frame参数
  6. Ubuntu服务器安装lamp
  7. 数学--数论--莫比乌斯反演
  8. 轻轻松松看懂Spring AOP源码
  9. html 循环_一个不被程序员认为是编程语言的语言——HTML,你怎么看?
  10. python解析html的库_python解析html开发库pyquery使用方法
  11. solve det(I + uv^t)
  12. 如何使用InetAddress在Java中获取IP地址
  13. Android进阶篇-Http协议
  14. mopso算法代码程序_程序员如何跨越35岁危机?这篇给点干货建议!
  15. Learning to Generalize:Meta-Learning for Domain Geralization 深度理解(公式详细推导,包含二阶导)
  16. 电影推荐之《哈利波特与阿兹卡班的囚徒》 隐私策略(Privacy policy)
  17. 第一章 DirectX 计算机图形学(上)
  18. freenom 加 cloudflare免费域名申请
  19. 让博客Docker化,轻松上手Docker
  20. 页面JS方法获取图片中的相对坐标

热门文章

  1. 互联网性能监测方法及工具
  2. Python实现一维表与二维表之间的相互转化
  3. 博途的多步过程控制, 寄存器寻址
  4. 台式计算机开机不自检不起动,台式机开机一直自检的解决方法
  5. 考研没过线也能录取?13种特殊录取方式!
  6. GoLang之iface 和 eface 的区别是什么(3)
  7. 共享文件问题 -- 无法访问 您可能没有权限使用网络资源
  8. ip地址查询 免费 接口 linux 外网地址查询
  9. 爬取豆瓣250本书籍
  10. Unix编程艺术:哲学基础