设值注入,构造注入

设值注入:通过<property…/>成分驱动Spring施行setter的章程

  • 设值注入:IOC容器使用变量的setter方法来注入被正视的目标。
  • 协会注入:IOC容器使用构造器来注入被依赖的靶子。

协会注入:通过<constructor-arg…/>成分驱动Spring施行带有参数的构造器

设值注入:


Persion.java

package inter;

public interface Persion {
    //定义一个方法
    public void useAxe();

}

Axe.java

package inter;

public interface Axe {
    //定义一个方法
    public String chop();

}

Chinese.java

package entity;

import inter.Axe;
import inter.Persion;

public class Chinese implements Persion {

    private Axe axe;
    //设值注入所需的setter方法
    public void setAxe(Axe axe)
    {
        this.axe=axe;
    }
    @Override
    public void useAxe() {
        //调用axe的方法,表明Persion依赖axe对象
        System.out.println(axe.chop());

    }

}

StoneAxe.java

package entity;

import inter.Axe;

public class StoneAxe implements Axe {

    @Override
    public String chop() {
        // TODO Auto-generated method stub
     return "石斧砍柴真慢";
    }

}

beans.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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd" >

   <bean id="chinese" class="entity.Chinese">
      <property name="axe" ref="stoneAxe"></property> 
    </bean>
    <bean id="stoneAxe" class="entity.StoneAxe" />
</beans>
  • id:钦点该Bean的绝无仅有标记,Spring通过id属性值来保管Bean,程序通过id属性值来访问该bean实例。
  • class:内定该bean的落到实处类,必须接纳实例类,Spring容器会选择XML解析器读取该属性值,并同过反射来创立该实例类的实例。
  • property:<property…/>子成分的name属性值决定进行哪个setter方法,value或ref决定施行setter方法的传播参数。

BeanTest.java

package test;

import inter.Persion;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanTest {

    public static void main(String[] args) throws Exception
    {
        //创建spring容器
        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
        //获取Chinese实例
        Persion p=ctx.getBean("chinese", Persion.class);
        //调用useAxe方法
        p.useAxe();
    }

}

运用Spring IOC容器的四个基本要领:

  • 应用程序的各组件面向接口编制程序,从而将各组件的耦合关系升格到接口档次,有利于中期维护。
  • 应用程序的各组件不再由程序积极创建,而是由Spring容器来担负产生并早先化。
  • Spring选拔配备文件或注脚来管理Bean的贯彻类、依赖关系,Spring容器则基于安排文件或注解利用反射来创设实例,并为之注入正视关系。

两者都实属对Bean的借助和接受Spring容器的管理

结构注入:


Chinese.java

package entity;

import inter.Axe;
import inter.Persion;

public class Chinese implements Persion {

    private Axe axe;
    //构造注入,采用有参数的构造器
    public Chinese(Axe axe)
    {
        this.axe=axe;
    }
    @Override
    public void useAxe() {
        //调用axe的方法,表明Persion依赖axe对象
        System.out.println(axe.chop());

    }

}

beans.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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd" >

   <bean id="chinese" class="entity.Chinese">
    <!--constructor-arg子元素驱动Spring调用Chinese带一个构造参数的构造器来创建对象-->
      <constructor-arg ref="stoneAxe"/> 
    </bean>
    <bean id="stoneAxe" class="entity.StoneAxe" />
</beans>

注意点:

  • 各样<constructor-arg…/>子成分代表2个构造器参数,假使<bean…/>成分包括N个<constructor-arg…/>子成分,就会使得Spring调用带N个参数的构造器来创造对象。
  • <constructor-arg…/>子成分可内定3个index属性,用于内定构造参数值将用作第几个参数值,index=”0″表示构造参数值作为第1个构造参数值。
  • Spring允许为<constructor-arg…/>成分钦命四个type属性,举个例子<constructor-arg
    value=”贰叁”
    type=”int”/>,此处Spring明显知道那里配置四个int类型的参数。

依靠关系的值一般是三个鲜明的值只怕Spring容器中其余Bean的引用

二种注入方式比较:

设值注入:

  • 与理念的JavaBean的写法更相像,通过setter方法设定正视关系更为直观,自然。
  • 对于复杂的正视关系,如若应用构造注入,会产生构造器过于臃肿,在创设bean实例时,假若依附的实例较多,必须将依据的实例同时实例化,变成系统天性降低,接纳设值注入就足以幸免这几个难题。
  • 在某个成员变量可选的图景下,多参数的构造器尤其笨重。

结构注入:

  • 澳门永利备用网址,布局注入能够在构造器中决定依赖关系的注入顺序。
  • 对于依赖关系无需退换的Bean,构造注入更有用处。因为从没setter方法,全部的信赖关系总体方方面面在布局器内设定。
  • 依傍关系只还好构造器中设定,则唯有组件的创立者才具更换组件的借助关系。对组件的调用者来讲,组件内部的正视性关系完全透明,更符合高内聚的尺码。