Spring_构造注入&注解注入&代理模式&AOP

Spring 注入的几种方式以及含义原理 今天遇到一个问题,就是在websocket中无法调用我通过@Autowired 字段注入的对象,然后回头恶补了一下Spring相关姿势首先先解释一些基础定义。 阅读详情

1 依赖注入

概念:
一个类里面依赖于另外一个类,然后spring把类的对象创建出来,然后注入到相应的类里面过程

1.1 依赖注入方式

1.1.1 普通set注入
//普通注入
private Long id;
private String name;
private Boolean sex;
private BigDecimal salary;
<property name="id" value="1"></property>
<property name="name" value="xx"></property>
<property name="sex" value="true"></property>
<property name="salary" value="10000"></property>
1.2 数组注入
//数组注入
private String[] arrays;
<!--注入数组-->
<property name="arrays" value="1,2,3"></property>
<property name="arrays">
    <array>
        <value>a</value>
        <value>1</value>
        <value>2</value>
        <value>3</value>
        <value>4</value>
    </array>
</property>
1.3 List /Set Map 集合注入
//集合
private List<String> list;
private List<OtherBean> otherBeanList;
private Set<String> set;
private Set<OtherBean> otherBeanSet;
//map注入
private Map<String,String> map = new HashMap<String, String>();
<!--list注入-->
<property name="list">
    <list>
        <value>111</value>
        <value>222</value>
        <value>111</value>
    </list>
</property>
<property name="otherBeanList">
    <list>
        <bean class="cn.itsource._01_di.OtherBean"></bean>
        <bean class="cn.itsource._01_di.OtherBean"></bean>
        <ref bean="otherBean"></ref>
        <ref bean="otherBean"></ref>
    </list>
</property>
<!--set注入-->
<property name="set">
    <list>
        <value>111</value>
        <value>222</value>
        <value>111</value>
    </list>
</property>
<property name="otherBeanSet">
    <list>
        <bean class="cn.itsource._01_di.OtherBean"></bean>
        <bean class="cn.itsource._01_di.OtherBean"></bean>
        <ref bean="otherBean"></ref>
        <ref bean="otherBean"></ref>
    </list>
</property>
<!--map注入-->
<property name="map">
    <map>
        <entry key="key1" value="pp"></entry>
        <entry key="key2" value="xx"></entry>
    </map>
</property>
1.4 Properties 注入
//Properties
private Properties p1;
private Properties p2;
<!--Properties配置-->
<property name="p1">
    <props>
        <prop key="key1">pp</prop>
        <prop key="key2">测试2</prop>
    </props>
</property>
<!--不支持中文-->
<property name="p2">
    <value>
        key1=value1
        key2=测试2
    </value>
</property>
1.5 xml注入方式

自动注入 -->ByName ByType
全注解方式注入:

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

2 AOP

2.1 什么是AOP

概念:
AOP:它是spring的一种实现,面向切面编程
面向切面编程概念:
它的产生并不是去取代面向对象,而是对面向对象进行扩展,可以按照一定的方式,把类切开(切到方法上面),可以往方法前后添加一些逻辑
AOP使用场景
事务管理 日志管理 性能监控 拦截器

2.2 AOP术语

  1. 连接点(Joinpoint):程序执行的某一个特定位置,如类初始前后,方法的运行前后。而Spring只支持方法的连接点。
  2. 切点(Pointcut):切点可以定位到相应的连接点,一个切点可以定位多个连接点。
  3. 增强(Advice):又被称为通知,完成逻辑的增强。
  4. 目标对象(Target):增强逻辑织入的目标类。
  5. 引介(Introduction):特殊的增强,为类添加一些属性和方法。
  6. 织入(Weaving): 将增强添加到目标类的具体连接点上的过程。Spring使用动态代理织入。
  7. 代理(Proxy):一个类(原类)被织入增强(逻辑)后,就产生一个结果类,称为代理类。
  8. 切面(Aspect):由切点和增强组成

3 AOP实现

3.1 添加aop命名空间

xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

3.2 前置增强(通知)

<aop:config>
	<aop:pointcut expression="execution(* cn.itsource.aop.I*Service.*(..))" id="pointcut" />
	<aop:aspect  ref="txManager">
		<!-- 前置通知 -->
		<aop:before method="begin" pointcut-ref="pointcut"/>
	</aop:aspect>
</aop:config>

在这里插入图片描述

3.3 环绕增强

