Spring基础总结(中)

news/2024/9/19 11:03:43/

13. 实现 AOP 的方式

  1. 通过 ProxyFactory 实现,注意这和 Proxy 不同,如下的 User 类不需要实现接口
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(new CService());proxyFactory.addAdvice(new MethodInterceptor() {public Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("Before ...");Object result = invocation.proceed();System.out.println("After ...");return result;}
});CService cService = (CService) proxyFactory.getProxy();
cService.print();
  1. 通过定义 ProxyFactoryBean
@Bean
public ProxyFactoryBean cServiceProxy() {ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();proxyFactoryBean.setTarget(new CService());proxyFactoryBean.addAdvice(new MethodInterceptor() {public Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("Before ...");Object result = invocation.proceed();System.out.println("After ...");return result;}});return proxyFactoryBean;}// 调用
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
CService cService = (CService) context.getBean("cServiceProxy");
cService.print();
  1. 通过 BeanNameAutoProxyCreator
@Bean
public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();beanNameAutoProxyCreator.setBeanNames("CService"); //此处可为通配符, 例如: CS*beanNameAutoProxyCreator.setInterceptorNames("myAroundAdvice"); // 拦截器的方法名beanNameAutoProxyCreator.setProxyTargetClass(true);return beanNameAutoProxyCreator;
}@Bean
public MethodInterceptor myAroundAdvice() {return new MethodInterceptor() {public Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("Before ...");Object result = invocation.proceed();System.out.println("After ...");return result;}};}// 调用
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
CService cService = (CService) context.getBean("CService");
cService.print();

注意:CService 上面要添加 @Component 注解,1) 和 2) 则不用

  1. 通过 DefaultPointcutAdvisor
@Bean
public DefaultPointcutAdvisor defaultPointcutAdvisor() {NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();pointcut.addMethodName("print"); // 指定要切面处理的方法DefaultPointcutAdvisor defaultPointcutAdvisor = new DefaultPointcutAdvisor();defaultPointcutAdvisor.setPointcut(pointcut);// 添加切面defaultPointcutAdvisor.setAdvice(new MethodInterceptor() {public Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("Before ...");Object result = invocation.proceed();System.out.println("Before ...");return result;}});return defaultPointcutAdvisor;
}// DefaultAdvisorAutoProxyCreator 也可以在 AppConfig 上面通过 @Import(DefaultAdvisorAutoProxyCreator.class) 引入
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();return defaultAdvisorAutoProxyCreator;
}// 调用
CService cService = (CService) context.getBean("CService");
cService.print();

注意:AppConfig 上面不要 @EnableAspectJAutoProxy 注解,否则会报错:com.sun.proxy.$Proxy19 cannot be cast to com.spring.demo.service.CService

14. Spring 中实现国际化

方式一:通过 applicationContext 获取

  1. 在 AppConfig 中添加如下代码
@Bean
public MessageSource messageSource() {ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();messageSource.setBasename("message"); // 配置文件前缀,可传入多个return messageSource;
}
  1. 在 src 目录下创建两个 properties 文件
  • message.properties 存放中文信息键值对: code = 测试
  • message_en.properties 存放英文信息键值对:code = test
  1. 调用测试
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 中文,此处其实是没有 message_en_CN.properties 配置文件,所以会取默认的 message.properties 中的值
String cnCode = context.getMessage("code", null, new Locale("en_CN"));
System.out.println(cnCode);
// 英文
String enCode = context.getMessage("code", null, new Locale("en"));
System.out.println(enCode);

方式二:自定义类实现 MessageSourceAware 接口

  1. 在 AppConfig 中添加如下代码
@Bean
public MessageSource messageSource() {ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();messageSource.setBasename("message"); // 配置文件前缀,可传入多个return messageSource;
}
  1. 新建 MessageSourceService 实现 MessageSourceAware 接口
@Component
public class MessageSourceService implements MessageSourceAware {@Resourceprivate MessageSource messageSource;public void setMessageSource(MessageSource messageSource) {this.messageSource = messageSource;}/*** 定义取值的方法*/public String getValue(String key, String env) {return messageSource.getMessage(key, null, new Locale(env));}
}// 调用
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MessageSourceService messageSourceService = (MessageSourceService) context.getBean("messageSourceService");
String cnCode = messageSourceService.getValue("code", "en_CN");
System.out.println(cnCode);String enCode = messageSourceService.getValue("code", "en");
System.out.println(enCode);

15. 获取运行时环境

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
ConfigurableEnvironment environment = context.getEnvironment();
System.out.println(environment.getSystemProperties());  // 获取系统运行时环境信息
System.out.println(environment.getSystemEnvironment()); // 获取系统信息
System.out.println(environment.getProperty("name")); // 获取application.properties 中的键值对

