现在的位置: 首页 > 综合 > 正文

spring反转控制IOC或依赖注入之简单示例

2013年04月27日 ⁄ 综合 ⁄ 共 5411字 ⁄ 字号 评论关闭

这篇文章通过几个简单实例介绍了spring中控制反转的几种方式(新手注意:控制反转就是依赖注入哈,如有不懂的还是得先查查资料再看忘下看哦 ,尽管这也是篇基础文章 呵呵 ):

 

方式一(属性注入)

首先你要建立一个javaBean类SimpleBean :

package com.wjr.spring47;

public class SimpleBean {
 private String name;
 private String password;
 public SimpleBean(String name,String password)
 {
  this.name = name;
  this.password = password;
 }
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
}
第二步就是在spring配置文件applicationContext.xml中进行如下设置,

(通过myeclipse向项目中添加spring组件时,spring配置文件会自动产生)

<beans>
 <bean id="simple" class="com.wjr.spring47.SimpleBean"> 
 </bean>
</beans>

第三步就是编写一个测试类TestSimple:

package com.wjr.spring47;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSimple {
 public static void main(String[] args) {
  ApplicationContext context = null;
  context = new ClassPathXmlApplicationContext("applicationContext.xml");
  SimpleBean sb = (SimpleBean)context.getBean("simple");
  //上面这种通过context实例对象获取要使用的对象(本例是SimpleBean )代码是固定的。不需要多解释吧

  sb.setName("wjr");
  sb.setPassword("530");
  
  System.out.println(sb.getName());
  System.out.println(sb.getPassword());
 }
}
运行测试类 就能正常打印了。明白是怎么回事了吗?简单的说就是通过配置文件的映射找到要使用的类,而不是向以前通过工厂或者其他什么方式去访问java类了。不是叫属性注入呢 ?怎么没发现property之类的东东??不急,慢慢往下看:

但是一般情况下不会在测试类中才对属性值进行设置,也就是要在配置文件中就要求设置好属性的初始值,也就是我们的第一中方式:属性注入。做起来其实很简单,在配置文件中通过property属性就完成功能了。即是把上面第二步修改为:

<beans>
 <bean id="simple" class="com.wjr.spring47.SimpleBean"> 

     <property name="name" value="陈霞"></property>
     <property name="password" value="585"></property>

</bean>
</beans>

(呵呵 出现property了吧!)

然后上面第三步就不需要如下类似代码了:

  sb.setName("wjr");
  sb.setPassword("530");
然后再运行测试类,成功打印。这就是传说中的属性注入。

 

下面介绍第二种注入方式:构造注入。

 

方式二(构造注入):

很多时候还是希望通过构造方法去实例化对象的。这种方式需要做两步操作。第一需要在配置文件中增加一个参数constructor-arg,第二需要在相应Bean中增加一个构造方法,具体如下:

首先修改bean类,即添加构造方法:

 

package com.wjr.spring47;

public class SimpleBean {
 private String name;
 private String password;
 public SimpleBean(String name,String password)
 {
  this.name = name;
  this.password = password;
 }
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
}
第二步,修改配置文件如下:

<beans>
 <bean id="simple" class="com.wjr.spring47.SimpleBean">
  <constructor-arg index="0" value="wz"></constructor-arg>
  <constructor-arg index="1" value="530"></constructor-arg>
 </bean>
</beans>

第三步,编写测试类:

package com.wjr.spring47;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSimple {
 public static void main(String[] args) {
  ApplicationContext context = null;
  context = new ClassPathXmlApplicationContext("applicationContext.xml");
  SimpleBean sb = (SimpleBean)context.getBean("simple");
//  sb.setName("wjr");
//  sb.setPassword("530");
//  
  System.out.println(sb.getName());
  System.out.println(sb.getPassword());
 }
}
这时同样能打印出姓名和密码来。

 

方式三:(当A类中的一个属性需要访问B类对象像这种情况时就使用这种方式):

比如现在有个类RefBean.java,其中有个Date类对象属性:date ,那现在要怎么样对她进行设置呢:

首先建立Bean类:

package com.wjr.spring47;

import java.util.Date;

public class RefBean {
 private String name;
 private Date date;
 
 public Date getDate() {
  return date;
 }
 public void setDate(Date date) {
  this.date = date;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}
第二步,设置配置文件内容:

<beans>
 <bean id="demo02" class="com.wjr.spring47.DemoBean02">
  <property name="name" value="王欢欢"></property>
  <property name="date" ref="datebean"></property></bean>
 <bean id="datebean" class="java.util.Date"></bean>
</beans>

 

第三步,添加测试类:

package com.wjr.spring47;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDemoBean02 {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
 ApplicationContext context = null;
 context = new ClassPathXmlApplicationContext("applicationContext.xml");
 DemoBean02 rb = (DemoBean02)context.getBean("demo02");
 System.out.println(rb.getName());
 System.out.println(rb.getDate());
 }
}
运行测试类,ok,时间姓名成功打印。

这个例子也就是说在spring中可以通过ref绑定一个在配置文件中已经声明好的对象。

当然,除了ref绑定之外,spring还提供了一种自动绑定机制autowire:

这种方式呢就只需要将配置文件修改如下即可:

<beans>
 <bean id="demo02" class="com.wjr.spring47.DemoBean02"
  autowire="byType">
  <property name="name" value="王欢欢"></property>
 </bean>
 <bean id="datebean" class="java.util.Date"></bean>
</beans>

效果呢就跟前面一样哈。

autowire="byType意思呢就是表示按类型自动寻找匹配,但是你说类型有时候有重复啊 咋办?

莫急,使用:autowire="byName"。即是按属性名称进行设置。因为这时Bean中属性名为date,所以这种方式还要求必须把相应的Bean的id设为跟属性名date一样。具体如下:

<beans>
 <bean id="demo02" class="com.wjr.spring47.DemoBean02"
  autowire="byName">
  <property name="name" value="王欢欢"></property>
 </bean>
 <bean id="date" class="java.util.Date"></bean>
</beans>

 当然,这种绑定类型还有中方式就按构造方法绑定constructor。

第一步,当然得先在bean类中添加构造方法才行:

package com.wjr.spring47;

import java.util.Date;

public class DemoBean02 {
 private String name;
 private Date date;
 
 public DemoBean02(Date date)
 {
  this.date = date;
 }
 public Date getDate() {
  return date;
 }
 public void setDate(Date date) {
  this.date = date;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
}

第二步,修改配置文件为:

<beans>
 <bean id="demo02" class="com.wjr.spring47.DemoBean02"
  autowire="constructor">
  <property name="name" value="王欢欢"></property>
 </bean>
 <bean id="date" class="java.util.Date"></bean>
</beans>

 

然后运行测试成功。

现在基本就讲完了spring中的Ioc注入方法了。其实说白了spring中的Ioc就是通过配置文件完成对Bean的统一管理。

当然,关于集合数据类型的注入方式在开发中也常见,这里限于篇幅暂不讲解了哈 下次见各位

 

 

 

抱歉!评论已关闭.