Spring 注入

来源:互联网 发布:java jlabel 鼠标事件 编辑:程序博客网 时间:2024/04/30 02:01

新建dao层接口以及service接口,分别模拟数据层,以及逻辑层代码,其中分别写入一个run()方法:

InjectionInterface.java

package dao.interfaces;public interface InjectionInterface {    public void run();}

ServiceInterface.java

package service.interfaces;public interface ServiceInterface {    public void run();}

新建一个dao层实现类,实现dao层接口方法:
InjectionImpl.java

package dao.interfacesimpl;import dao.interfaces.InjectionInterface;public class InjectionImpl implements InjectionInterface {    @Override    public void run() {        System.out.println("Spring Start!");    }}

建立一个service层实现类,在其中定义一个私有对象,并可以分别以setter方法,和构造器进行传入,这就是两种注入方法:
ServiceImpl.java

package service.intefacesimpl;import service.interfaces.ServiceInterface;import dao.interfaces.InjectionInterface;public class ServiceImpl implements ServiceInterface {    private InjectionInterface inject;    public ServiceImpl(InjectionInterface inject) {        super();        this.inject = inject;    }    public void setInject(InjectionInterface inject) {        this.inject = inject;    }    @Override    public void run() {        System.out.println("Service 业务逻辑!");        inject.run();    }}

新建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"    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd" ><!--         <bean id="injectionService" class="com.imooc.ioc.injection.service.InjectionServiceImpl"> --><!--            <property name="injectionDAO" ref="injectionDAO"></property> --><!--         </bean> -->        <bean id="serviceInterface" class="service.intefacesimpl.ServiceImpl">            <!-- ><property name="inject" ref="InjectionInterface"></property> -->            <constructor-arg name="inject" ref="InjectionInterface"></constructor-arg>        <!-- 此处name一定要和 service.intefacesimpl.ServiceImpl 中的InjectionImpl 参数名一致-->        </bean>        <bean id="InjectionInterface" class="dao.interfacesimpl.InjectionImpl"></bean></beans>

Bean配置项主要有如下几个:
id:代表唯一标识符
class:具体要实例化的哪一个类
scope:指具体范围,即作用域
Constructor arguments:构造器参数
Properties:设置注入.以上两个方法注入是,name一定要和Service层
的实现类里面参数一致,如上放代码里面的inject.
Autowriting mode:自动装配模式
lazy-initialization mode:懒加载模式
Initialization/destruction method:初始化和销毁的方法。

加载方式:

package test;import org.junit.After;import org.junit.Before;import org.springframework.beans.BeansException;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.util.StringUtils;public class UnitTestBase {    private ClassPathXmlApplicationContext context;    private String springXmlPath;    public UnitTestBase(){}    public UnitTestBase(String springXml){        this.springXmlPath = springXml;    }    @Before    public void before(){        if(StringUtils.isEmpty(springXmlPath)){            springXmlPath = "classpath*:spring-*.xml";        }        try{            context = new ClassPathXmlApplicationContext(springXmlPath.split("[,\\s]+"));            context.start();        }catch(BeansException e){            e.printStackTrace();        }    }    @After    public void after(){        context.destroy();    }    @SuppressWarnings(value = { "unchecked" })    protected <T extends Object>T getBean(String beanId){        return (T)context.getBean(beanId);    }    protected <T extends Object>T getBean(Class<T> clazz){        return (T)context.getBean(clazz);    }}

通过ClassPathXmlApplicationContext ,实例化一个对象context,然后网其中传入xml文件的路径,调用start()方法,即可启动加载。
然后可以通过context.getBean()方法,可以通过传入的参数生成bean的实例,传入的参数可以是id,也可以是类的类型。

Tips:xml路径填写方式有多种,利用classpath的时候,一般未设置情况下从根目录开始,因此若是将配置文件放在包下,则会报错,书写格式如下:

classpath:com/lds/config/spring-injection.xml

包名之间不是用点,而是用 /

下面是测试代码:

package test;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.BlockJUnit4ClassRunner;import service.interfaces.ServiceInterface;@RunWith(BlockJUnit4ClassRunner.class)public class TestInjection extends UnitTestBase{    public TestInjection(){        super("classpath:com/lds/config/spring-injection.xml");    }    @Test    public void testSetter(){        ServiceInterface interface1 = super.getBean("serviceInterface");        interface1.run();    }    @Test    public void testConstruct(){        ServiceInterface interface1 = super.getBean("serviceInterface");        interface1.run();    }}
0 0
原创粉丝点击