这篇文章通过几个简单实例介绍了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"
? >
? <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>
然后运行测试成功。