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

方法注入

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

先创建一个Test类

  1. package com.lhf.lookup;
  2.  
  3. public class Test {
  4.  
  5. public void work(){
  6. System.out.println("我是一名java开发工程师");
  7. }
  8. }

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

  1. package com.lhf.lookup;
  2.  
  3. public class Dome {
  4.  
  5. private Test test;
  6.  
  7. public Test getTest() {
  8. return test;
  9. }
  10.  
  11. public void setTest(Test test) {
  12. this.test = test;
  13. }
  14.  
  15. public void say(){
  16. System.out.println("我爱我的祖国");
  17. }
  18. }

现在配置 xml文件

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

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

  1. package com.lhf.lookup;
  2.  
  3. import org.springframework.context.support.GenericXmlApplicationContext;
  4.  
  5. public class App {
  6. public static void main(String[] args) {
  7. GenericXmlApplicationContext context = new GenericXmlApplicationContext();
  8. context.load("classpath:spring/lookup.xml");
  9. context.refresh();
  10. Dome dome = (Dome)context.getBean("dome");
  11. System.out.println(dome.getTest() == dome.getTest());
  12. context.close();
  13. }
  14. }

基于注解方式:

  1. package com.lhf.lookup;
  2.  
  3. import org.springframework.context.annotation.Scope;
  4. import org.springframework.stereotype.Component;
  5.  
  6. @Component("test")
  7. @Scope("prototype")
  8. public class Test {
  9.  
  10. public void work(){
  11. System.out.println("我是一名java开发工程师");
  12. }
  13. }
  14.  
  15. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  16.  
  17. package com.lhf.lookup;
  18.  
  19. import org.springframework.beans.factory.annotation.Lookup;
  20. import org.springframework.stereotype.Component;
  21.  
  22. import javax.annotation.Resource;
  23.  
  24. @Component
  25. public class Dome {
  26.  
  27. @Resource
  28. private Test test;
  29.  
  30. @Lookup
  31. public Test getTest() {
  32. return test;
  33. }
  34.  
  35. public void setTest(Test test) {
  36. this.test = test;
  37. }
  38.  
  39. public void say(){
  40. System.out.println("我爱我的祖国");
  41. }
  42. }
  43.  
  44. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  45. package com.lhf.lookup;
  46.  
  47. import org.springframework.context.annotation.ComponentScan;
  48. import org.springframework.context.annotation.Configuration;
  49.  
  50. @Configuration
  51. @ComponentScan("com.lhf.lookup")
  52. public class Config {
  53. }
  54.  
  55. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  56. package com.lhf.lookup;
  57.  
  58. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  59.  
  60. public class App {
  61. public static void main(String[] args) {
  62. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
  63. Dome bean = context.getBean(Dome.class);
  64. System.out.println(bean.getTest() == bean.getTest());
  65. context.close();
  66. }
  67. }

方法替换

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

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

  1. package com.lhf.replacement;
  2.  
  3. public class TestServiceImpl {
  4.  
  5. public void say() {
  6. System.out.println("我说你是猪1");
  7. }
  8.  
  9. public void say(String mes) {
  10. System.out.println("我说你是猪2");
  11. }
  12.  
  13. public void say(Object mes) {
  14. System.out.println("我说你是猪3");
  15. }
  16. }

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

  1. package com.lhf.replacement;
  2.  
  3. import org.springframework.beans.factory.support.MethodReplacer;
  4.  
  5. import java.lang.reflect.Method;
  6.  
  7. public class Replace implements MethodReplacer {
  8.  
  9. @Override
  10. public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
  11. System.out.println("替换原来的方法");
  12. return null;
  13. }
  14. }

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <bean id="replace" class="com.lhf.replacement.Replace"/>
  6.  
  7. <bean id="testService" class="com.lhf.replacement.TestServiceImpl">
  8. <replaced-method name="say" replacer="replace">
  9. <arg-type/>
  10. </replaced-method>
  11. <replaced-method name="say" replacer="replace">
  12. <arg-type match="java.lang.String"/>
  13. </replaced-method>
  14. <replaced-method name="say" replacer="replace">
  15. <arg-type match="java.lang.Object"/>
  16. </replaced-method>
  17. </bean>
  18. </beans>

