spring的Ioc机制是掌握spring的重点。Spring的Ioc方式有三种,分别为 构造函数注入(type one)、 属性注入(type two)、 接口注入(type three)。
下面给出Demo代码及配置 案例。
程序结构图
环境是MyEclipse8.5WorkBench,Spring2.5&jdk1.6_5.
Esher.java是数据的实体类,包含name、school、general三个属性。
EsherInterceptor.java是接口类,forEsher是测试类。
applicationContext.xml是spring配置映射文件。
Type one - 构造函数注入
在Esher实体类中声明构造方法如下:
public Esher(String name,String general,String school){
this.name=name;
this.general=general;
this.school=school;
}
并在xml配置文件中配置bean属性映射注入便可。
<bean id="esher-type" class="org.yys.main.Esher">
<constructor-arg index="1">
<value>Esher</value>
</constructor-arg>
<constructor-arg>
<value>Male</value>
</constructor-arg>
<constructor-arg>
<value>SISE</value>
</constructor-arg>
</bean>
TypeTwo-属性方法注入
为了和构造方法注入 区别,在Esher.java中新增一个属性值为postId,自动省成器getter&setter方法,构造函数里不初始化postId的值。
属性注入的时候是调用Esher.java里面的setter方法对应注入,故如果改变setter方法的名字或者无setter方法,程序将会抛错。
并在xml里面配置bean里增加红色部分即可
<bean id="esher-type" class="org.yys.main.Esher">
<constructor-arg index="1">
<value>Esher</value>
</constructor-arg>
<constructor-arg>
<value>Male</value>
</constructor-arg>
<constructor-arg>
<value> south china institute of software engineering </value>
</constructor-arg>
<!--getter/setter注入-->
<property name="postId">
<value>510990</value>
</property>
</bean>
TypeThree-接口注入
在EsherInteceptor里面写入一个abstract的方法public abstract void proEsher();
并在forEsher.java里面实现这个接口打印出一些信息,并设置器getter/setter方法;
同时在xml配置下添加bean配置(原esher配置存在基础上)
<!--接口注入 -->
<!--配置实现类EsherImpl-->
<bean id="esher_implement" class="org.yys.main.forEsher"></bean>
<!--注入配置-->
<bean id="esher_interceptor" class="org.yys.main.forEsher">
<property name="esher_interceptor" ref="esher_implement"></property>
</bean>
下面是测试类的main方法
public static void main(String[] args){
Resource rs = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(rs);
//构造函数注入
Esher esher = (Esher) factory.getBean("esher-type");
System.out.println(esher.getName());
System.out.println(esher.getGeneral());
System.out.println(esher.getSchool());
//getter/setter注入
System.out.println(esher.getPostId());
//接口注入
forEsher forE = (forEsher) factory.getBean("esher_interceptor");
forE.useEsher();
}
除了Ioc三种注入方式以外,还可利用BeanFactory的生命周期方法进行实例化前的注入方式,但这并不常用。方法如下:
首先写一个Bean,然后创建一个class继承BeanFactory生命中期中的BeanPostProcessor接口,并重写接口中的两个方法,代码如下:
public class MyBeanPostProcessorTool implements BeanPostProcessor{
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
// if(bean!=null&&beanName.equals("userBean")){ //可在Bean销毁前进行打印。
// UserBean user = (UserBean) bean;
// System.out.println("名称: "+user.getName());
// System.out.println("地址: "+user.getAddress());
// }
System.out.println(beanName+" has been destroyed");
return bean;
}
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if(bean != null&&beanName.equals("userBean")){
UserBean user = (UserBean)bean;
user.setName("广州大学华软软件学院");
user.setAddress("广州广从大道13号");
}
System.out.println(beanName+" init done!");
return bean;
}
}
然后在xml托管这两个类:
<bean id = "userBean" class = "com.yys.domain.UserBean" ></bean>
<bean id = "myTool" class = "com.yys.domain.MyBeanPostProcessorTool" ></bean>
测试方法中只要get到Bean后直接打印对象属性值即可:
public static void main(String[] args){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserBean user = (UserBean) ac.getBean("userBean");
System.out.println("名称: "+user.getName());
System.out.println("地址: "+user.getAddress());
}