读书人

SpringIoc(即Dependence Injection)

发布时间: 2012-09-20 09:36:50 作者: rapoo

Spring—Ioc(即Dependence Injection)依赖注入的3种方式

spring的Ioc机制是掌握spring的重点。Spring的Ioc方式有三种,分别为 构造函数注入(type one)、属性注入(type two)、接口注入(type three)。
下面给出Demo代码及配置 案例。

程序结构图

Spring—Ioc(即Dependence Injection)依赖注入的三种方式
环境是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" style="margin: 0pt 10px 0pt 0pt;" alt="Spring—Ioc(即Dependence Injection)依赖注入的三种方式" src="/img/2012/09/14/1333401028.jpg">
同时在xml配置下添加bean配置(原esher配置存在基础上)
??? <!--接口注入??? -->
??? <!--配置实现类EsherImpl-->
??? <bean id="esher_implement" 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());
?? ??? }

读书人网 >软件架构设计

热点推荐