热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Spring中属性注入详解

这篇文章主要为大家详细介绍了Spring中属性注入,演示了int、String、数组、list等属性的注入,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文演示了int、String、数组、list、set、map、Date等属性的注入。
其中Date类型的注入则是借助了Spring提供的属性编辑器来实现的,首先是用到的五个实体类

package com.jadyer.model; 
import java.util.Date; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 
/** 
 * 常见属性的注入 
 * @see 包括int,String,Array,list,set,map,Date的注入 
 */ 
public class Bean11 { 
  private Integer intValue; 
  private String strValue; 
  private String[] arrayValue; 
  private List listValue; 
  private Set setValue; 
  private Map mapValue; 
  private Date dateValue; 
  /* 七个属性的setter和getter略 */ 
} 
 
 
package com.jadyer.model; 
public class Bean22 { 
  private Bean33 bean33; 
  private Bean44 bean4422; //注入:与属性名无关,与setBean44()有关 
  private Bean55 bean55; 
  /* 三个属性的setter和getter略 */ 
} 
 
 
package com.jadyer.model; 
public class Bean33 { 
  private Integer id; 
  private String name; 
  private String sex; 
  /* 三个属性的setter和getter略 */ 
} 
 
 
package com.jadyer.model; 
public class Bean44 { 
  private Integer id; 
  private String name; 
  private String sex; 
  private Integer age; 
  /* 四个属性的setter和getter略 */ 
} 
 
 
package com.jadyer.model; 
public class Bean55 { 
  private String password; 
  /* 关于password的setter和getter略 */ 
} 

然后是我们自定义的java.util.Date类型转换器

package com.jadyer.util; 
 
import java.beans.PropertyEditorSupport; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
 
/** 
 * java.util.Date属性编辑器。相当于类型转换器。这里是将String转为Date型 
 * @see ---------------------------------------------------------------------------------------- 
 * @see 该示例主要让大家知道Spring也有这种机制,不是让大家以后写属性编辑器 
 * @see 需要写属性编辑器的几率太少了,只要知道Spring也有类似的机制就可以了 
 * @see ---------------------------------------------------------------------------------------- 
 * @see 所谓的属性编辑器,就是将Spring配置文件中的字符串转换成相应的Java对象 
 * @see Spring内置了一些属性编辑器,也可以自定义属性编辑器 
 * @see 自定义属性编辑器事,须继承PropertyEditorSupport类并覆写setAsText()方法 
 * @see 最后再将自定义的属性编辑器注入到Spring中,即可 
 * @see ---------------------------------------------------------------------------------------- 
 */ 
public class UtilDatePropertyEditor extends PropertyEditorSupport { 
  private String pattern; //将转换的格式放到配置文件中,让Spring注入进来 
  public void setPattern(String pattern) { 
    this.pattern = pattern; 
  } 
   
  @Override 
  public void setAsText(String text) throws IllegalArgumentException { 
    System.out.println("======UtilDatePropertyEditor.setAsText()======" + text); 
    try { 
      Date date = new SimpleDateFormat(pattern).parse(text); 
      this.setValue(date); //注意:这里放进去的是一个java.util.Date对象,故输出的时间是默认的格式 
    } catch (ParseException e) { 
      e.printStackTrace(); 
      throw new IllegalArgumentException(text); //继续向上抛参数非法的异常 
    } 
  } 
} 

用到的针对所有实体类的applicationContext-beans.xml文件

<&#63;xml version="1.0" encoding="UTF-8"&#63;> 
 
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
     
     
     
       
        array11 
        array22 
       
     
     
       
        list11 
        list22 
       
     
     
       
        set11 
        set22 
       
     
     
       
         
         
       
     
     
   
   
   
     
     
     
   
   
   
     
   
 

用到的针对公共实体类的applicationContext-common.xml文件

<&#63;xml version="1.0" encoding="UTF-8"&#63;> 
 
       
   
   
   
     
     
     
   
   
   
     
   
 
 
 
 

用到的针对java.util.Date属性编辑器的applicationContext-editor.xml文件

<&#63;xml version="1.0" encoding="UTF-8"&#63;> 
 
       
   
     
   
   
   
   
     
       
         
       
     
   
 
 
 
 
 
 

 