public class TxManager {
    public void begin(){
        System.out.println("开启事物");
    }
    public void commit(){
        System.out.println("提交事物");
    }
    //Throwable 异常对象 所有异常的父类
    public void rollback(Throwable e){
        System.out.println("回滚事物" + e.getMessage());
    }
    public void close(){
        System.out.println("关闭事物");
    }
    //环绕通知
    public void around(ProceedingJoinPoint joinPoint){
        //去执行方法
        String name = joinPoint.getSignature().getName();
        try {
            if (name.equals("find") || "query".equals(name)){
                joinPoint.proceed();
            }else {
                begin();
                joinPoint.proceed();
                commit();
            }
        } catch (Throwable e) {
            e.printStackTrace();
            rollback(e);
        }finally {
            if (name.equals("find") || "query".equals(name)){
            }else {
                close();
            }
        }
    }
}
<!--aop配置-->
<aop:config>
    <!--pointcut 切点 IUserService IPersonService 接口上面方法前面-->
    <aop:pointcut expression="execution(* cn.itsource._04_xmlaop.I*Service.*(..))" id="pointcut" />
    <!-- aspect方面或者切面-->
    <aop:aspect  ref="txManager">
        <!--&lt;!&ndash; 前置通知 &ndash;&gt;
        <aop:before method="begin" pointcut-ref="pointcut"/>
        &lt;!&ndash; 后置通知&ndash;&gt;
        <aop:after method="close" pointcut-ref="pointcut"/>
        &lt;!&ndash; 异常通知&ndash;&gt;
        <aop:after-throwing method="rollback" throwing="e" pointcut-ref="pointcut"/>
        &lt;!&ndash; 最终通知&ndash;&gt;
        <aop:after-returning method="commit" pointcut-ref="pointcut"/>-->
        <!-- 环绕通知-->
        <aop:around method="around" pointcut-ref="pointcut"/>
    </aop:aspect>
</aop:config>

<bean id="txManager" class="cn.itsource._04_xmlaop.TxManager"></bean>

3.4 注解版

@Component
@Aspect //AOP的类注解
public class TxManager {
	//设置切点
	@Pointcut("execution(* cn.itsource.aopanno.I*Service.*(..))")
	public void pointcut(){}
	//前置通知
	@Before("pointcut()")
	public void begin(){
		System.out.println("开启事务....");
	}
	//后置通知
	@AfterReturning("pointcut()")
	public void commit(){
		System.out.println("提交事务...");
	}
	//异常通知
	@AfterThrowing(pointcut="pointcut()",throwing="e")
	public void rollback(Throwable e){
		System.out.println("回滚事务....");
		System.out.println(e.getMessage());
	}
	//最终通知
	@After("pointcut()")
	public void close(){
		System.out.println("关闭资源....");
	}
}

环绕通知方法:
//温馨提醒:如果要使用环绕通知的话,把其它几个通知的注解去掉(不然会出现重复)
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint){
	Object object = null;
	try {
		begin();
		object = joinPoint.proceed(); //执行相应的代码
		commit();
	} catch (Throwable e) {
		rollback(e);
	}finally{
		close();
	}
	return object;
}
<!-- 支持aop注解 -->
<aop:aspectj-autoproxy />

4 AOP代理模式

代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

在这里插入图片描述

4.1静态与动态代理

详见:https://blog.youkuaiyun.com/Java_pipixia/article/details/97812785

springboot中的 动态代理的选择测试代码 测试springboot使用动态代理时候的一些代码,具体参考博客http://blog.youkuaiyun.com/maoyeqiu/article/details/76546468 立即下载

相关推荐

OpenClaw 最强技能 self-improving-agent 详解:让 AI 从错误中自主学习

self-improving-agent 是 OpenClaw 生态中最受欢迎的技能插件,下载量突破 268k。它能让 AI 记住犯过的错误和解决方案,实现持续自我改进。本文深入讲解其工作原理、安装配置和实战案例。测试数据显示:部署流程时间从 15 分钟降到 2 分钟(87%↓),API 调试时间从 2 小时降到 20 分钟,数据库查询编写时间减少 90%。文章包含完整架构图、配置文件示例、3 个详细实战案例和性能测试数据,适合开发者、运维和数据分析师使用。

qq_38610923的博客 3633

Spring-构造注入&注解注入&代理模式&AOP

Spring-构造注入&amp;注解注入&amp;代理模式&amp;AOP 一、spring的依赖注入方式 什么叫做注入? 一个类里面依赖于另外一个类,然后spring把类的对象创建出来,然后注入到相应的类里面过程 1.普通的注入 1)普通 set方法注入 ​ setName(String name) &lt;property name="name" value="xxxx"&gt; 2.构造参...

sdadaada的博客 405

【汽车ECU标定技术解析】DCM文件与A2L、HEX的协同工作机制

本文深入解析了汽车ECU标定中DCM、A2L与HEX三大核心文件的协同工作机制。A2L文件作为定义标定变量地址与规则的“图纸”,DCM文件承载工程师调试后的具体标定数据,最终通过A2L的地址映射,将DCM数据固化生成可刷入ECU的HEX文件,形成完整的标定数据流转闭环。

