美文网首页
03-Spring-DI

03-Spring-DI

作者: XAbo | 来源:发表于2020-12-25 17:26 被阅读0次

    DI:控制反转:IOC是降低依赖关系,DI则是管理程序内的依赖关系。

    Spring管理依赖的主要内容是数据的注入以及注入方式

    可注入的数据类型

    • 基本类型和String。
    • Bean类型:交给Spring管理的Bean,即IOC托管的Bean
    • 复杂类型/集合类型。

    注入的方式

    • 使用构造函数注入
    • 使用set注入
    • 使用注解注入(详见注解章节)

    1.1 使用构造方式

    配置文件:bean.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    两部分: 1.根标签beans的别名:xmlns="http://www.springframework.org/schema/beans"
           2.约束文件:schemaLocation引入约束,然后给约束地址起个别名xsi
      -->
    <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
           https://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--没有constructor-arg标签会class报错,因为本例中的AccountServicesImpl没有默认的无参构造方法了-->
        <!--
             1.找构造函数中的属性:
            type:要注入的数据类型
            index:指定要注入的数据给构造方法中指定索引位置的参数赋值。索引从0开始。
            name:给指定参数名称赋值。常用的。
            2.给属性赋值
            value:给基本类型和String赋值。
            ref:指赋值其他Bean类型,即在IOC容器中的Bean。
    
            优势:在获取Bean时注入的数据是必须的操作,否则对象无法创建成功。
            劣势:改变Bean对象的实例化方式,在用不到这些属性的是也必须提供。所以一般不用。
            -->
        <bean id="birthday" class="java.util.Date"></bean>
        <bean id="accountServices" class="com.springdi.services.AccountServicesImpl">
            <constructor-arg name="name" value="xzb"></constructor-arg>
            <constructor-arg name="age" value="18"></constructor-arg>
            <constructor-arg name="birthday" ref="birthday"></constructor-arg>
        </bean>
    </beans>
    

    AccountServicesImpl

    public class AccountServicesImpl implements AccountServices {
        //经常变化的数据不适用注入
        private  String  name;
        private  Integer age;
        private  Date    birthday;
        public  AccountServicesImpl(String name ,Integer age,Date birthday){
            this.name = name;
            this.age = age;
            this.birthday = birthday;
        }
        @Override
        public void saveAccount() {
            System.out.println("services"+name+"||"+age+"||"+birthday);
        }
    }
    

    客户端:

    public class client {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext  ApplicationContext = new ClassPathXmlApplicationContext("bean.xml");
            AccountServices accountServices = (AccountServices) ApplicationContext.getBean("accountServices");
            accountServices.saveAccount();
        }
    }
    

    结果:

    结果.png

    1.2 使用set注入

    简单类型的注入
    配置文件:bean.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    两部分: 1.根标签beans的别名:xmlns="http://www.springframework.org/schema/beans"
           2.约束文件:schemaLocation引入约束,然后给约束地址起个别名xsi
      -->
    <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
           https://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--set方式注入:使用property
            property的属性:
           1.找属性:
            name:指定注入时调用的方法名称。
           2.给属性赋值
            value:给基本类型和String赋值。
            ref:指赋值其他Bean类型,即在IOC容器中的Bean。
    
         优势:创建对象没有明确限制,可以直接使用默认构造函数。
         劣势:如果成员必须有值,则set方法无法一定注入。
    
         -->
        <bean id="birthday" class="java.util.Date"></bean>
        <bean id="accountServices" class="com.springdi.services.AccountServicesImpl">
         <property name="name" value="xzb"></property>
         <property name="age" value="20"></property>
         <property name="birthday" ref="birthday"></property>
        </bean>
    </beans>
    

    AccountServicesImpl:

    public class AccountServicesImpl implements AccountServices {
        private  String  name;
        private  Integer age;
        private  Date    birthday;
        public void setName(String name) {
            this.name = name;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        @Override
        public void saveAccount() {
            System.out.println("services"+name+"||"+age+"||"+birthday);
        }
    }
    

    客户端:

    public class client {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext  ApplicationContext = new ClassPathXmlApplicationContext("bean.xml");
            AccountServices accountServices = (AccountServices) ApplicationContext.getBean("accountServices");
            accountServices.saveAccount();
        }
    }
    

    结果:

    结果.png

    复杂类型的注入
    配置文件bean.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    两部分: 1.根标签beans的别名:xmlns="http://www.springframework.org/schema/beans"
                   2.约束文件:schemaLocation引入约束,然后给约束地址起个别名xsi
      -->
    <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
           https://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--set方式注入复杂类型:结构相同,标签可以互换。
          List类: List Array Set
          Map类: Map Properties
        -->
        <bean id="accountServices" class="com.springdi.services.AccountServicesImpl">
         <property name="myStrs">
             <array>
                 <value>a</value>
                 <value>b</value>
                 <value>c</value>
             </array>
         </property>
         <property name="mylist">
              <list>
                   <value>a-list</value>
                   <value>b-list</value>
                   <value>c-list</value>
              </list>
          </property>
          <property name="mySet">
               <set>
                  <value>a-set</value>
                  <value>b-set</value>
                  <value>c-set</value>
               </set>
          </property>
    
          <property name="myMap">
                <map>
                    <entry key="a" value="a-map"></entry>
                    <entry key="b">
                        <value>b-map</value>
                    </entry>
                </map>
          </property>
          <property name="myProps">
              <props>
                  <prop key="a">a-prop</prop>
                  <prop key="b">b-prop</prop>
              </props>
          </property>
        </bean>
    </beans>
    

    AccountServicesImpl:

    public class AccountServicesImpl implements AccountServices {
    
        private String[] myStrs;
        private List<String> mylist;
        private Set<String> mySet;
        private Map<String,String> myMap;
        private Properties myProps;
        public void setMyStrs(String[] myStrs) {
            this.myStrs = myStrs;
        }
    
        public void setMylist(List<String> mylist) {
            this.mylist = mylist;
        }
    
        public void setMySet(Set<String> mySet) {
            this.mySet = mySet;
        }
    
        public void setMyMap(Map<String, String> myMap) {
            this.myMap = myMap;
        }
    
        public void setMyProps(Properties myProps) {
            this.myProps = myProps;
        }
        @Override
        public void saveAccount() {
            System.out.println(Arrays.toString(myStrs));
            System.out.println(mylist);
            System.out.println(mySet);
            System.out.println(myMap);
            System.out.println(myProps);
        }
    
    }
    

    客户端:

    public class client {
        public static void main(String[] args) {
    
            ClassPathXmlApplicationContext  ApplicationContext = new ClassPathXmlApplicationContext("bean.xml");
            AccountServices accountServices = (AccountServices) ApplicationContext.getBean("accountServices");
            accountServices.saveAccount();
        }
    }
    
    

    结果:

    结果.png

    1.3 Bean的生命周期

    Bean的生命周期定义、创建、解析和销毁。

    1.3.1 Bean的定义

    Bean的定义

    1.3.2 Bean的创建

    Bean的创建流程 Bean的生命周期

    相关文章

      网友评论

          本文标题:03-Spring-DI

          本文链接:https://www.haomeiwen.com/subject/edrmnktx.html