[Spring]Method Injection

Avoiding ‘this‘ Pitfalls: Leveraging Dependency Injection for Transactional Method Calls in Spring 本文深入探讨了Spring框架中常见的‘this’调用陷阱,它会导致@Transactional等AOP注解失效。通过分析Spring AOP代理机制,文章重点介绍了利用依赖注入(Dependency Injection)来正确调用事务方法的两种最佳实践:自我注入(Self Injection)和使用AopContext,从而确保事务传播行为按预期工作。 阅读详情

Spring-framwork 提供了一种基于方法级的注入方式

考虑一种情况,一个singleton A 和一个 prototype B,A中有一个方法每次执行的时候都需要一个B的实例,由于Spring容器在初始A的时候已经初始好一切,那么这个时候如何做到每次执行该方法的时候,提供一个依赖B呢?


解决有两种方法:

1.通过实现 ApplicationContextAware 接口,硬编码实现每次调用该方法的时候注入一个实例B,然而这种方法会使代码和注入过程耦合在一起

2.提供一个abstract方法,Spring使用CGLIB重写抽象方法提供注入 (Method Injection)

方法注入,提供了方法级的注入方式,保证每次执行到该方法的时候都会提供一个新的B实例来使用,由Spring容器通过配置完成解耦工作。


Command接口:

package com.interfaces;

public interface Command {
	void setState(String commandState);
	String execute();
}

Command实现:

package com.domain;

import com.interfaces.Command;

public class AttackCommand implements Command {
	private String commandState;
	private static int count = 0;
	private final int id = count++;
	public AttackCommand() {
		System.out.println("command init");
	}

	public String execute() {
		return "Attack Command " + id + ": starting attack " + commandState;
	}


	public void setState(String commandState) {
		this.commandState = commandState;
	}
}


Method 1:

package com.domain;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import com.interfaces.Command;

public class CoupleCommandManager implements ApplicationContextAware {
	private ApplicationContext applicationContext;

	public String process(String commandState) {
		Command command = createCommand();
		command.setState(commandState);
		return command.execute();
	}

	protected Command createCommand() {
		return applicationContext.getBean("attackCommand", Command.class);
	}

	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext = applicationContext;
	}

}



Method 2:

package com.domain;

import com.interfaces.Command;

public abstract class CommandManager {
	public String process(String commandState){
		Command command = createCommand();
		command.setState(commandState);
		return command.execute();
	}
	
	protected abstract Command createCommand();
	
}

xml配置文件

	<bean id="attackCommand" class="com.domain.AttackCommand" scope="prototype"/>
	
	<bean id="coupleCommandManager" class="com.domain.CoupleCommandManager"></bean>
	<bean id="commandManager" class="com.domain.CommandManager">
		<lookup-method name="createCommand" bean="attackCommand"/>
	</bean>


java cfg:

 @Bean
	@Scope("prototype")
	public Command attackCommand() {
		return new AttackCommand();
	}

	@Bean
	public CommandManager commandManager() {
		return new CommandManager() {

			@Override
			protected Command createCommand() {
				return attackCommand();
			}
		};
	}




2023-11-20 MySQL ARM64 银河麒麟 背景 MySQL是常用数据库,Windows安装比较容易,笔者也有记录。现在国产化系统银河麒麟中安装,不同的是软件安装包不容易下载。一是安装的方式,再一个是MySQL本身的版本,网上很多文档说明其实都是对的,但是为什么那么多都不一样呢?就是MySQL本身的版本差异比较大,这些差异笔者也不是很清楚,但是不要用8和5.7的差异非常大,8即使安装的很顺利,在使用过程也会很多坑,导致我宁愿卸载8,也要重新... 阅读详情

相关推荐

用Java和MQTT搞定大疆无人机自动巡检:一个真实机场项目的踩坑与优化记录

本文详细介绍了如何利用Java和MQTT协议实现大疆无人机在机场自动巡检系统的开发与优化。通过实战案例分享系统架构设计、通信协议选型、断线重连机制及数据通道优化等关键环节,帮助开发者解决GPS信号漂移、MQTT消息风暴等典型问题,提升系统性能和可靠性。

weixin_30275415的博客 495

Spring 自动装配和 Method Injection(方法注入)