weixin_29214559的博客 436

动态代理

动态代理是采用JDK或第三方jar包动态生成代理类的一种代理模式,常用的第三方的有CGLib,动态代理比静态代理使用更方便,使用场景也更多,多用于AOP场景做前置或后置统一控制 JDK自带的代理类,是基于接口来生成的,所以必须传入具体接口才能动态生成代理类,并且还需要传入处理方法InvocationHandler,这样动态生成的代理类才知道怎么处理,动态代理是基于反射实现的,其类都位于反射...

weixin_30758821的博客 94

C#报表,使用微软rdlc模板,生成Excel, PDF, Word, Image文件,使用自定义对象做数据集不连接数据库

我项目是用vs2017 建的,.NET farmwork 4.7.2 这种报表可以用于任何模式的应用,web,桌面,因为这只是生成一个文件或者文件流 步骤比较详细啰嗦,其中有讲到rdlc怎么新建设计,如果已经会设计rdlc了的可以直接跳到底部看代码的执行结果, 底部还有源码下载链接,百度盘 首先控制台安装报表包 新建rdlc 报表 建立rdlc里要用的数据模型 模型建完,或者修改都要重新...

qq_35955916的博客 5202

MATLABGUI读取文件并将路径显示在文本框中

MATLABGUI读取文件并将路径显示在文本框中

m0_50305149的博客 2649

2.Spring常用注解,以及aop原理

​@Component:组件.(作用在类上) 属性注入的注解:(使用注解注入的方式,可以不用提供 set 方法.) Bean 的作用范围的注解: Bean 的Th命周期的配置: Spring 的 Bean 管理的方式的比较: XML 和注解: XML :结构清晰. 注解 :开发方便.(属性注入.)   实际开发中还有一种 XML 和注解整合开发: * Bean...

bestkilly的博客 970

【YOLOv8科研级优化】基于YOLOv9的GELAN模块重构C2f架构,显著提升模型精度与推理效率

打开确保模型解析器能识别GELANBlock模块。通过将YOLOv9的GELAN模块集成到YOLOv8的C2f模块中,我们实现了一个“强特征表达+高效计算”的目标检测模型。这个改进不仅在工程上能提升复杂场景下的检测效果,更在科研上提供了“多分支特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的改进中,帮你在论文中打造独特的研究点。

FJN110的博客 110

java基础之注解反射静态代理和动态代理

注解 反射

qingwangwang的博客 266

【报错解决】OpenClaw 报错 ENOENT: no such file or directory, open ‘/root/.npmrc‘:配置文件路径不存在

本文分析了OpenClaw平台在国产操作系统环境下运行时出现的ENOENT: no such file or directory, open '/root/.npmrc'错误。该问题源于容器环境中root用户的npm配置文件缺失,导致插件依赖安装失败。文章详细解释了npm配置加载机制和容器环境的特殊性,提出了四种解决方案:手动创建配置文件、写入基础配置、使用全局配置替代以及容器启动时自动初始化。最后指出该错误暴露了工程中对默认路径盲目信任的问题,强调显式声明运行环境依赖的重要性。

博客 2015

【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。

qq_35635374的博客 2597

Spring构造注入&注解注入&AOP

一、依赖注入 1.导包 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio...

Yuncoco的博客 1620

Android性能分析深度指南:Perfetto工具全面解析

本文深入探讨Android性能优化工具Perfetto的应用与实践。作为Google推出的新一代追踪系统,Perfetto整合了CPU调度、内存分配、电池状态等多维度分析功能,通过高性能数据处理和可视化界面帮助开发者定位性能瓶颈。文章系统介绍了Perfetto的架构原理、配置方法和核心功能,包括CPU性能分析、内存泄漏检测等关键技术。通过电商应用卡顿优化的实战案例,展示了如何利用数学建模(如帧时间公式$T_{\text{render}}\leq16.67\text{ms}$)指导性能调优。

郑伟强dev的专栏 144

Spring注解&代理模式&AOP

文章目录Day40 Spring注解&amp;代理模式&amp;AOPSpirng注解什么是SpringSpring的两大核心编程思想依赖注入普通注入XML方式自动注入全注解注入@Autowired 与 @Resource的区别AOP代理模式分类AOP术语(了解)配置静态代理AOP的配置 Day40 Spring注解&amp;代理模式&amp;AOP Spirng注解 什么是Spring Spr...

风华流沙君莫笑的博客 486

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring-注解&代理模式&AOP

