依赖注入

来源:互联网 发布:江山市网店美工招聘 编辑:程序博客网 时间:2024/05/17 07:43

spring实现依赖注入

(2009-08-27 21:28:36)

转载
标签:

杂谈

分类:Jsp

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

方式一(属性注入)

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

package com.wjr.spring47;

public class SimpleBean {
 private String name;
 private String password;
 public SimpleBean(String name,Stringpassword)
 {
  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;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSimple {
 public static void main(String[] args){
  ApplicationContext context = null;
  context = newClassPathXmlApplicationContext("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,Stringpassword)
 {
  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;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSimple {
 public static void main(String[] args){
  ApplicationContext context = null;
  context = newClassPathXmlApplicationContext("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;
importorg.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDemoBean02 {
 public static void main(String[] args){
  // TODO Auto-generated method stub
 ApplicationContext context = null;
 context = newClassPathXmlApplicationContext("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"
  >
  <property name="name"value="王欢欢"></property>
 </bean>
 <bean id="datebean"class="java.util.Date"></bean>
</beans>

效果呢就跟前面一样哈。

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

<beans>
 <bean id="demo02"class="com.wjr.spring47.DemoBean02"
  >
  <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"
 >
  <property name="name"value="王欢欢"></property>
 </bean>
 <bean id="date"class="java.util.Date"></bean>
</beans>

然后运行测试成功。

原创粉丝点击