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

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

程序结构图


Spring—Ioc(即Dependence Injection)依赖注入的3种方式 - Esher.Yuen - Simple°C
环境是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方法;
Spring—Ioc(即Dependence Injection)依赖注入的3种方式 - Esher.Yuen -   Simple°C
同时在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());
       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值