Spring+SpringMVC+SpringDataJpa: 一.Spring的回顾 概述:Spring是一个轻量级的DI/IOC与AOP的容器框架 BeanFactory与ApplicationContext的区别? 都是接口,ApplicationContext是BeanFactory的子接口,拥有更多的功能与方法。ApplicationContext是在启动容器创建上下文环境的时候...

Aydxz的博客 458

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring - 注解&代理模式&AOP

Spring - 注解 代理模式 AOP 一、Spring与导包 (一)Spring概述 轻量级的DI/IOC与AOP的容器框架 (二)BeanFactory与ApplicationContext的区别 ApplicationContext是BeanFactory的子类,它拥有更加强大的一些方法(邮件、国际化…),BeanFactory创建的Bean默认是懒加载,Applicat...

EstherLty的博客 324

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Spring Boot @Lazy注解在构造函数参数中失效深度解析

摘要 Spring Boot中@Lazy注解在构造函数参数上失效问题主要表现为:依赖被立即初始化、循环依赖未解决及代理类型转换异常。核心原因包括构造函数解析顺序问题、@Autowired干扰、代理模式限制等。可通过详细日志配置(设置org.springframework.beans.factory为DEBUG级别)和使用诊断工具(如ConstructorInjectionDiagnostic)进行分析。诊断方法包括检查构造函数参数上的@Lazy元数据标记和验证实际Bean实例的延迟依赖情况。该问题在Spri

深山技术宅的博客 1348

B057-spring增强 依赖注入 AOP 代理模式 创建Bean

spring增强 依赖注入 AOP 代理模式 创建Bean

窗外有风景,笔下有前途,低头是题海,抬头是未来 1037

依赖注入(DI)&Aop实践

Spring依赖注入&amp;AOPSpringIoC (Inversion of Control)DI(Dependency Injection)依赖注入(DI)的实现构造器注入属性注入自动匹配XMl配置全注解自动注入自动装配属性注解:AOP(面向切面编程)Spring实现Aop方案:手动配置Aop注解Aop全注解实现(动态代理)获取Bean对象的方式FactoryBean和 BeanFacto...

weixin_45389591的博客 577

反射,注解与Spring

Spring Spring的启动过程 调用ContextLoader的初始化方法创建webApplicationContext上下文环境 加载Spring配置文件中的Bean对象【refresh方法】 将webApplicationContext放入ServletContext【java web全局变量】 反射 Reflection 反射机制允许程序执行期间获取类的任何内部信息。 反射的作用 在运行时可以知道任意一个类的所有属性,方法,并可以改变他的属性,应用在各种框架 反射的原理 java是一

古川熊灰的博客 569

Spring在实际开发中的运用

文章目录一 Spring在实际开发中的运用1.1 什么是Spring1.2 导包二 构造器注入2.1 根据下标进行引入2.2 根据名称进行引入2.3 根据类型进行引入2.4 自动进行引入2.5 在其它的bean的方式三 属性注入3.1 普通属性3.2 集合3.3 数组与properties四 XML的自动注入(了解即可)五 全注解(重要)5.1 扫描相应的包5.2 在相应的类上加注解5.3 如果出...

蔡茂的博客 1635

Spring---Spring概述,IOC,依赖注入(DI),Bean的作用域,自动装配,注解开发,JavaConfig,代理模式,AOP,Mybatis-Spring

Spring个人向笔记一.Spring概述及IOC1.1 简介1.2 框架特征1.3 IOC概述1.3.1分析原理1.3.2 IOC本质1.3.3 IOC在Spring中二.Spring快速上手2.1 需要的依赖(汇总)2.2 基本配置文件beans.xml2.3 第一个Spring程序2.4 Spring改造1.3程序(IOC)2.5 聊聊Spring配置内容2.5.1 别名2.5.2 Bean配置2.5.3 import三.依赖注入(DI)3.1 概念3.2 构造器注入(官方推荐)3.3 set方式注

化身强盗的博客 693

Spring依赖注入Bean流程及其理解

本文介绍了Spring框架中的依赖注入机制及其实现原理。主要内容包括: 依赖注入方式:推荐使用@RequiredArgsConstructor + final字段的构造函数注入方式,避免使用@Autowired等注解。 生命周期管理:在单例模式下,Bean与其依赖具有相同的生命周期,创建时注入后引用一直有效。 代理模式实现:详细讲解了Spring如何通过自动生成代理类来实现AOP功能,包括事务管理等场景。 注入流程解析:从启动期扫描BeanDefinition到运行期依赖注入的完整过程,特别说明了代理对象的

Lemonyuki的博客 697

Spring 依赖注入、AOP代理

例如早期的EJB 2.x,要求业务类必须继承特定父类或实现指定接口(如。

2301_80096362的博客 843
上一篇: 23种设计模式—代理模式
下一篇: Spring_SSJ集成
虞铭轩、
博客等级 码龄7年 3粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值