Spring随笔(06)

1、简单类型和复合类型的setter注入

  DI:Dependency Injection(依赖注入)

  从字面上分析:

  IoC:指将对象的创建权,反转到Spring容器

  DI:指Spring容器创建对象的过程中,将对象依赖属性通过配置进行注入

  其实它们是同一个概念的不同角度描述。DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。

  

  1)怎么注入值:

    方式1:属性注入,通过setter方法;

    方式2:构造器注入,通过构造器;

  2)注入的方式:

    手动装配:

      基于XML:

      基于注解:

    自动装配:不安全,不推荐

  3)注入哪些类型的值:

    ①简单值类型:基本类型+String+URL等

    ②复合类型(对象类型):

    ③集合类型(了解,框架内部使用)

 

2、集合类型的setter注入

 

Java类:

public class Employee{
    private String name;
    private Integer age;
    private Double salary;
    private URL url;

    // 省略getter、setter方法          
}

 

public class EmployeeService{
    private EmployeeDao employeeDao;
    
    public void setEmployeeDao(EmployeeDao employeeDao){
        employeeDao = employeeDao;
    }

    public void save(){
        employeeDao.save();
     System.out.println("Service.save()") } }

 

public class EmployeeeDao{
    public void save(){
        System.out.println("Dao.save()")
    }
}

 

public class CollectionBean {
    private Set<String> set;
    private List<String> list;
    private String[] array;
    private Map<String,String> map;
    private Properties prop;
    
    // 省略getter、setter   
}

 

配置文件:

<!-- ①简单值类型:基本类型+String+URL等 -->
<bean id="employee" class="Employee全限定名">
    <property name="name" value="John"/>
    <property name="age" value="20"/>
    <property name="salary" value="5000"/>
    <property name="url" value="http://www.baidu.com"/>
</bean>

<!-- ②复合类型 -->
<bean id="employeeDao" class="EmployeeDao全限定名"/>
<bean id="employeeService" class="EmployeeService全限定名">
    <property name="employeeDao" ref="employeeDao"/>
</bean>

<!-- ③集合类型(了解,内部框架使用) -->
<bean id="collectionBean" class="CollectionBean全限定名">
    <!-- Set集合 -->
    <property name="set">
        <set>
            <!-- 引用类型使用<bean> -->
            <value>set1</value>
            <value>set2</value>
        </set>
    </property>

    <!-- List集合 -->
    <property name="list">
        <list>
            <!-- 引用类型使用<bean> -->
            <value>list1</value>
       <value>list2</value>
        </list>
    </property>

    <!-- 数组类型 -->
    <property name="array">
        <array>
            <!-- 引用类型使用<bean> -->
            <value>array1</value>
       <value>array2</value>
        </array>
    </property>

    <!-- Map集合 --> 
    <property name="map">
        <map>
            <entry key="key1" value="value1"/>
            <entry key="key2" value="value2"/>
        </map>
    </property>

    <!-- Properties集合 -->
    <property name="prop">
        <props>
             <prop key="pKey1">pValue1</prop>
             <prop key="pKey2">pValue2</prop>
        </props>
    </property>

</bean>

 

有的时候,若想只有一个bean引用另一个bean,类似于匿名内部类

<bean id="employeeService" class="EmployeeDao全限定名">
    <property name="employeeDao">
        <bean class="EmployeeDao全限定名"/>
    </property>
</bean>

 

3、构造器注入

配置文件

<!-- ①简单值类型:基本类型+String+URL等 -->
<bean id="employee" class="Employee全限定名">
    <!-- 
        index:表示第几个参数
        type:参数的类型
        name:参数名称
        value:参数的简单类型值
        ref:参数的符合类型值
    -->
    <constructor-arg name="name" value="John"/>
    <constructor-arg name="age" value="20"/>
    <constructor-arg name="salary" value="5000"/>
    <constructor-arg name="url" value="http://www.baidu.com"/>
</bean>

<!-- ②复合类型 -->
<bean id="employeeDao" class="EmployeeDao全限定名"/>
<bean id="employeeService" class="EmployeeService全限定名">
    <constructor-arg name="employeeDao" ref="employeeDao"/>
</bean>

<!-- ③集合类型(了解,内部框架使用) -->
<bean id="collectionBean" class="CollectionBean全限定名">
    <!-- Set集合 -->
    <constructor-arg name="set">
        <set>
            <!-- 引用类型使用<bean> -->
            <value>set1</value>
            <value>set2</value>
        </set>
    </constructor-arg>

    <!-- List集合 -->
    <constructor-arg name="list">
        <list>
            <!-- 引用类型使用<bean> -->
            <value>list1</value>
       <value>list2</value>
        </list>
    </constructor-arg>

    <!-- 数组类型 -->
    <constructor-arg name="array">
        <array>
            <!-- 引用类型使用<bean> -->
            <value>array1</value>
       <value>array2</value>
        </array>
    </constructor-arg>

    <!-- Map集合 --> 
    <constructor-arg name="map">
        <map>
            <entry key="key1" value="value1"/>
            <entry key="key2" value="value2"/>
        </map>
    </constructor-arg>

    <!-- Properties集合 -->
    <constructor-arg name="prop">
        <props>
             <prop key="pKey1">pValue1</prop>
             <prop key="pKey2">pValue2</prop>
        </props>
    </constructor-arg>

</bean>

Java类:

public class Employee{
    private String name;
    private Integer age;
    private Double salary;
    private URL url;

    // 构造器
    public void Employee(String name,Integer age,Double salary,URL url){
         this.name = name;
         this.age= age;
         this.salary= salary;
         this.url= url;
    }     
}
public class EmployeeService{
    private EmployeeDao employeeDao;
    
// 构造器
public void EmployeeService(EmployeeDao employeeDao){ this.employeeDao = employeeDao; } public void save(){ employeeDao.save();      System.out.println("Service.save()") } }

 

 

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
pulic class DITest {
    @Autowired
    private ApplicationContext ctx;

    // ①简单值类型
    @Test
    public void testValue() thows Exception {
        System.out.println(ctx.getBean("employee"));
    }

    // ② 复合类型
    @Test
    public void testBean() thows Exception {
        EmployeeService service = ctx.getBean("employeeService",EmployeeService.class);
        service.save();
    }

    // ③ 集合类型(了解,框架内部使用)
    @Test
    public void tesCollection() thows Exception {
        System.out.println(ctx.getBean("collectionBean"));
    }
}

 

posted @ 2017-02-20 17:46  LuoMsg  阅读(158)  评论(0编辑  收藏  举报