16. 事件发布

主要在 Spring 初始化完成后执行;实现方式有 3 种

  1. 定义一个 AppListener 类并实现 ApplicationListener 接口,实现其 onApplicationEvent 方法
@Component
public class AppListener implements ApplicationListener {public void onApplicationEvent(ApplicationEvent event) {if (event instanceof PayloadApplicationEvent) {PayloadApplicationEvent e = (PayloadApplicationEvent) event;System.out.println("1. " + e.getPayload());}}
}

使用 ApplicationContext 直接发布

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 发布事件
context.publishEvent("aaaaaaaaaa");
  1. 直接注入 ApplicationEventMulticaster
@Component
public class CService {@Resourceprivate ApplicationEventMulticaster applicationEventMulticaster;public void print() {// 在方法中执行如下代码发布applicationEventMulticaster.multicastEvent(new PayloadApplicationEvent <String> (this, "cccc"));System.out.println("CService print() method executed");}
}

调用 print 方法发布

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
CService cService = (CService) context.getBean("CService");
cService.print();
  1. 在方法上添加 @EventListener 注解
@EventListener
public void test(ApplicationEvent event) {if (event instanceof PayloadApplicationEvent) {PayloadApplicationEvent < String > e = (PayloadApplicationEvent < String > ) event;System.out.println("2. " + e.getPayload());}
}

17. 元数据读取器

public static void main(String[] args) throws IOException {SimpleMetadataReaderFactory simpleMetadataReaderFactory = new SimpleMetadataReaderFactory();MetadataReader metadataReader = simpleMetadataReaderFactory.getMetadataReader(CService.class.getName());ClassMetadata classMetadata = metadataReader.getClassMetadata();// 获取类名称System.out.println(classMetadata.getClassName());// 获取类注解AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();annotationMetadata.getAnnotationTypes().forEach(annotation - > System.out.println(annotation));
}

18. 获取 Spring 上下文用于获取项目初始化完成后的 Bean 对象

@Component
public class SpringContext implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {if(null == SpringContext.applicationContext) {SpringContext.applicationContext = applicationContext;}}public static ApplicationContext getApplicationContext() {return applicationContext;}public static Object getBean(String name){return getApplicationContext().getBean(name);}public static <T> T getBean(Class<T> clazz){return getApplicationContext().getBean(clazz);}public static <T> T getBean(String name, Class<T> clazz){return getApplicationContext().getBean(name, clazz);}public static Environment getEnvironment() {return applicationContext.getEnvironment();}
}

http://www.ppmy.cn/news/26772.html

相关文章

深度学习在视频多目标跟踪中的应用综述

文章目录摘要1、简介2、MOT:算法、指标和数据集2.1、MOT算法简介2.2、指标经典的指标完整的MOT指标ID 分数2.3、基准数据集3、MOT中的深度学习3.1、深度学习中的检测步骤3.1.1、Faster R-CNN3.1.2、SSD3.1.3、Other detectors3.1.4、cnn在检测步骤中的其他用途3.2、深度学习在特…

【MySQL】MySQL表的增删改查(进阶)

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;MySQL数据库&#x1f447; ✨算法专栏&#xff1a;算法基础&#x1f447; ✨每日一语&#xff1a;悟已往之不谏&#xff0c;知来者之可追。实迷途其未远&#xff0c;觉今是而昨非。 目 录&#x1f384;一. 数…

七大排序经典排序算法

吾日三省吾身&#xff1a;高否&#xff1f;富否&#xff1f;帅否&#xff1f;答曰&#xff1a;否。滚去学习!!!(看完这篇文章先)目前只有C和C的功底&#xff0c;暂时还未开启新语言的学习&#xff0c;但是大同小异&#xff0c;语法都差不多。目录&#xff1a;一.排序定义二.排序…

查询服务器tns文件路径,oracle数据库tns配置方法详解

查询服务器tns文件路径,oracle数据库tns配置方法详解 TNS简要介绍与应用 Oracle中TNS的完整定义&#xff1a;transparence Network Substrate透明网络底层&#xff0c; 监听服务是它重要的一部分&#xff0c;不是全部&#xff0c;不要把TNS当作只是监听器。 TNS是Oracle Net…

【单目标优化算法】烟花优化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

如何锁定Word文档部分文字不被修改

我们知道&#xff0c;想要保护Word文档的内容无法随意更改&#xff0c;可以设置“限制编辑”的保护模式。 那如果实际工作中&#xff0c;只需要固定的一部分内容不能编辑&#xff0c;可以实现吗&#xff1f;答案是肯定的&#xff0c;今天就来说说如何设置Word文档部分文字可修…

VS Code Spring 全新功能来了!

