spring 提供了很多的注入方式,set注入、构造注入、p命名空间、c命名空间、字段注入等等,这些没啥可说的了。

方法注入

因为开发时我需要spring管理一个实例,但是这个实例并非单例,应该每一次调用都是一个新的实例。所以这时候有需要方法注入。

先创建一个Test类

package com.lhf.lookup;

public class Test {

    public void work(){
System.out.println("我是一名java开发工程师");
}
}

然后创建Dome,从代码中可以看出,Dome类依赖于Test

package com.lhf.lookup;

public class Dome {

    private Test test;

    public Test getTest() {
return test;
} public void setTest(Test test) {
this.test = test;
} public void say(){
System.out.println("我爱我的祖国");
}
}

现在配置 xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">   <!--bean的默认作用域是singleton,现在需要把它声明为prototype-->
  <bean id="test" class="com.lhf.lookup.Test" scope="prototype"> </bean>
  <bean id="dome" class="com.lhf.lookup.Dome">
    <!--通过lookup-method-->  
<lookup-method name="getTest" bean="test"/>
</bean> </beans>

这样Dome每次调用Test实例时,都会是一个新的。

package com.lhf.lookup;

import org.springframework.context.support.GenericXmlApplicationContext;

public class App {
public static void main(String[] args) {
GenericXmlApplicationContext context = new GenericXmlApplicationContext();
context.load("classpath:spring/lookup.xml");
context.refresh();
Dome dome = (Dome)context.getBean("dome");
System.out.println(dome.getTest() == dome.getTest());
context.close();
}
}

基于注解方式:

package com.lhf.lookup;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; @Component("test")
@Scope("prototype")
public class Test { public void work(){
System.out.println("我是一名java开发工程师");
}
} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> package com.lhf.lookup; import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.stereotype.Component; import javax.annotation.Resource; @Component
public class Dome { @Resource
private Test test; @Lookup
public Test getTest() {
return test;
} public void setTest(Test test) {
this.test = test;
} public void say(){
System.out.println("我爱我的祖国");
}
} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
package com.lhf.lookup; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; @Configuration
@ComponentScan("com.lhf.lookup")
public class Config {
} >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
package com.lhf.lookup; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Dome bean = context.getBean(Dome.class);
System.out.println(bean.getTest() == bean.getTest());
context.close();
}
}

方法替换

这个注入方式感觉有点鸡肋了,我继承父类重写方法也能实现同样的功能,好像还简单粗暴好理解嘞。可以把它看成是aop

先创建一个有3个重载的方法

package com.lhf.replacement;

public class TestServiceImpl {

    public void say() {
System.out.println("我说你是猪1");
} public void say(String mes) {
System.out.println("我说你是猪2");
} public void say(Object mes) {
System.out.println("我说你是猪3");
}
}

然后创建一个继承 MethodReplacer 的类,这里重写的方法是要替换的结果方法 譬如: 把TestServiceImpl中的第一个无参方法替换成下边的实现

package com.lhf.replacement;

import org.springframework.beans.factory.support.MethodReplacer;

import java.lang.reflect.Method;

public class Replace implements MethodReplacer {

    @Override
public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
System.out.println("替换原来的方法");
return null;
}
}

配置xml文件 replaced-method 声明替换方法,name 是要替换的方法名,replacer 要替换的bean对象,<arg-type/> 是处理重载的

<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="replace" class="com.lhf.replacement.Replace"/> <bean id="testService" class="com.lhf.replacement.TestServiceImpl">
<replaced-method name="say" replacer="replace">
<arg-type/>
</replaced-method>
<replaced-method name="say" replacer="replace">
<arg-type match="java.lang.String"/>
</replaced-method>
<replaced-method name="say" replacer="replace">
<arg-type match="java.lang.Object"/>
</replaced-method>
</bean>
</beans>

测试:

package com.lhf.replacement;

import org.springframework.context.support.GenericXmlApplicationContext;

public class App {
public static void main(String[] args) {
GenericXmlApplicationContext context = new GenericXmlApplicationContext();
context.load("spring/replacement.xml");
context.refresh();
TestServiceImpl service = (TestServiceImpl)context.getBean("testService");
System.out.println(">>>>>>>>>>>>>>>>>>>>>");
service.say();
System.out.println(">>>>>>>>>>>>>>>>>>>>>");
service.say("章鱼是猪");
System.out.println(">>>>>>>>>>>>>>>>>>>>>");
service.say("张宇是猪");
context.close();
}
}

