Spring参数注入的几种方法

简介: Spring参数注入的几种方法

对代码不满足,是任何真正有天才的程序员的根本特征。

1. 基本类型值

2. 注入bean;

3. 内部bean; 在property内部加个bean

4. Null值

5. 级联属性

6. 集合类型属性

基本类型值注入:在bean中加入property 通过value直接赋值
<bean id="people1" class="com.java1234.entity.People">
    <property name="id" value="1"></property>
    <property name="name" value="张三"></property>
    <property name="age" value="11"></property>
  </bean>

但是你的实体类People中必须有这些属性名 id,name,age;并且有set方法

注入Bean类型:在bean中加入将一个类作为属性 通过property的ref依赖另一个bean(前提这个bean是有值的),并且在类中也要申明这个类属性属性和他的set方法,一般set的方法是通过xml自动注入的

<bean id="people2" class="com.java1234.entity.People">
    <property name="id" value="2"></property>
    <property name="name" value="张三"></property>
    <property name="age" value="11"></property>
    <property name="dog" ref="dog"></property>
  </bean>
  <bean id="dog" class="com.java1234.entity.Dog">
      <property name="name" value="jack"></property>
  </bean>
  public class People {
  private int id;
  private String name;
  private int age;
  private Dog dog;
  public void setDog(Dog dog) {
    this.dog = dog;
  }
  }
package com.java1234.entity;
public class Dog {
    private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

内部bean:在你的bean中property中加入一个bean类似内部类 跟外部申明一样class都要申明清楚

<bean id="people3" class="com.java1234.entity.People">
    <property name="id" value="3"></property>
    <property name="name" value="张三"></property>
    <property name="age" value="11"></property>
    <property name="dog">
       <bean class="com.java1234.entity.Dog">
           <property name="name" value="Tom"></property>
      </bean>
    </property>
  </bean>

Null值:仅限申明null值 同内部bean一样 在property内部用null标签

<bean id="people4" class="com.java1234.entity.People">
  <property name="id" value="4"></property>
  <property name="name" value="张三"></property>
  <property name="age" value="11"></property>
  <property name="dog">
      <null></null>
  </property>
  </bean>

级联属性:在property name的输入中类似对象成员域的调用dog.name

<bean id="people5" class="com.java1234.entity.People">
    <property name="id" value="1"></property>
    <property name="name" value="张三"></property>
    <property name="age" value="11"></property>
    <property name="dog.name" value="Jack2"></property>
  </bean> 
</beans>

这里有3个需要注意的地方:1.在people类中的dog属性需要实例化new Dog();
2.同时在people类中要有dog的get方法 否则会报错

3.在输出dog名字时候 要dog.getName;

配置文件中配置bean的属性时,property标签不仅能直接配置该bean对应的类自身的属性,而且还可以直接配置该类的属性对象向的属性,即级联属性。这里的级联属性被赋值的前提是级联属性所属的对象属性已经被属性注入或构造器注入赋值,因为一般没有注入,所以要new出空对象,让xml注入属性对象的属性,否则会报异常。

<bean id="people5" class="com.java1234.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
<property name="dog.name" value="Jack2"></property>
</bean>
package com.java1234.entity;
public class People {
  private int id;
  private String name;
  private int age;
  private Dog dog=new Dog();//级联属性需要实例化dog
  public void setDog(Dog dog) {
    this.dog = dog;
  }
  public Dog getDog() {
    return dog;
  }
  public void setId(int id) {
    this.id = id;
  }
  public void setName(String name) {
    this.name = name;
  }
  public void setAge(int age) {
    this.age = age;
  }
  @Override
  public String toString() {
    return "People [id=" + id + ", name=" + name + ", age=" + age
        + ", dog=" + dog.getName()+ "]";
  }
}

集合类型属性:property中加入list set props等子标签以 value子标签赋值 分别对应People类中ArrayList HashSet Properties等类型属性 还有HashMap对应map.entry.key(value子标签赋值)和map.entry.value键值对

<property name="hobbies">
      <list>
        <value>唱歌</value>
        <value>跳舞</value>
      </list>
    </property>
    <property name="loves">
      <set>
        <value>唱歌2</value>
        <value>跳舞2</value>
      </set>
    </property>
    <property name="works">
      <map>
        <entry>
          <key><value>上午</value></key>
          <value>写代码</value>
        </entry>
        <entry>
          <key><value>下午</value></key>
          <value>测试代码</value>
        </entry>
      </map>
    </property>
    <property name="addresses">
      <props>
        <prop key="address1">aaaaa</prop>
        <prop key="address2">bbbbb</prop>
      </props>
    </property>
相关文章
|
18天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
30天前
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
|
23天前
|
JSON 前端开发 Java
Spring MVC——获取参数和响应
本文介绍了如何在Spring框架中通过不同的注解和方法获取URL参数、上传文件、处理cookie和session、以及响应不同类型的数据。具体内容包括使用`@PathVariable`获取URL中的参数,使用`MultipartFile`上传文件,通过`HttpServletRequest`和`@CookieValue`获取cookie,通过`HttpSession`和`@SessionAttribute`获取session,以及如何返回静态页面、HTML代码片段、JSON数据,并设置HTTP状态码和响应头。
42 1
Spring MVC——获取参数和响应
|
11天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
16 1
|
12天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
21 1
|
17天前
|
存储 安全 Java
|
9天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
14 0
|
1月前
|
前端开发 Java Spring
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
100 2
|
1月前
|
缓存 Java Spring
源码解读:Spring如何解决构造器注入的循环依赖?
本文详细探讨了Spring框架中的循环依赖问题,包括构造器注入和字段注入两种情况,并重点分析了构造器注入循环依赖的解决方案。文章通过具体示例展示了循环依赖的错误信息及常见场景,提出了三种解决方法:重构代码、使用字段依赖注入以及使用`@Lazy`注解。其中,`@Lazy`注解通过延迟初始化和动态代理机制有效解决了循环依赖问题。作者建议优先使用`@Lazy`注解,并提供了详细的源码解析和调试截图,帮助读者深入理解其实现机制。
21 1
|
2月前
|
Java Spring
spring boot 启动项目参数的设定
spring boot 启动项目参数的设定