在顶层 标签中,default-autowire-candidates 属性可以接受多种模式,例如,限制名称以 Repository 结尾 bean 才能进行自动装配,可以配置这个属性的值为:*Repository,如果需要提供更多模式,可以用逗号分隔符在列表中定义他们。当一个单例 bean 需要与另一个单例 bean 的协作,或者一个非单例 bean 需要与另一个非单例 bean 的协作时,通常通过将一个 bean 定义为另一个 bean 的属性来处理依赖关系。

swadian2008的博客 569

Sentinel--哨兵系列数据下载地址及流程更新【202310】

哨兵系列数据下载地址及流程更新。哨兵系列卫星作为哥白尼计划的一部分,主要目标便是对地球的观测任务。哥白尼计划由三部分组成:空间部分(哨兵系列太空任务与其他太空机构任务)、测量部分(提供海洋、大陆表面和大气信息的陆基和机载数据收集网络)、数据管理与全球共享。

twg666的博客 3万+

Spring基础——方法注入(Method Injection)

描述Spring中实现方法注入

NoBugNoLife的博客 1060

31、MSP430FR2355时钟系统与低功耗模式解析

本文详细解析了MSP430FR2355的时钟系统和低功耗模式。首先介绍了时钟系统的组成,包括XT1振荡器、DCO、MODCLK、MCLK、SMCLK和ACLK的功能与配置方法。接着探讨了MSP430FR2355的五种低功耗模式及其配置要点,并分析了时钟系统与低功耗模式之间的协同关系。最后通过实际应用案例展示了如何在具体场景中优化系统功耗。文章旨在帮助开发者充分利用MSP430FR2355的时钟与低功耗特性,实现高性能、低功耗的嵌入式系统设计。

mars5的博客 195

Python编程基础05:运算符与表达式

文章目录一、算术运算符1、分类说明表2、注意事项3、案例演示任务1、计算成绩差与平均成绩课堂练习:编程处理带余除法。任务2、打印购物小票 运算符就是专门用于告诉程序执行特定运算或逻辑操作的符号。表达式是指由常量、变量和运算符组成的一个算式。编写程序对数据进行处理,其实处理就是对数据实施各种各样的运算,搞懂运算符与表达式是我们编写程序的基础性工作,本次讲课笔记通过案例讲解各种运算符的用法以及正确书写Python表达式的注意事项。 一、算术运算符 Python中的算术运算符就是用来处理四则运算的符号,也是

howard2005的专栏 3119

Spring IoC容器:方法注入(Method Injection)

Spring IoC容器:方法注入(Method Injection)

听海边涛声 980

头歌OpenGauss数据库-G.视图的使用

OpenGauss数据库-G.视图的使用

python一生之敌的博客 1383

码农小汪-spring框架学习之3-spring Method injection(方法注入 ) Lookup method injection

方法注入 单例依赖非单例一般情况,容器中的大部分的 bean 都是单例的。当单例 bean 依赖另一个单例bean,或者一个非单例 bean 依赖另个非单例 bean 是,通常是将另一个 bean定义成其他 bean 的属性。当 bean 的生命周期不同时,那么问题来了。假设单例 bean A 依赖非单例 bean(prototype) B,也许会在每个方法里都需要 B。容器之创建了一个单例 be

汪小哥 2707

上位机图像处理和嵌入式模块部署(qmacvisual入门)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 虽然我们前面学习了很多的知识点,比如说在windows这边,用qt写界面,用opencv写图像处理代码;在linux这边先用树莓派测试,最后再部署到自己的平台上面。但是,对于一个商业软件是怎么运行的,很多时候我们心理还是没有底,或者说,自己写的软件距离一个商业软件还有多远,大部分学习的同学是不知道的。 就算有的同学说,这个时候可以借鉴一下vision pro,或者是

嵌入式-老费,一个分享专业嵌入式知识的blog 1227

[Python图像处理] 二.OpenCV+Numpy库读取与修改像素

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 同时推荐作者的C++图像系列知识: [数字图像处理] 一.MFC详解显示BMP格式图片 [数字图像处理] 二.MFC单文档分...

杨秀璋的专栏 3万+

Spring之Method Injection

对于Spring的多数用户而言,主要的Bean存在形式都是单例,当一个单例需要结合另一个单例协作或者一个非单例与另一个非单例协作时,典型的做法是通过属性的形式注入,但是当两个Bean的声明周期不同时候这会存在一个问题。例如单例A依赖一个非单例B,而对外提供的服务是通过A暴露的,这样的话每一次调用A的方法时候都不会更新实例B,这将会导致问题(因为A的属性只在初始化时候被设置一次,之后不再被设置)。对...

