Spring注入

来源:互联网 发布:知喻经济发展讲座 编辑:程序博客网 时间:2024/05/16 12:09
  • Spring注入是指在启动Spring容器加载配置的时候完成对变量的赋值行为
  • 常用的两种注入方式
    • 设值注入:通过一个成员变量的set方法进行设值
    • 如下代码中,id 用来区分不同的bean,class的路径为对应类的路径,以包名.类名的形式,property对应着属性,在property指明在login类中存在一个User类的成员变量,ref是声明login有一个引用它指向了对应的user bean,对应着User类。 在java类中,我们通常将属性设置为private访问权限,通过set、get方法去对私有属性进行读写操作,设值注入相当于自动为我们调用set方法对属性进行赋值
        <bean id="login" class="cn.xm.action.Login">            <property name="user" ref="user"/>        </bean>        <bean id="user" class="com.xm.bean.User"></bean>
 - 构造注入:通过构造器的形式为成员变量赋值 - 与设值注入相比,构造注入多了<constructor-arg > 标签。在ioc容器调用Login的构造方法去创建实例的时候,会根据ref讲User的实例赋值给构造器中声明的user属性,从而完成在创建Login时候对user的赋值
        <bean id="login" class="cn.xm.action.Login">            <constructor-arg name="user" ref="user"></constructor-arg>        </bean>        <bean id="user" class="com.xm.bean.User"></bean>

设值注入实例:
UserService.java:

package cn.xm.test.service;import cn.xm.test.dao.UserDAO;public class UserService {    private UserDAO userDAO;    public void save(String arg) {        System.out.println("Service接收参数" +  arg);        arg = arg + ":" + this.hashCode();        userDAO.save(arg);    }    //设值注入    public void setUserDAO(UserDAO userDAO) {        this.userDAO = userDAO;    }}

UserDAO.java:

package cn.xm.test.dao;public class UserDAO {    public void save(String arg) {        //模拟数据库保存操作        System.out.println("保存数据:" + arg);    }}

spring-injection.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="UserService" class="cn.xm.service.UserService">            <property name = "userDAO" ref="userDAO"></property>        </bean>        <bean id="userDAO" class="cn.xm.dao.UserDAO"></bean> </beans>

TestInjection.java:

package cn.xm.test.ioc.interfaces;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.BlockJUnit4ClassRunner;import cn.xm.test.base.UnitTestBase;import cn.xm.test.service.UserService;@RunWith(BlockJUnit4ClassRunner.class)public class TestInjection extends UnitTestBase {    public TestInjection() {        super("classpath:spring-injection.xml");    }    @Test    public void testSetter() {        UserService service = super.getBean("UserService");        service.save("这是要保存的数据");    }}

以上通过UserDAO模拟了存储的操作,并且在UserService中模拟了业务操作。最后用junit进行了单元测试。
构造注入的与设置注入的区别在于spring-injection.xml的配置上和UserService的构造上:
spring-injection.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="UserService" class="cn.xm.test.service.UserService">            <property name = "userDAO" ref="userDAO"></property>        </bean>         -->        <bean id="UserService" class="cn.xm.test.service.UserService">            <constructor-arg name = "userDAO" ref="userDAO"></constructor-arg>        </bean>        <bean id="userDAO" class="cn.xm.test.dao.UserDAO"></bean> </beans>

UserService.java:

package cn.xm.test.service;import cn.xm.test.dao.UserDAO;public class UserService {    private UserDAO userDAO;    //构造注入    public UserService(UserDAO userDAO){        this.userDAO  = userDAO;    }    public void save(String arg) {        System.out.println("Service接收参数" +  arg);        arg = arg + ":" + this.hashCode();        userDAO.save(arg);    }    //设值注入    public void setUserDAO(UserDAO userDAO) {        this.userDAO = userDAO;    }}
原创粉丝点击