测试:

  1. package com.lhf.replacement;
  2.  
  3. import org.springframework.context.support.GenericXmlApplicationContext;
  4.  
  5. public class App {
  6. public static void main(String[] args) {
  7. GenericXmlApplicationContext context = new GenericXmlApplicationContext();
  8. context.load("spring/replacement.xml");
  9. context.refresh();
  10. TestServiceImpl service = (TestServiceImpl)context.getBean("testService");
  11. System.out.println(">>>>>>>>>>>>>>>>>>>>>");
  12. service.say();
  13. System.out.println(">>>>>>>>>>>>>>>>>>>>>");
  14. service.say("章鱼是猪");
  15. System.out.println(">>>>>>>>>>>>>>>>>>>>>");
  16. service.say("张宇是猪");
  17. context.close();
  18. }
  19. }

他这个方法重载貌似并不太好,我个人觉得,我继承父类,重写父类方法声明成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. LIS是什么?

    在之前的随笔中,大概介绍了医疗系统有哪些,是干什么的,是怎么配合医院业务的.现在就开始主要的说一说我的主要工作业务 — LIS了. 前面说到过LIS(LIMS),名称是实验室信息管理系统,大概可以分解 ...

  2. PAT Advanced 1030 Travel Plan (30) [Dijkstra算法 + DFS,最短路径,边权]

    题目 A traveler's map gives the distances between cities along the highways, together with the cost of ...

  3. 利用libpcap抓取数据包

    转载自:http://blog.csdn.net/tennysonsky/article/details/44811899 概述 libpcap是一个网络数据包捕获函数库,tcpdump就是以libp ...

  4. springboot自动装配介绍

    所谓的自动装配,就是 autowire. 如何激活自动装配呢? 方法一:@EnableAutoConfiguration或@SpringBootApplication,写在@Configuration ...

  5. Java基础查漏补缺(2)

    Java基础查漏补缺(2) apache和spring都提供了BeanUtils的深度拷贝工具包 +=具有隐形的强制转换 object类的equals()方法容易抛出空指针异常 String a=nu ...

  6. UVA - 10285 Longest Run on a Snowboard(最长的滑雪路径)(dp---记忆化搜索)

    题意:在一个R*C(R, C<=100)的整数矩阵上找一条高度严格递减的最长路.起点任意,但每次只能沿着上下左右4个方向之一走一格,并且不能走出矩阵外.矩阵中的数均为0~100. 分析:dp[x ...

  7. 干货 | DRDS 与TiDB浅析

    干货 | DRDS 与TiDB浅析 北京it爷们儿 京东云开发者社区  4月17日 在谈论数据库架构和数据库优化的时候,会常听到"分库分表"."分片".&quo ...

  8. MSE(均方误差)、RMSE (均方根误差)、MAE (平均绝对误差)

    1.MSE(均方误差)(Mean Square Error) MSE是真实值与预测值的差值的平方然后求和平均. 范围[0,+∞),当预测值与真实值完全相同时为0,误差越大,该值越大. import n ...

  9. bootstrap 支持的JavaScript插件

    一次性导入: Bootstrap提供了一个单一的文件,这个文件包含了Bootstrap的所有JavaScript插件,即bootstrap.js(压缩版本:bootstrap.min.js). 具体使 ...

  10. 使用GitHub+Hexo搭建个人博客

    title: CozyMo date: 2019-12-28 16:01:29 tags: 书写 前言:搭建博客要自己打代码吗? 开始动手:搭建博客的步骤 个性化:更换主题!! 写博客:初识 mark ...