Java的反射机制可以说是在Spring中发挥的淋漓尽致,下面要看的代码就是通过反射机制来实现向一个类注入其实际依赖的类型,这个过程的实现会交由Spring容器来帮我们完成。

JavaBean中针对属性一般都有一组设置/获取方法(setXXX/getXXX),这两个方法可以由IDE给我们自动产生,当然你也可以手动进行编写,这是你的自由,下面的例子就是Spring中利用setter方法来实现依赖注入。

源代码如下:

package com.pp;
//一个普通的JavaBean
public class Person {//人的名字private String S_name;private String S_addr;private int age;//getter方法public int getS_Age() {return age;}//setter方法public void setS_Age(int age) {this.age = age;}//setter方法public String getaddr() {return S_addr;}//getter方法public void setaddr(String addr) {S_addr = addr;}//构造函数public Person(){}//getter方法public String getName() {return S_name;}//setter方法public void setName(String name) {S_name = name;};
}

有了这个普通的JavaBean,我们要利用Spring容器来实现属性的注入,这里就需要Spring的配置文件,Spring的配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="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-3.0.xsd"><bean id="sentence" class="com.pp.Sentence"/><bean id="person" class="com.pp.Person"><!-- 从这里可以看出的是属性名是setter方法里去掉set的部分,即setXXX中的XXX而与具体的属性无关 --><property name="name" value="pptest"></property><!-- 这里你完全可以把setaddr里的参数改成setaddr(String name),并不会报错,因为判断的依据是setXXX即XXX --><!-- 但如果你改成setS_addr这里就要错了,不信你可以试,如果改成setS_addr,则下面的name需要改成S_addr --><property name="addr" value="Beijing"></property><!-- 这里就是上面的一个例子,类的属性名为age,但这里的name却为S_Age --><!-- 同时这里也要说明的一个问题是类里面为int,但这里却是字符串类型,这个你不用担心,Spring在进行注入时会自动根据参数的类型进行类型 的转化 --><property name="S_Age" value="22"></property></bean>
</beans>

配置文件中我已经注释的很清楚了,就不做说明了

下面是一个测试文件

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class MainTest {
public static void main(String[] args) {BeanFactory factory=new XmlBeanFactory(new ClassPathResource("person.xml"));Person person=(Person)factory.getBean("person");System.out.println(person.getName());System.out.println(person.getaddr());System.out.println(person.getS_Age());
}
}

如果一切正常的话,应该会打印出如下的结果:

pptest
Beijing
22

上面向类里面注入的均是内置类型,其实不仅可以注入内置类型,还可以向里面注入外部类对象,下面就是一个例子,只显示增加的部份,增加的部分,是假设每一个人均有说一句话,这句话的实际内容是由Sentence这个类决定的

源代码:

//这是一个普通的类,当然这样设计不好,在此仅为说明一下
public class Sentence{//类里面的方法,表示每一个人均说的是同样的一句话public void say() {System.out.println("Hello");}
}

下面是在类Person使用刚才的Sentence这个类,以下只列出新增代码

  //代表要说的话private Sentence sce;//setter方法public Sentence getSce() {return sce;}//getter方法public void setSce(Sentence sce) {this.sce = sce;}

以下是配置文件,同样也只列出新增的一部份

 <bean id="sentence" class="com.pp.Sentence"/><bean id="person" class="com.pp.Person"><!-- 从这里可以看出的是属性名是setter方法里去掉set的部分,即setXXX中的XXX而与具体的属性无关 --><property name="name" value="pptest"></property><!-- 这里你完全可以把setaddr里的参数改成setaddr(String name),并不会报错,因为判断的依据是setXXX即XXX --><!-- 但如果你改成setS_addr这里就要错了,不信你可以试,如果改成setS_addr,则下面的name需要改成S_addr --><property name="addr" value="Beijing"></property><!-- 这里就是上面的一个例子,类的属性名为age,但这里的name却为S_Age --><!-- 同时这里也要说明的一个问题是类里面为int,但这里却是字符串类型,这个你不用担心,Spring在进行注入时会自动根据参数的类型进行类型 的转化 --><property name="S_Age" value="22"></property><!-- 引入在外部定义的bean,这里就是上面的一个bean的id --><property name="Sce" ref="sentence"></property></bean>

测试文件里里面只需填加一行即可:

person.getSce().say();

最终的结果如下:

pptest
Beijing
22
Hello