他这个方法重载貌似并不太好,我个人觉得,我继承父类,重写父类方法声明成bean对象好像也能实现相同的功能,除非这个父类是不可继承的。

spring 方法注入、方法替换的更多相关文章

  1. spring依赖注入方法

    依赖注入就是在程序运行时期,由外部容器动态的将依赖对象注入到组件中,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给sprin ...

  2. Spring方法注入的使用与实现原理

    一.前言   这几天为了更详细地了解Spring,我开始阅读Spring的官方文档.说实话,之前很少阅读官方文档,就算是读,也是读别人翻译好的.但是最近由于准备春招,需要了解很多知识点的细节,网上几乎 ...

  3. Spring应用教程-2 方法注入

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 我们通常使用lookup方法注入,它可使Spring替换一个Bean的抽象或具体方法,返回查找容器中,其他Bea ...

  4. id、name、setter方法注入、构造方法注入、工厂方法注入、注解注入、方法注入、方法替换、Web作用域、普通bean引用Web作用域的bean

    spring IoC的id和name id的命名需要满足XML对id的命名规范,必须以字母开始,后面可以是字母.数字.连字符.下画线.句号.冒号等等号,但逗号和空格是非法的.如果用户确实希望用一些特殊 ...

  5. Spring学习笔记(10)——方法注入

    引用 在大部分情况下,容器中的bean都是singleton类型的.如果一个singleton bean要引用另外一个singleton bean,或者一个非singleton bean要引用另外一个 ...

  6. Spring 依赖注入,在Main方法中取得Spring控制的实例

    Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...

  7. Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件

    (1)下边的一个Java类包含了所有Map.Set.List.数组.属性集合等这些容器,主要用于演示spring的注入配置: package com.lc.collection; import jav ...

  8. Spring揭秘 读书笔记 四----方法注入

    我们知道,拥有prototype类型scope的bean,在请求方每次向容器请求该类型对象的时候,容器都会返回一个全新的该对象实例. 我们看下面的例子: public class MockNewsPe ...

  9. spring依赖注入之构造函数注入,set方法注入

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

随机推荐

  1. 装WIN7的一点心得

    一.为什么要装WIN7 长久以来个人的习惯,WIN10用不来,总体安装思路是:下官方版,找方法激活 二.安装镜像的来源 这个网上版本五花八门,各种系统网站,但都会有软件捆绑等行为,还有浏览器中强制捆了 ...

  2. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:第一个Spring程序

    1. 创建项目 在 MyEclipse 中创建 Web 项目 springDemo01,将 Spring 框架所需的 JAR 包复制到项目的 lib 目录中,并将添加到类路径下,添加后的项目如图 2. ...

  3. 模块化CommonJs规范 part1

    CommonJS规范 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 1.概述 Node 应用由模块组成,采用 CommonJS 模块规范. 每个文件就是一个模块, ...

  4. part7 vuex实现数据共享

    vuex 是数据框架(一个插件)(单项数据的改变流程,组件改数据必须先调Action用dispatch方法) 大型项目vue只能承担视图层的主要内容 大量数据传递的时候,往往需要一个数据框架辅助 例子 ...

  5. soupui--替换整个case的url

    添加新的URL 随便进入一个case的[REST]step,添加新的url 更换URL 添加完之后双击想要更换url的case,在弹出的窗口中点击URL按钮 在弹出的set endpoint窗口中选择 ...

  6. Jquery输入框焦点事件及鼠表事件汇总

    对于用户的输入框input,我们常常会用ajax来实现与后台的交互.输入框的内容我们可以用.val()方法获取,对于输入框内的事件,我们常用到焦点,如:input.blur.focus.... inp ...

  7. 基础nginx配置文件

    nginx的配置文件很长,如果开始就看全部的话会懵逼,以下以最简单的配置文件来学习. 目标:定义一个虚拟主机127.0.0.1   端口是8080 [root@localhost conf]# cat ...

  8. Python之路,Day1 - Python基础1 介绍、基本语法、流程控制

    本节内容 1.python介绍 2.发展史 3.python 2.x or python 3.x ? 4.python 安装 5.第一个程序 Hello World 程序 6.变量 7.用户输入 8. ...

  9. Tomcat导入工程

    Windows->Preference->Server->Runtime environment->Add浏览路径(选择Workbench default JRE)

  10. DevOps专题 |监控,可观测性与数据存储

    对于DevOps而言,监控是其中重要的一环,上一次的专题内容中,我们与大家分享了大型企业级监控系统的设计.今天我们将和大家从另一个角度进一步探讨互联网工程技术领域的监控设计(monitoring):系 ...