大家好&#xff0c;欢迎来到我们 2023 年的第一篇博客&#xff01;我们想与您分享几个与 Spring 插件、代码编辑和性能相关的激动人心的更新&#xff0c;让我们开始吧&#xff01; Spring 插件包的新入门演练 演练&#xff08;Walkthrough&#xff09; 是一种多步骤、向导式的体…

【软件测试】自动化测试该如何做?项目?技术团队?你真的会自动化吗......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 对于自动化测试&…

接入网关和隔离网关

文章目录1. 什么是网关&#xff1f;2. 网关的作用是什么&#xff1f;3. 接入网关和隔离网关1. 什么是网关&#xff1f; 网关&#xff08;Gateway&#xff09;是一种网络设备&#xff0c;通常用于将不同网络之间的流量进行转发和路由&#xff0c;将一个网络连接到另一个网络&…

第十三届蓝桥杯省赛 C++ A 组 F 题、Java A 组 G题、C组 H 题、Python C 组 I 题——青蛙过河(AC)

目录1.青蛙过河1.题目描述2.输入格式3.输出格式4.样例输入5.样例输出6.数据范围7.原题链接2.解题思路Ac_code1.C2.Java1.青蛙过河 1.题目描述 小青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里 的石头跳到对岸。 河里的石头排成了一条直线, 小青蛙每次跳跃…

双因素方差分析

一、案例与数据 一家大型商业银行在多地区设有分行&#xff0c;其业务主要是进行基础设施建设&#xff0c;国家重点项目建设&#xff0c;固定资产投资等项目的贷款。近年来&#xff0c;该银行的贷款额平稳增长&#xff0c;但不良贷款额也有较大比例的提高&#xff0c;这给银行…

C语言实现动态管理通讯录信息系统(静态通讯录plus版)

文章目录前言&#xff1a;一.动态管理思想1.通讯录结构体声明发生变化2.通讯录结构体初始化发生变化3.通讯录能够动态增容4.通讯录销毁数据二.优化通讯录可持续读写信息1.保存通讯录中的信息到文件中2.加载文件信息到通讯录中三.源码1.text.c2.contact.c3.contact.h前言&#x…

数据结构与算法系列之kmp算法

什么是kmp算法 1.kmp算法是一种改进的字符串算法&#xff0c;其核心是利用匹配失败后的信息&#xff0c;尽量减少模式串与主串的匹配次数已达到快速匹配的目的。 它主要实现作用的是 在 &#xff08;主串&#xff09;中找到 &#xff08;匹配&#xff09;字符串。 例 BF算法与k…

华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】

使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12201821.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 分糖果 小明从糖果…

HTTP安全与HTTPS协议

目录 Http协议的安全问题 常见的加密方式 防止窃听 单向散列函数 单向散列值的特点 加密与解密 对称加密与非对称加密 对称加密的密钥配送问题 密钥配送问题的解决 非对称加密 前言&#xff1a; 公钥与私钥 非对称加密过程 混合密码系统 前言&#xff1a; 混合…

各类热门免费API合集

1、数据智能 身份证识别OCR&#xff1a;传入身份证照片&#xff0c;识别照片文字信息并返回&#xff0c;包括姓名、身份证号码、性别、民族、出生年月日、地址、签发机关及有效期。 通用文字识别OCR&#xff1a;多场景、多语种、高精度的整图文字检测和识别服务&#xff0c;多…

万物皆可集成资源包!低代码集成系列一网打尽

如何花最短的时间、用最少的成本解决客户的企业级应用定制问题&#xff1f; 如何满足数据库集成、Web API集成、第三方软件集成等需求&#xff0c;在如今万物皆可盘的当下&#xff0c;低代码如何用积木大玩具的方式快速构建各种应用&#xff0c;实现“万物皆可集成”&#xff…

react源码中的fiber架构

先看一下FiberNode在源码中的样子 FiberNode // packages/react-reconciler/src/ReactFiber.old.js function FiberNode(tag: WorkTag, pendingProps: mixed, key: null | string, mode: TypeOfMode, ) {// Instancethis.tag tag;this.key key;this.elementType null;t…

【LeetCode每日一题】【2023/2/9】2341. 数组能形成多少数对

文章目录2341. 数组能形成多少数对方法1&#xff1a;哈希表2341. 数组能形成多少数对 LeetCode: 2341. 数组能形成多少数对 简单\color{#00AF9B}{简单}简单 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个…

react源码中的hooks

今天&#xff0c;让我们一起深入探究 React Hook 的实现方法&#xff0c;以便更好的理解它。但是&#xff0c;它的各种神奇特性的不足是&#xff0c;一旦出现问题&#xff0c;调试非常困难&#xff0c;这是由于它的背后是由复杂的堆栈追踪&#xff08;stack trace&#xff09;支…