上面的配置文件中,是用外部Bean注入的,我们也可以使用内部Bean注入,所谓内部Bean注入,是直接把Bean的定义写在property属性里,如下是更改后的配置文件

    <!-- <bean id="sentence" class="com.pp.Sentence"/>--><bean id="person" class="com.pp.Person"><!-- 从这里可以看出的是属性名是setter方法里去掉set的部分,即setXXX中的XXX而与具体的属性无关 --><property name="name" value="pptest"></property><!-- 这里你完全可以把setaddr里的参数改成setaddr(String name),并不会报错,因为判断的依据是setXXX即XXX --><!-- 但如果你改成setS_addr这里就要错了,不信你可以试,如果改成setS_addr,则下面的name需要改成S_addr --><property name="addr" value="Beijing"></property><!-- 这里就是上面的一个例子,类的属性名为age,但这里的name却为S_Age --><!-- 同时这里也要说明的一个问题是类里面为int,但这里却是字符串类型,这个你不用担心,Spring在进行注入时会自动根据参数的类型进行类型 的转化 --><property name="S_Age" value="22"></property><!-- 引入在外部定义的bean,这里就是上面的一个bean的id <property name="Sce" ref="sentence"></property>--><property name="Sce"><!-- 内部的Bean不能被外部的Bean引用,因此在里面加入id属性,是没有什么用的,内部Bean只能供本类使用,这里就是Person类的一个对象 --><bean class="com.pp.Sentence"></bean></property></bean>

测试文件可以不加任何改动,但最终的运行结果是一样的

转载于:https://www.cnblogs.com/jiangu66/p/3238854.html

[置顶] Spring中DI设置器注入相关推荐

  1. 02深度解析Spring Cloud Ribbon---LoadBalancerAutoConfiguration拦截器注入

    02深度解析Spring Cloud Ribbon---LoadBalancerAutoConfiguration拦截器注入 一.LoadBalancerAutoConfiguration介绍 1.L ...

  2. Quartz在Spring中动态设置cronExpression

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

  3. (转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)

    1.  过滤器跟拦截器的区别 在说拦截器之前,不得不说一下过滤器,有时候往往被这两个词搞的头大. 其实我们最先接触的就是过滤器,还记得web.xml中配置的<filter>吗~ 你应该知道 ...

  4. Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)

    2019独角兽企业重金招聘Python工程师标准>>> 什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改 ...

  5. 关于mysql注入说法正确的是_1. 在 Spring中,下列关于 依赖注入 的 说法 , 正确的是( ) 。_学小易找答案...

    [简答题]1基本流程练习 2时间轴嵌套 3简单应用 [简答题]请解释什么是MVC? [多选题]在 Hibernate 中,下 列 说法正确的有 [多选题]1. 关于 Spring,下列说法不正确的是( ...

  6. [置顶] iOS中 支付宝钱包详解/第三方支付

    [置顶] iOS中 支付宝钱包详解/第三方支付 韩俊强的博客 每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 一.在app中成功完成支付宝支付的过程 1.申请支付 ...

  7. 谈谈spring中的拦截器interceptor

    谈谈spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可以帮我们验证是否登陆.预先设置数据以及统计方法的执行效率等等.今天就来详细的谈一下spring中的拦截器.spring中拦截器主 ...

  8. Spring中的拦截器

    1.Spring中的拦截器 在web开发中,拦截器是经常用到的功能.它可以帮我们预先设置数据以及统计方法的执行效率等等. 今天就来详细的谈一下spring中的拦截器.spring中拦截器主要分两种,一 ...

  9. Spring中DI介绍

    文章目录 Spring中DI介绍 一.基于XML配置注入依赖 1. 有参构造函数注入依赖 2. set方法注入依赖 3. 注入自定义类型 4. 注入集合类型 二.基于注解形式注入依赖 1. @Valu ...

最新文章

  1. Eclipse error: “The import XXX cannot be resolved”
  2. wxWidgets:在全局范围内捕捉关键事件
  3. Android手机摇一摇的实现SensorEventListener
  4. 常见的权限访问控制模型
  5. apache thrift_Apache Thrift快速入门教程
  6. WordPress 三个必须的安全措施
  7. 求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序
  8. domino代理通过Request_Content域接收extjs以post方式提交的数据
  9. 如果买一辆二手的劳斯莱斯在三线城市跑婚车,多久能回本?
  10. Spark-Streaming获取kafka数据的两种方式-Receiver与Direct的方式
  11. 弥散张量分析开源软件 DSI Studio 简体中文汉化版可以下载了
  12. oracle中的内连接和外连接区别
  13. sql server 2012 安装与下载
  14. apache 启动失败 查看日志
  15. Python | peewee.InterfaceError
  16. 公厕智能离子净化器有多种除臭净味技术
  17. SQL/PL SQL
  18. 磁盘分区:系统C盘空间不足怎么办?
  19. haproxy配置负载均衡
  20. 如何杀掉defunct进程

热门文章

  1. c语言计算输入的字母数字个数字,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  2. Python---编写一个函数,提示输入两个数字a,b,并进行a与b的除法运算。
  3. python判断文件是否为空文件对象_判断Python对象是不是为文件对象的方法有哪些...
  4. maven <type>pom</type><scope>import</scope>
  5. python 保留两位小数 占位_第17p,Python中格式化输出的3种方式
  6. Android中利用隐式意图发送短信
  7. 搭建nginx服务、nginx的升级安装、Nginx配置文件的解析、web页面用户认证
  8. 第一篇:构建Mysql服务器
  9. android sqlite 参数,Android SQLite3命令详解教程
  10. linux复制文件快捷键,Linux基础学习(基本命令和文件操作)