spring ioc应用

一、从ioc容器获取对象的三种方式

<bean id="user1" class="bean.User"></bean>
    
    <!-- 第二种:使用静态工厂方法获取对象 -->
    <bean id="user2" class="staticFactory.UserFactory" factory-method="getUser1"></bean>
    
    <!-- 第三种:使用实例工厂方法获取对象 -->
    <!-- 第一步:先创建工厂实例 -->
    <bean id="userFactory" class="staticFactory.UserFactory"></bean>
    <!-- 第二步:调用工厂方法产生对象 -->
    <bean id="user3" factory-bean="userFactory" factory-method="getUser2"></bean>
//测试及结果
    @Test
    public void testCreateBean() {
        User user1 = (User) ac.getBean("user1");
        System.out.println(user1);
        System.out.println("------>>");
        User user2 = (User) ac.getBean("user2");
        System.out.println(user2);
        System.out.println("------>>");
        User user3 = (User) ac.getBean("user3");
        System.out.println(user3);
    }

bean.User@289d2e
------>>
bean.User@6754d6
------>>
bean.User@1f2cea2

二、依赖注入两种方式(DI)

//bean对象
public class User {
    private Integer id;
    private String name;

    public User() {
    }

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }

}


 

<!-- 第一种:set方法注入 -->
    <bean id="user1" class="bean.User">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
    </bean>
    
    <!-- 第二种:构造方法注入 -->
    <bean id="user2" class="bean.User">
        <!-- index参数可以省略,但是这是参数必须按构造方法的顺序来 -->
        <constructor-arg index="0">
            <value >2</value>
        </constructor-arg>
        <constructor-arg index="1">
            <value>李四</value>
        </constructor-arg>
    </bean>
@Test
    public void testDI() {
        User user1 = (User) ac.getBean("user1");
        System.out.println(user1);
        System.out.println("------>>");
        User user2 = (User) ac.getBean("user2");
        System.out.println(user2);
    }

测试结果:

User [id=1, name=张三]
------>>
User [id=2, name=李四]

三、注入集合、数组、自定义类

public class User {
    private Set<String> strSet;
    private List<String> strlist;
    private Map<String, Object> map;
    private int[] array = new int[50];
    //一个自定义的类
    private MyObject myObject;
    //省略get和set方法

//配置

<bean id="myObject" class="bean.MyObject"></bean>
    <bean id="user" class="bean.User">
        <property name="strSet">
            <set>
                <value>set1</value>
                <value>set2</value>
                <value>set3</value>
            </set>
        </property>
        <property name="strlist">
            <list>
                <value>list1</value>
                <value>list2</value>
                <value>list3</value>
            </list>
        </property>
        <property name="map">
            <map>
                <entry key="key1">
                    <value>value1</value>
                </entry>
                <entry key="key2">
                    <value>value2</value>
                </entry>
                <entry key="key3">
                    <value>value3</value>
                </entry>
            </map>
        </property>
        <!-- 注意:数组并没有自己的标签,用<list>标签表示 -->
        <property name="array">
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </list>
        </property>
        <property name="myObject" ref="myObject"></property>

    </bean>

//测试

@Test
    public void testDI2() {
        User user = (User) ac.getBean("user");
        System.out.println(user.getStrSet());
        System.out.println("------>>");
        System.out.println(user.getStrlist());
        System.out.println("------>>");
        System.out.println(user.getMap());
        System.out.println("------>>");
        System.out.println(Arrays.toString(user.getArray()));
        System.out.println("------>>");
        System.out.println(user.getMyObject());
    }
//结果
[set1, set2, set3]
------>>
[list1, list2, list3]
------>>
{key1=value1, key2=value2, key3=value3}
------>>
[1, 2, 3]
------>>
bean.MyObject@2b9406

 四、基于注解方式的依赖注入

  使用基于XML的依赖注入使用起来比较麻烦,需每次都向XML文件中配置,基于注解的方式能使工作更快捷。

  1.向spring声明我们在哪些包中使用了注解的方式实现依赖注入:

<context:component-scan base-package="dao,service"></context:component-scan>

 

  2.使用到的注解

  声明注解:@Component、@Controller、@Service、@Repository,四个注解的作用完全相同,相当于在配置文件中声明了一个类,包括了类中的属性。其id的默认值为第一个字母为小写的类的名字。例如:UserDaoImpl---->userDaoImpl;之所以那么多个,是给你在不同的代码层中使用。如:控制层中使用@Controller标签。

  依赖注入注解:@Resource,给属性注入值。但是为了不硬编码,一般都是给属性为自定义类来注入。如要给普通属性注入,请使用xml的方式。

posted @ 2016-03-16 19:19  覃学苦练  阅读(233)  评论(0)    收藏  举报