IOC依赖注入具体实现

From http://easy115.com/2012/01/05/spring%E7%94%A8%E6%B3%95%E5%B0%8F%E7%BB%93-ioc%E4%BB%A5%E6%9D%A5%E6%B3%A8%E5%85%A5%E5%85%B7%E4%BD%93%E6%97%B6%E9%97%B4.html


大致分为3种注入方式:
1.构造器注入
要求:(1)bean必须提供附带属性的构造方法
(2)配置文件中构造方法标签名constructor-arg ,属性名index="0",0代表构造方法中的第一个参数,例如:

<constructor-arg index="0">
<value>Janet</value>
</constructor-arg>

2.setter方法注入
要求:(1)bean必须提供无参构造方法
(2)要赋值的属性必须提供setter方法
(3)配置文件配置方式,如:

<property name="password">
<value>12345678</value>
</property>

3.特殊注入
要求:(1)如果bean中有List,Map,Set,Properties属性,配置文件中赋值方式分别如下:
<1>List和数组

<property name="hobbyList">
<list>
<value>篮球</value>
<value>发财</value>
<value>泡MM</value>
</list>
</property>

<2>Map

<map>
<entry key="Eric">
<value>80</value>
</entry>
<entry key="Janet">
<value>60</value>
</entry>
<entry key="Jason">
<value>100</value>
</entry>
</map>

<3>Properties

<property name="attributeList">
            <props>
                <prop key="name">Jason</prop>
                <prop key="hobby">足球</prop>
            </props>
</property>

<4>Set

<property name="nameList">
            <set>
                <value>Eric</value>
                <value>Janet</value>
                <value>Coco</value>
            </set>
</property>

(2)如果bean中的属性是另外一个bean的对象那么用ref 属性指向那个bean对象的id属性,例如:

<ref bean="date"/>

1、构造器注入
Bean:

public class User {
    private String userName;
    private String password;

    public User( String userName,String password ) {
        this.userName = userName;
        this.password = password;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="userBean" class="ioc.constructor_injection.beans.User">
        <constructor-arg index="0">
            <value>Janet</value>
        </constructor-arg>
        <constructor-arg index="1">
            <value>88888888</value>
        </constructor-arg>
    </bean>
</beans>

具体应用:

public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext(
                "./src/ioc/constructor_injection/config/config.xml");
        // 取得一个实例
        User user = (User) ac.getBean("userBean");
        System.out.println( user.getUserName() + " - " + user.getPassword() );
    }

2、setter方法注入
(注意,使用setter方式依赖注入,bean必须提供系统默认无参构造器)

Bean:

public class User {
    private String userName;

    private String password;

    public User() {

    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="userBean" class="ioc.setter_injection.beans.User">
        <property name="userName">
            <value>Eric</value>
        </property>
        <property name="password">
            <value>12345678</value>
        </property>
    </bean>
</beans>

具体应用:

public static void main(String[] args) {
        ApplicationContext ac = new FileSystemXmlApplicationContext(
                "./src/ioc/setter_injection/config/config.xml");
        User user = (User) ac.getBean("userBean");
        System.out.println( user.getUserName() + " - " + user.getPassword() );
    }

3、List注入
Bean:

public class User {
    private List hobbyList = new Vector();

    public List getHobbyList() {
        return hobbyList;
    }

    public void setHobbyList(List hobbyList) {
        this.hobbyList = hobbyList;
    }
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="userBean" class="ioc.collection_injection.list_injection.beans.User">
        <property name="hobbyList">
            <list>
                <value>篮球</value>
                <value>发财</value>
                <value>泡MM</value>
            </list>
        </property>
    </bean>
</beans>

具体应用:

public static void main(String[] args) {
        ApplicationContext ac = new FileSystemXmlApplicationContext(
    "./src/ioc/collection_injection/list_injection/config/config.xml");
        // 取得一个实例
        User user = (User) ac.getBean("userBean");
        List < String > hobbyList = user.getHobbyList();
        for ( String hobby: hobbyList ) {
            System.out.println( hobby );
        }
    }

4、Map注入
Bean:

public class User {
    private Map nameList = new HashMap();

    public Map getNameList() {
        return nameList;
    }

    public void setNameList(Map nameList) {
        this.nameList = nameList;
    }
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="userBean" class="ioc.collection_injection.map_injection.beans.User">
        <property name="nameList">
            <map>
                <entry key="Eric">
                    <value>80</value>
                </entry>
                <entry key="Janet">
                    <value>60</value>
                </entry>
<entry key="Jason">
                    <value>100</value>
                </entry>
            </map>
        </property>
    </bean>
</beans>

具体应用:

public static void main(String[] args) {
        ApplicationContext ac = new FileSystemXmlApplicationContext(        "./src/ioc/collection_injection/map_injection/config/config.xml");
        // 取得一个实例
        User user = (User) ac.getBean("userBean");
        Map map = user.getNameList();
        Object [] list = map.keySet().toArray();
        for ( Object key: list ) {
            String name = ( String )key;
            String age = ( String )map.get( name );
            System.out.println( name + " - " + age );
        }
    }

5、Properties注入
Bean:

public class User {
    private Properties attributeList = new Properties();

    public Properties getAttributeList() {
        return attributeList;
    }

    public void setAttributeList(Properties attributeList) {
        this.attributeList = attributeList;
    }
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="userBean"
        class="ioc.collection_injection.properties_injection.beans.User">
        <property name="attributeList">
            <props>
                <prop key="name">Jason</prop>
                <prop key="hobby">足球</prop>
            </props>
        </property>
    </bean>
</beans>

具体应用:

public static void main(String[] args) {
        ApplicationContext ac = new FileSystemXmlApplicationContext(        "./src/ioc/collection_injection/properties_injection/config/config.xml");
        // 取得一个实例
        User user = (User) ac.getBean("userBean");
        Properties p = user.getAttributeList();
        System.out.println( p.get( "name" ) + " - " + p.getProperty( "hobby" ) );

    }

6、Set注入
Bean:

public class User {
    private Set nameList = new HashSet();

    public Set getNameList() {
        return nameList;
    }

    public void setNameList(Set nameList) {
        this.nameList = nameList;
    }
}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="userBean" class="ioc.collection_injection.set_injection.beans.User">
        <property name="nameList">
            <set>
                <value>Eric</value>
                <value>Janet</value>
                <value>Coco</value>
            </set>
        </property>
    </bean>
</beans>

具体应用:

public static void main(String[] args) {
        ApplicationContext ac = new FileSystemXmlApplicationContext(
    "./src/ioc/collection_injection/set_injection/config/config.xml");
        // 取得一个实例
        User user = (User) ac.getBean("userBean");
        Set < String > nameList = user.getNameList();
        for ( String name: nameList ) {
            System.out.println( name );
        }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结