• spring中的依赖注入


    Ioc的作用: 降低程序间的耦合(依赖关系)

    依赖关系的管理: 以后都交给Spring来维护

    在当前类需要用到其他类的对象,由Spring为我们提供, 我们只需要在配置文件中说明

    依赖关系的维护,就称之为依赖注入(Dependency Injection)

    依赖注入:

    能注入的数据,有三类:

        如果是经常变化的数据,并不适用于注入的方式

        基本类型和String

        其他bean类型(在配置文件中或注解配置过的bean)

        复杂类型/集合类型

    注入的方式,有三种:

    第一种: 使用构造函数提供

    public class AccountServiceImpl implements IAccountService {
        //如果是经常变化的数据,并不适用于注入的方式
        private String name;
        private Integer age;
        private Date birthday;
    
        public AccountServiceImpl(String name,Integer age,Date birthday){
            this.name = name;
            this.age = age;
            this.birthday = birthday;
        }
    
        public void  saveAccount(){
            System.out.println("service中的saveAccount方法执行了。。。"+name+","+age+","+birthday);
        }
    }
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
            <constructor-arg name="name" value="泰斯特"></constructor-arg>
            <constructor-arg name="age" value="18"></constructor-arg>
            <constructor-arg name="birthday" ref="now"></constructor-arg>
    </bean> <!-- 配置一个日期对象 --> <bean id="now" class="java.util.Date"></bean>

            使用的标签: constructor-arg

            标签出现的位置: bean标签的内部

            标签中的属性:

              type : 用于指定要注入的数据的数据类型, 该数据类型也是构造函数中某个或某些参数的类型

              index: 用于指定要注入的数据给构造函数中指定索引位置的参数赋值, 索引的位置从0开始

              name: 用于指定给构造函数中指定名称的参数赋值

              =====以上三个用于指定给构造函数中哪个参数赋值=====

              value : 用于提供基本类型和String类型的数据

              ref : 用于指定其他的bean类型数据 . 它指的就是在spring的Ioc核心容器中出现过的bean对象

            优势: 

              在获取bean对象时, 注入数据是必须的操作, 否则对象无法创建成功

            弊端:

              改变了bean对象的实例化方式, 使我们在创建对象时, 如果用不到这些数据, 也必须提供 

              

    第二种: 使用set方法提供  更常用

    public class AccountServiceImpl2 implements IAccountService {
        //如果是经常变化的数据,并不适用于注入的方式
        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;
        }
    
        public void  saveAccount(){
            System.out.println("service中的saveAccount方法执行了。。。"+name+","+age+","+birthday);
        }
    }
    <bean id="accountService2" class="com.itheima.service.impl.AccountServiceImpl2">
            <property name="name" value="TEST" ></property>
            <property name="age" value="21"></property>
            <property name="birthday" ref="now"></property>
    </bean>

            涉及的标签: property

            出现的位置: bean标签的内部

            标签中的属性: 

              name: 用于指定注入时所调用的set方法名称 (与类中定义的变量名称无关, 如果一个set方法为 setUsername(), 则相应的name中的属性应为username).

              value : 用于提供基本类型和String类型的数据

              ref : 用于指定其他的bean类型数据 . 它指的就是在spring的Ioc核心容器中出现过的bean对象

            优势:

              创建对象时没有明确的限制, 可以直接使用默认构造函数

            弊端: 

              如果有某个成员必须有值, 则set方法无法保证一定注入. (则获取对象时有可能set方法没有执行)

      复杂类型/集合类型的注入

    public class AccountServiceImpl3 implements IAccountService {
    
        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;
        }
        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);
        }
    }
    <bean id="accountService3" class="com.itheima.service.impl.AccountServiceImpl3">
            <property name="myStrs">
               <array>
                    <value>A</value>
                    <value>B</value>
                </array>
            </property>
    
            <property name="myList">
                <list>
                    <value>A</value>
                    <value>B</value>
                </list>
            </property>
    
            <property name="mySet">
                <set>
                    <value>A</value>
                    <value>B</value>
                </set>
            </property>
    
            <property name="myMap">
                <map>
                    <entry key="testA" value="A"></entry>
                    <entry key="testB">
                        <value>B</value>
                    </entry>
            </property>
    
            <property name="myProps">
                 <props>
                    <prop key="testC">C</prop>
                    <prop key="testD">D</prop>
                </props>
            </property>
        </bean>                
         
            用于给List结构集合注入的标签:
                list array set
            用于个Map结构集合注入的标签:
                map  props
            结构相同,标签可以互换第三种: 使用注解提供

    第三种: 使用注解提供


    spring基于注解的IOC

  • 相关阅读:
    volatile关键字
    线程的状态
    java中的匿名内部类
    java高精度实数和小数
    JS、JSP、ASP、CGI
    论文结构要求
    java中的标识符、关键字、保留字
    java IODemo
    Bagging和Boosting的区别
    由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)
  • 原文地址:https://www.cnblogs.com/mkl7/p/10679827.html
Copyright © 2020-2023  润新知