Spring学习笔记:IOC控制反转、AOP面向切面

挺快的,框架这一部分

文章目录

  • 一、Spring概述
    • 入门案例
      • 导入依赖包
      • 在src下写配置文件
      • 创建普通类和测试类
  • 二、IOC(控制反转)
    • 2.1 IOC bean 的XML操作(创建对象,注入属性
    • 2.2 IOC bean 的 注解 操作
  • 三、AOP(面向切面)
    • 3.1 切入点表达式
    • 3.2 xml 实现AOP
    • 3.3 注解实现AOP


一、Spring概述

轻量级的 开源的 J2EE框架

IOC: 将创建对象的过程交给Spring来管理[控制反转]

AOP: 面向切面编程,不修改源代码的情况让你的程序增强.

Spring框架的特点

简化开发
aop的支持
方便和其他的框架进行整合
方便进行事务操作

入门案例

导入依赖包

在src下写配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"></beans>

创建普通类和测试类

public class User implements Serializable {public void sayHello(){System.out.println("Hello Java之神!");}
}

在上面配置文件的beans标签里面写bean标签

//id是起个名字,class是类名路径
<bean id="user" class="User"/>

在测试类中调用sayHello方法

    @Testpublic void testBean(){//获取配置文件ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//调用获得实例User user = applicationContext.getBean("user", User.class);//调用实例的方法user.sayHello();}

二、IOC(控制反转)

IOC底层

  • 1.xml解析
  • 2.工厂模式
  • 3.反射

入门案例就是一个控制反转的例子,就是把创建对象的过程交给对象工厂。

Spring 提供IOC实现一共有两种方式:

BeanFactory(了解

是框架内部使用的接口,不提供给开发者 加载配置文件的时候不会创建对象,只有获取对象的时候才会创建。

ApplicationContext(重点
这个是面对开发者的,是BeanFactory接口的子接口,功能更强大。 加载配置文件的时候就会将对象创建出来。

2.1 IOC bean 的XML操作(创建对象,注入属性

属性注入

<!--  set注入  --><bean id="user1" class="User"><property name="name" value="我是set注入"/><property name="id" value="1"/></bean><!--  构造注入  --><bean id="user2" class="User"><constructor-arg name="id" value="2"/><constructor-arg name="name" value="我是构造注入"/></bean><!--  p 命名空间注入 ( --><bean id="user3" class="User" p:id="3" p:name="我是p 命名空间注入"/>

级联赋值

<!--  级联赋值  --><!--  第一种方式  --><bean id="emp" class="entity.Emp"><property name="name" value="idiot"/><property name="dept"><bean class="entity.Dept"><property name="name" value="地球人事管理"/></bean></property></bean><!--  第二种方式  --><bean id="emp" class="entity.Emp"><property name="name" value="idiot"/><property name="dept" ref="dept"/></bean><bean id="dept" class="entity.Dept"><property name="name" value="宇宙管理分局"/></bean>

特殊类型处理

public class Demo implements Serializable {private String [] strings;private List<String> lists;private Map<String,String> maps;private Set<String> sets;
}
    <bean id="demo" class="entity.Demo"><!--处理List--><property name="lists"><list><value> list1 </value><value> list2 </value></list></property><!--处理Map--><property name="maps"><map><entry key="1" value="map1"/><entry key="2" value="map2"/></map></property><!--处理Array--><property name="Strings"><array><value> String1 </value><value> String2 </value></array></property><!--处理set--><property name="sets"><set><value> set1 </value><value> set2 </value></set></property></bean>

scope=“prototype” 多实例
scope=“singleton” 默认情况 单实例
例子

bean生命周期:

    1. 执行无参构造
    1. 执行set方法设置值
    1. 执行初始化方法(init-method
    1. 获取bean的实例对象
    1. 执行销毁的方法 (destroy-method

自动装配autuwire

  • byName : 根据属性名注入,要求注入bean的id 值要和类的属性名保持一致!!
  • byType : 根据类型注入

2.2 IOC bean 的 注解 操作

Spring框架中提供的关于创建bean的注解 :
@Component
@Service
@Controller
@Repository

四个注解的功能是一样的,都可以用来创建bean的实例

@Autowired 自动配置

@Service
public class Emp implements Serializable {private String name;@Autowired //这个注解可以自动装配默认采用 byType,即会寻找该类的bean自动注入,不存在的话会抛出异常private Dept dept;
}

使用注解要先扫描

<context:component-scan base-package="entity"/>

三、AOP(面向切面)

AOP底层是动态代理

  1. 有接口 使用jdk动态代理
  2. 无接口 使用cglib动态代理

AOP 术语
连接点:

类里面的哪些方法可以被增强,那么这个方法称为连接点

切入点:

实际被真正增强的方法,称为切入点

切面:

把通知应用到切入点的过程称为切面

通知[增强]:

实际增强的逻辑部分称为通知

通知的类型:

  • 前置通知
  • 后置通知
  • 环绕通知
  • 异常通知
  • 最终通知
准备开发:Spring的aop是基于 AspectJ 实现aop操作的AspectJ 不是Spring的组成部分,独立的AOP框架,将AspectJ 和Spring框架一起使用,进行AOP操作。

3.1 切入点表达式

execution([访问修饰符][返回值类型][类的全路径][方法名][(形参列表)])

execution(* entity.Person.song(..))

3.2 xml 实现AOP

    <bean id="person" class="entity.Person"/><bean id="personProxy" class="entity.PersonProxy"/><aop:config><aop:pointcut id="p" expression="execution(* entity.Person.song(..))"/><aop:aspect ref="personProxy"><aop:before method="before" pointcut-ref="p"/><aop:after method="after" pointcut-ref="p"/><aop:around method="around" pointcut-ref="p"/><aop:after-returning method="afterReturning" pointcut-ref="p"/><aop:after-throwing method="afterThrowing" pointcut-ref="p"/></aop:aspect></aop:config>

3.3 注解实现AOP

还是要先扫描

<context:component-scan base-package="entity"/>

然后要打开自动代理

<aop:aspectj-autoproxy/>

代理类

@Component
@Aspect //这个不要忘记了,要确定切面
public class PersonProxy {@Before("execution(* entity.Person.song(..))")public void before(){System.out.println("唱前准备:前置通知");}@After("execution(* entity.Person.song(..))")public void after(){System.out.println("散伙!:最终通知");}@Around("execution(* entity.Person.song(..))")public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("立体音响:环绕通知前半场");proceedingJoinPoint.proceed();System.out.println("立体音响:环绕通知后半场");}@AfterReturning("execution(* entity.Person.song(..))")public void afterReturning(){System.out.println("唱后收拾:后置通知");}@AfterThrowing("execution(* entity.Person.song(..))")public void afterThrowing(){System.out.println("突发状况!开始处理!:异常通知");}
}

学完了?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/301603.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「每日跟读」英语常用句型公式 第6篇

「每日跟读」英语常用句型公式 第6篇 1. As ___ as possible 越 ___ 越好 As soon as possible (ASAP)(越快越好) As happy as possible (越快乐越好) As prepared as possible (越有准备越好) As much/many as possible (越多越好 *不可数/可数) As early as possible …

STM32一个地址未对齐引起的 HardFault 异常

1. 概述 客户在使用 STM32G070 的时候&#xff0c;KEIL MDK 为编译工具&#xff0c;当编译优化选项设置为Level0 的时候&#xff0c;程序会出现 Hard Fault 异常&#xff0c;而当编译优化选项设置为 Level1 的时候&#xff0c;则程序运行正常。表面上看&#xff0c;这似乎是 K…

云计算(五)—— OpenStack基础环境配置与API使用

OpenStack基础环境配置与API使用 项目实训一 【实训题目】 使用cURL命令获取实例列表 【实训目的】 理解OpenStack的身份认证和API请求流程。 【实训准备】 &#xff08;1&#xff09;复习OpenStack的认证与API请求流程的相关内容。 &#xff08;2&#xff09;熟悉cURL…

mysql慢sql排查与分析

当MySQL遇到慢查询&#xff08;慢SQL&#xff09;时&#xff0c;我们可以通过以下步骤进行排查和优化&#xff1a; 标题开启慢查询日志&#xff1a; 确保MySQL的慢查询日志已经开启。通过查看slow_query_log和slow_query_log_file变量来确认。 如果没有开启&#xff0c;可以…

2.SpringBoot利用Thymeleaf实现页面的展示

什么是Thymeleaf&#xff1f; Thymeleaf是一个现代服务器端Java模板引擎&#xff0c;适用于Web和独立环境&#xff0c;能够处理HTML&#xff0c;XML&#xff0c;JavaScript&#xff0c;CSS甚至纯文本。 Thymeleaf的主要目标是提供一种优雅且高度可维护的模板创建方式。为实现这…

css实现更改checkbox的样式;更改checkbox选中后的背景色;更改checkbox选中后的icon

<input class"check-input" type"checkbox"> .check-input {width: 16px;height: 16px;} /* 设置默认的checkbox样式 */input.check-input[type"checkbox"] {-webkit-appearance: none; /* 移除默认样式 */border: 1px solid #999;outl…

Windows系统下安装java开发环境所需的JDK开发工具包

目录 一、JDK开发工具包下载二、安装三、环境变量配置3.1 添加安装包路径3.2 添加lib路径3.3 添加bin目录 四、检查是否安装成功五、总结 一、JDK开发工具包下载 官网地址&#xff1a;JDK下载 打开网址后有多个版本的JDK&#xff0c;学者根据自己电脑需求选择对应版本下载。如…

6.10物联网RK3399项目开发实录-驱动开发之SPI接口的使用(wulianjishu666)

嵌入式实战开发例程&#xff0c;珍贵资料&#xff0c;开发必备&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1149x7q_Yg6Zb3HN6gBBAVA?pwdhs8b SPI 使用 SPI 简介 SPI 是一种高速的&#xff0c;全双工&#xff0c;同步串行通信接口&#xff0c;用于连接微控制器、…

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

设计模式总结-建造者模式

建造者模式 模式动机模式定义模式结构模式分析建造者模式实例与解析实例&#xff1a;KFC套餐 模式动机 无论是在现实世界中还是在软件系统中&#xff0c;都存在一些复杂的对象&#xff0c;它们拥有多个组成部分&#xff0c;如汽车&#xff0c;它包括车轮、方向盘、发送机等各种…

LC低通滤波

LC滤波器&#xff0c;是指将电感L与电容器 C进行组合设计构成的滤波电路&#xff0c;可去除或通过特定频率的无源器件。电容器具有隔直流通交流&#xff0c;且交流频率越高越容易通过的特性。而电感则具有隔交流通直流&#xff0c;且交流频率越高越不易通过的特性。因此&#x…

C#仿OutLook的特色窗体设计

目录 1. 资源图片准备 2. 设计流程&#xff1a; &#xff08;1&#xff09;用MenuStrip控件设计菜单栏 &#xff08;2&#xff09;用ToolStrip控件设计工具栏 &#xff08;3&#xff09;用StatusStrip控件设计状态栏 &#xff08;4&#xff09;ImageList组件装载树节点图…

考虑预同步的虚拟同步机T型三电平逆变器并离网MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 三相 T 型三电平逆变器电路如图所示&#xff0c;逆变器主回路由三个单相 T 型逆变器组成。 直流侧输入电压为 UPV&#xff0c;直流侧中点电位 O 设为零电位&#xff0c;交流侧输出侧是三相三线制连…

RFID涉密载体柜 RFID智能文件柜系统

涉密载体管控RFID智能柜&#xff08;载体柜DW-G101R&#xff09;通过对涉密物资、设备进行RFID唯一标识并放置于RFID设备涉密物资柜柜体&#xff0c;通过定位每台设备每件涉密物资的位置&#xff0c;实现涉密物资审批、自助借还、防盗等出入库全流程自动化管理。主要管理对象移…

每天五分钟掌握深度学习框架pytorch:本专栏说明

专栏大纲 专栏计划更新章节在100章左右&#xff0c;之后还会不断更新&#xff0c;都会配备代码实现。以下是专栏大纲 部分代码实现 代码获取 为了方便用户浏览代码&#xff0c;本专栏将代码同步更新到github中&#xff0c;所有用户可以读完专栏内容和代码解析之后&#xff0c…

Blender怎么样启动默认移动和Cavity效果

在使用Blender的过程中&#xff0c;有一些特殊的技巧很重要。 比如默认地设置blender打开时&#xff0c;就是移动物体&#xff0c;这样怎么样设置的呢&#xff1f; 需要在界面里打开下面的菜单: 这样就找到默认设置的地方&#xff0c;把下面的移动勾选起来&#xff0c;这样点…

谷歌浏览器插件开发速成指南:弹窗

诸神缄默不语-个人CSDN博文目录 本文介绍谷歌浏览器插件开发的入门教程&#xff0c;阅读完本文后应该就能开发一个简单的“hello world”插件&#xff0c;效果是出现写有“Hello Extensions”的弹窗。 作为系列文章的第一篇&#xff0c;本文还希望读者阅读后能够简要了解在此基…

C++设计模式:观察者模式(三)

1、定义与动机 观察者模式定义&#xff1a;定义对象间的一种1对多&#xff08;变化&#xff09;的依赖关系&#xff0c;以便当一个对象&#xff08;Subject&#xff09;的状态发生比改变时&#xff0c;所有依赖于它的对象都得到通知并且自动更新 再软件构建过程中&#xff0c…

【数据结构】复杂度(长期维护)

本篇博客主要是浅谈数据结构概念及时间复杂度&#xff0c;并做长期的维护更新&#xff0c;有需要借鉴即可。 复杂度目录 一、初识数据结构1.基础概念2.如何学好数据结构 二、复杂度1.复杂度2.时间复杂度①有限数的时间复杂度②函数的时间复杂度③二分查找时间复杂度④递归拓展练…

Java常用API_System——常用方法及代码演示

1.System.exit(int status) 方法的形参int status为状态码&#xff0c;如果是0&#xff0c;说明虚拟机正常停止&#xff0c;如果非0&#xff0c;说明虚拟机非正常停止。需要将程序结束时可以调用这个方法 代码演示&#xff1a; public class Test {public static void main(S…