最后是使用JUnit3.8写的单元测试类

package com.jadyer.junit; 
 
import junit.framework.TestCase; 
 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
 
import com.jadyer.model.Bean11; 
import com.jadyer.model.Bean22; 
 
public class PropertyInjectionTest extends TestCase { 
  private ApplicationContext factory; 
 
  @Override 
  protected void setUp() throws Exception { 
    /****====读取单一的配置文件====****/ 
    //factory = new ClassPathXmlApplicationContext("applicationContext.xml"); 
     
    /****====利用数组读取多个配置文件====****/ 
    //这样就会把两个配置文件作为一个来使用,表面上看是作为两个使用的 
    //其实内部是作为一个使用的,所以在多个配置文件中,里面的id不能重复 
    //但是name属性可以重复,就好像人的身份证编号和名字的区别是一样的 
    //String[] cOnfigLocations= new String[]{"applicationContext.xml", "applicationContext-editor.xml"}; 
    //factory = new ClassPathXmlApplicationContext(configLocations); 
     
    /****=====利用 * 匹配模式读取多个配置文件====****/ 
    //业界流行的一句话:约定优于配置 
    //所以说当有了一个统一的比较好的约定之后,就可以利用框架提供的功能,减少配置量 
    //另外:如果没有读取到applicationContext-*.xml,此时即便存在applicationContext.xml,它也不会读的 
    factory = new ClassPathXmlApplicationContext("applicationContext-*.xml"); 
  } 
 
  /** 
   * 该方法演示的是常见属性的注入,包括int,String,Array,list,set,map,Date的注入 
   * @see 其中Date类型的注入则是借助了Spring属性编辑器来实现的 
   */ 
  public void testInjection11() { 
    //Bean11 bean11 = new Bean11(); //若简单的new,那么它的属性是不会被注入的。注入的前提必须是从IoC容器中拿出来的,才会注入 
    Bean11 bean11 = (Bean11)factory.getBean("bean11"); //此时bean11就是从IoC容器中获取到的,所以它的依赖就会被全部注入 
    System.out.println("bean11.intValue=" + bean11.getIntValue()); 
    System.out.println("bean11.strValue=" + bean11.getStrValue()); 
    System.out.println("bean11.arrayValue=" + bean11.getArrayValue()); 
    System.out.println("bean11.listValue=" + bean11.getListValue()); 
    System.out.println("bean11.setValue=" + bean11.getSetValue()); 
    System.out.println("bean11.mapValue=" + bean11.getMapValue()); 
    System.out.println("bean11.dateValue=" + bean11.getDateValue()); 
  } 
   
  /** 
   * 该方法主要演示的是将公共的配置进行抽象,以减少配置量 
   */ 
  public void testInjection22() { 
    Bean22 bean22 = (Bean22)factory.getBean("bean22"); 
    System.out.println("bean22.bean33.id=" + bean22.getBean33().getId()); 
    System.out.println("bean22.bean33.name=" + bean22.getBean33().getName()); 
    System.out.println("bean22.bean33.sex=" + bean22.getBean33().getSex()); 
    System.out.println("bean22.bean44.id=" + bean22.getBean44().getId()); 
    System.out.println("bean22.bean44.name=" + bean22.getBean44().getName()); 
    System.out.println("bean22.bean44.sex=" + bean22.getBean44().getSex()); 
    System.out.println("bean22.bean44.age=" + bean22.getBean44().getAge()); 
    System.out.println("bean22.bean55.password=" + bean22.getBean55().getPassword()); 
  } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在使用MSXML解析XML文件时出现DTD禁用问题的解决方案。通过代码示例和错误信息获取方法,解释了默认情况下DTD是禁用的,以及如何启用DTD的方法。此外,还提到了网上关于该问题的信息相对较少,因此本文提供了解决方案以供参考。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文是关于自学Android的笔记,包括查看类的源码的方法,活动注册的必要性以及布局练习的重要性。通过学习本文,读者可以了解到在自学Android过程中的一些关键点和注意事项。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
author-avatar
MiMe淘宝店
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有