当前位置: 首页 > news >正文

Spring ioc和Aop

IOC

在传统Java当中,我们的对象都需要new关键字来生成,这在面对很多对象的情况产生了不必要的麻烦,因为我不需要在一个项目中一直做重复的事情,那怎么办把,自然而然的一些好的框架就诞生了,避免我们去做这些重复的事情。

ioc就是控制反转,创建对象的容器,他是一种面向切面的编程,就比如你要重复做某些事情,你单纯把这件事情抽象出来,然后写出来,给我的感觉很像Lombok,加一个@Data这样子数据就不需要get,set方法,自动生成,这样子就看着很优雅了,有一种美感。

ioc容器加载有大体上有两种模式,一种基于xml,还有是基于注解,后者就具有普适性,越来越常用了,接下来就展示一下这两种方法

这两种方式的前提都要在pom.xml中配置好依赖,这是至关重要的一步

基于XML的方式

(现大多使用注解方式,xml方式并不简洁,本文仅记录xml用作了解)

resource目录下创建Spring的xml文件,名称无要求

文件最上头的几行为约束,表示可以用哪些标签等

在bean.xml文件中写bean标签:id为类的唯一标识,class为类的全类名(包名+类名)

ApplicationContext context=new ClassPathXmlApplication(spring.xml)

想获取文件里面的对象,三种方法,基于id,基于class,还有就是两个一起用

getBean(类名.class)或者getBean(id)都可以,但是值得注意两点:

当根据类型获取bean时,要求IoC容器中指定类型的bean有且只能有一个。

当IOC容器中一共配置了多个,根据类型获取时会抛出异常。

因为他不只要找谁。

基于注解的方式

AnnotationConfigApplicationContext + @Configuration

创建一个类,给他加上@Configuration注解,给要创建的对象加上一个Bean注解(这里给以给定一个value/name值,这样子可以通过id查找,默认是方法名)

这里注意的是,当配置类很多的情况,我们可以直接传进去资源包,会通过扫包的形式,指定该包名即可,加载所有bean。

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry {...
}


都是基于ApplicationContext继承,看名字其实,确实很好,在以后大规模的时候就会知道他的优势,感觉越来越有趣了,哈哈哈

这里再补充一下,bean

什么是bean

可以这么说bean是计算机自动生成的类,Bean 是Spring框架中用于表示一个对象的术语,我感觉都挺对,但是和一般的对象不一样,他有他的规范:

  • 这个Java类必须具有一个无参的构造函数
  • 属性必须私有化。
  • 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。

接下来介绍一些注解

@Component注解

作用是将一个 Java 类标识为 Spring 的组件(Bean) 注解可以用于标记任何一个普通的 Java 类,并将其纳入 Spring 管理

@value注解

直接赋值

@Value("localhost:8080")
String url;

@Autowired注解

装配,自动装配,不光能创建单个对象,还能完成对象之间的关系注入

@Data
@Component
public class DataConfig{
@Value("localhost:3306")
private Sting url;
@Value("Driver")
private Sting driverName;
@Value("root")
private Sting username;
@Value("root")
private Sting password;
}
@Data
@Component
public class GlobalConfig{
@Value("8080)
private String port
@Value("/")
private String path;
@Autowired
private DataConfig dataConfig;
}

有了这个注解,当ioc容器中存在这两个对象,就可以在全局中获取这个DataConfig,根据类型获取(byType),也可以根据名称加上一个(@Qualfiler("name")专门取名字的一个注解,就回会去找改类型为这个名称的注解进行对应,如果没找到,会报错)。

AOP

面向切面编程,抽象化的面向对象的编程,面向对象的补充,以打印日志为例,当我们打印日志和业务当面重叠时(即耦合度很高的情况下,其实是不利于我们开发的),方法的开始的参数,解释的时候打印结果,会有重复的代码,统一的位置抽象起来,形成一个对象,一百个方法,只需要对应的位子,单独处理,自动更新。只保留核心的代码,进行一个分离

那怎么实现呢?

如果单纯使用方法,还得创建对象,其实是比较麻烦的

流程,一个对象,切面对象(即分离出来的某一部分),通过代理对象进行连接,先分离后整合的方式

@ASpect声明是一个参数

相关文章:

  • 【ROS2】虚拟机使用fishros脚本一键安装humble
  • Codeforces 1017 Div4(ABCDEFG)
  • 翻译:20250518
  • 【Python数据处理系列】输入txt,读取特定字符转换成特定csv数据并输出
  • C# String 格式说明符
  • C++模板进阶使用技巧
  • NY337NY340美光固态颗粒NC010NC012
  • wsl2中Ubuntu22.04配置静态IP地址
  • 基于STM32F103与Marvell88W8686的WIFI无线监控视频传输系统研发(论文)
  • 1.5 MouseDown,MouseUp,LostMouseCapture的先后顺序
  • 三、高级攻击工具与框架
  • OpenHarmony SIM卡信号值整体流程分析
  • 【Vue篇】数据秘语:从watch源码看响应式宇宙的蝴蝶效应
  • 仿腾讯会议——退出房间
  • spark数据处理练习题详解【上】
  • STM32 OTA 中断向量表重定向
  • Node.js 框架
  • 数组-长度最小的子数组
  • USB接口介绍
  • dijkstra算法加训上 之 分层图最短路
  • 大学2025丨专访西湖大学副校长邓力:如何才能培养“不惧未知”的创新者
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠,女子跳高刘肼毅折桂
  • 新城悦服务:独董许新民辞任,新任独董与另两人组成调查委员会将调查与关联方资金往来
  • 昔日千亿房企祥生集团约2.03亿元债权被拍卖,起拍价8000万元
  • 梅花奖在上海|舞剧《朱鹮》,剧里剧外都是生命的赞歌
  • 奥古斯都时代的历史学家李维