[置顶] Spring中DI设置器注入
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"?>
<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-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>
测试文件可以不加任何改动,但最终的运行结果是一样的
[置顶] Spring中DI设置器注入的更多相关文章
- [置顶] Spring中自定义属性编辑器
Spring中的属性编辑器能够自动的将String类型转化成需要的类型,例如一个类里面的一个整型属性,在配置文件中我们是通过String类型的数字进行配置的,这个过程中就需要一个转化操作,当然这个转化 ...
- [置顶] Spring的DI依赖实现分析
DI(依赖注入)是Spring最底层的核心容器要实现的功能之一,利用DI可以实现程序功能的控制反转(控制反转即程序之间之间的依赖关系不再由程序员来负责,而是由Spring容器来负责) 一个简单的例子( ...
- Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)
什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户 ...
- (转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)
1. 过滤器跟拦截器的区别 在说拦截器之前,不得不说一下过滤器,有时候往往被这两个词搞的头大. 其实我们最先接触的就是过滤器,还记得web.xml中配置的<filter>吗~ 你应该知道 ...
- Quartz在Spring中动态设置cronExpression
什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...
- spring中bean配置和注入场景分析
bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean,并 ...
- Spring中如何向 Bean注入系统属性或环境变量
[转自] http://unmi.cc/spring-injection-system-properties-env/ 在 Spring 中为 javabean 注入属性文件中的属性值一般人都知道的, ...
- [置顶]
spring集成mina 实现消息推送以及转发
spring集成mina: 在学习mina这块时,在网上找了很多资料,只有一些demo,只能实现客户端向服务端发送消息.建立长连接之类.但是实际上在项目中,并不简单实现这些,还有业务逻辑之类的处理以及 ...
- SSM-Spring-04:Spring的DI的构造注入,P命名注入,和集合注入
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- DI和IOC相比,DI更偏向于实现 DI的set方式注入在前面入门案例里有写,所以此处不多啰嗦,直接开搞,先说 ...
随机推荐
- C++编程有趣的标题1 于1~9填写的运算结果的中间符号等于100
于1 2 3 4 5 6 7 8 9将九个数字"+"要么"-"符号使得结果100,编程的所有组合. 注意:数字顺序不能改变 <pre name=" ...
- BZOJ 3236 AHOI 2013 作业 莫队算法
题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的 ...
- MVC常用特性
MVC常用特性使用 简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将 ...
- List subList()的一个demo
只要保证toIndex不大于size并且fromIndex不大于toIndex即可(谁会传一个负数的下标呢?) public List<E> subList(int fromIndex, ...
- leetcode先刷_Maximum Subarray
dp创始人级精英赛的冠军.最大的部分和. 扫从左至右,保持一个最佳值而当前部分和,在这一部分,并成为负值什么时候.再往下的积累后,也起到了负面作用,所以,放弃直销,然后部分和初始化为阅读的当前位置. ...
- ssl通关的概念(一个)
在公司最近的项目涉及多种加密.安全.我一直在这方面缺乏经验.很协议仅仅知道是什么概念.用于传输的加密SSL,也煞费苦心.非常easy一件事,折腾了很长一段时间.IT该行啊,真的是.难者不会,与会者困难 ...
- ASP.NET 5 Beta8 发布
ASP.NET 5 Beta8 发布 ASP.NET 5 的路线图(详见 ASP.NET 5 Schedule and Roadmap : https://github.com/aspnet/home ...
- bcp sqlcmd bulkinsert在unicode问题,Unexpected EOF encountered in BCP data-file
senario 进入sqlcmd使用:out xxx产生的数据文件,因为sqlcmd export to file 默认情况下,中国的乱码.因此,使用-u(unicode)开关 @echo off & ...
- Event Sourcing - ENode(一)
分布式系统 摩尔定律如果一直能实现,不管是涉及或者实现一个OLTP的系统,我们是不是都会轻松点,用硬件堆就可以了.但是现在硬件已经在求变了,那么我们也得求变,云的概念如此之火,本质就是设施虚拟化,也可 ...
- ashx一般处理程序和HttpHandler
asp.net项目中,使用.ashx的文件(一般处理程序)可以用于处理客户端发送来的请求,并将服务器端的处理结果返回给客户端.它能返回的类型可以是文本.或者图片.有时候,我们可以在项目中使用.cs的文 ...