weixin_30293135的博客 243

基于FPGA的万兆以太网学习(1)

万兆(10G) 以太网测速视频:SFP+屏蔽笼可以插入千兆或万兆光模块。SFP+信号定义与 SFP 一致。

baidu_34971492的博客 2249

Spring方法注入(Method Injection)&方法替换(Method Replacement)

Spring方法注入&方法替换(偷梁换柱) 引子 含FXNewsBean类型成员变量的MockNewsPersister的定义: public class MockNewsPersister implements IFXNewsPersister { private FXNewsBean newsBean; public void persistNews(FXNe...

weixin_34177064的博客 568

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring3之 bean Method injection

Method injection(方法注入) bean都是singleton类型的。如果一个singleton bean要引用另外一个singleton bean,或者一个非singleton bean要引用另外一个非singleton bean时,通常情况下将一个bean定义为另一个bean的property值就可以了。不过对于具有不同生命周期的bean来说这样做就会有问题了,比如在调用一个s...

笃行之 208

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

《Pro Spring》学习笔记之Loopup Method Injection(查找方法注入)

 package ch5.LookupMethod;public interface DemoBean ...{  public MyHelper getmyHelper();  public void someOperation();}Spring使用CGLIB的动态字节码增强功能,所以,必须要加入CGLIB包当Bean依赖另一个生命周期不同的bean,尤其是当singlet

我的世界我的梦 2550

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

《Spring 技术手册》3.2.6 Lookup Method Injection 笔记

<br />按照书上的实例程序运行时,抛出BeanCreationException。是因为没有引用一个jar包<br /> Spring的lookup method injection功能需要在运行时创建一个抽象类的subclass然后动态的注入抽象类里面定义的抽象方法的实现。Spring依靠CGLIB实现的这个功能。而CGLIB又依赖于objectweb的ASM。所以如果想在Spring里使用lookup method injection功能需要引用的jar包如下。<br />cglib-2.2.jar

phyllis518liu的专栏 1306

spring Method injection Lookup method injection

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34240520的博客 111

方法注入(Method Injection)

Method injection更容易理解的翻译方式是通过方法注入。先不说什么是method injection,先通过一个问题(从官方文档翻译而来),引入method injection。 提出问题 一个单例bean A,如果依赖非单例的bean B(B被注入到A中);对于A来说,B就是一个单例的bean。因为不论使用构造器、setter或工厂方法注入,只会注入一次,现在想要的结果就...

qq2071114140的博客 1893

【Spring】 Rod Jason 关于引入Method Injection 的帖子

http://blog.springsource.org/2004/08/06/method-injection/ Method Injection   Posted on August 6th, 2004 by Rod Johnson in Spring. A couple of months ago, in the d

杜汪洋的专栏 986

Spring方法注入method_injection

  package com.astute.sparrow.spring.ioc.method_injection; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org...

Legend的专栏 319

summary of Spring method injection

Method Injection was introduced in Spring 1.1, which comes in two loosely related forms, Lookup Method Injection and Method Replacement. Lookup Method Injection It's added to overcome the problems enc...

SilverRing 134

Spring框架下Bean的方法注入(Method injection)

通常情况下我们在spring中定义的常用bean都是单例模式(singleton)的例如@Service、@Controller定义的bean,任何一个类都只有一个对象,只进行一次初始化这些类的属性永远是最后一次调用它时的值。但是针对不同的业务场景我们可能会定义一些bean,这些bean的属性在不同场景下它的属性值是不同的,因此这时候我们就不能使用单例模式了而使用原型模式(prototype),这...

看山 看水 看世界 2973

Spring Extension (2) — Annotation RequestAttribute for Controller method Parameter Injection

场景: 在SpringMVC3.x 中一个http 请求被controller handler处理的时候,需要将请求中的某些参数根据特定的逻辑生成一些特定的数值供每个controller handler使用。这个特定的逻辑可以抽取到SpringMVC Interceptor中,然后将计算的特定数据以HttpServletRequest.attribute的方式传送到controller hand

New World 5273

Spring查找方法注入(Lookup method injection)的底层实现原理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34220963的博客 1083
上一篇: [I0A]链表-单链表
下一篇: [Spring]Resource
HeapStackk
博客等级 码龄12年 11粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值