据说不懂spring的程序员就相当于不会Java,于是最近一段时间并行学习下spring框架。先学习总结下spring的IoC的五种注入方式。
这里我想象的场景是这样的:士兵和他的武器的故事。这个是我目前的结构图:
Human和Weapon是两个接口,Gun和Solder分别是实现了上面两个接口的类,其中,由于Solder需要Gun而形成了对Gun类的依赖
上面的代码分别为:
Weapon接口
public interface Weapon { public void function(); }
Human接口
public interface Human { String name=""; public void action(); public String getName(); public void setName(String name); }
Gun类
public class Gun implements Weapon{ public void function() { System.out.println("I have a gun, I can shoot!"); } }
1.首先来看第一种set注入:
Soldier类
public class Soldier implements Human{ private Weapon weapon; private String name; public void action() { weapon.function(); } public String getName() { return this.name; } public void setName(String name) { this.name=name; } //注意这里一定要有,否则set注入不成功 public void setWeapon(Weapon weapon){ this.weapon=weapon; } }
在Soldier中一定要设置所依赖的类的set方法,否则set注入会失败!将所要依赖的类以property的形式配置到bean中,并将ref指向相应的bean的name值。相应的xml文件中的配置如下:
<bean name="soldier" class="roomy.impl.Soldier"> <property name="weapon" ref="weapon"></property> </bean> <bean name="weapon" class="roomy.impl.Gun"></bean>
则在Test类的Main函数中运行:
Test类
public class Test { private static ApplicationContext ctx; public static void main(String[] args) { ctx = new ClassPathXmlApplicationContext("beans.xml"); Human human = (Human) ctx.getBean("soldier"); human.action(); } }
运行得到:
I have a gun, I can shoot!
2.然后我们看构造器注入法,只需要修改Soldier类,添加构造函数,并在构造函数中传入即可,如下:
public class Soldier implements Human{ private Weapon weapon; private String name; public Soldier(Weapon weapon){ this.weapon=weapon; } public void action() { weapon.function(); } public String getName() { return this.name; } public void setName(String name) { this.name=name; } }
同时,修改xml文件中相应bean元素的中的子元素为:
<bean name="soldier" class="roomy.impl.Soldier"> <constructor-arg ref="weapon"></constructor-arg> </bean> <bean name="weapon" class="roomy.impl.Gun"></bean>
同样得到上面的结果
3.接下来是通过注解法,使用注解法的时候需要在xml文件中添加这句话:
<context:annotation-config/>
此外,整个beans.xml的文件如下:
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <!-- the xmlns with context is associated with annotation --> <!-- and the next line is for annotation --> <context:annotation-config/> </beans>
基于注解简直不要太方便,直接在所依赖的对象的前面加上一句@Resource即可,这个注解是Java自带的,直接修改Soldier类如下:
public class Soldier implements Human{ @Resource private Weapon weapon; private String name; public void action() { weapon.function(); } public String getName() { return this.name; } public void setName(String name) { this.name=name; } }
也可以是用Spring的注解,也就是在所依赖对象前面加上:
@Autowired//@Qualifier("name")如果有N个依赖对象,可以用这个标签具体制定匹配哪一个bean
时间: 2024-10-12 20:50:04