Spring基于配置文件的注入及简化

1.注入初体验

拿入门的Person作为测试bean,只有 id 和 name 两个属性

步骤:提供Setter、Getter
	 在配置文件bean标签中,新增property标签,再在内部中添加value标签
<bean id="person" class="zyc.stu.bean.Person">
   <property name="id">
      <value>18</value>
   </property>
</bean>

测试:

ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
Person person = (Person) context.getBean("person");
System.out.println(person.getId());

2.set注入

先对Person类进行改造

package zyc.stu.Spring5_1_23.bean;

import java.util.Map;
import java.util.Properties;
import java.util.Set;

/**
 * @author zhuZiGe_
 * @create 2020-09-09-11:08
 */
public class Person {
    private int Id;
    private String Name;
    private String[] emails;
    private Set<String> tels;
    private Map<String,String> qqs;
    private Properties p;

    public Properties getP() {
        return p;
    }

    public void setP(Properties p) {
        this.p = p;
    }

    public Map<String, String> getQqs() {
        return qqs;
    }

    public void setQqs(Map<String, String> qqs) {
        this.qqs = qqs;
    }

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public Set<String> getTels() {
        return tels;
    }

    public void setTels(Set<String> tels) {
        this.tels = tels;
    }

    public String[] getEmails() {
        return emails;
    }

    public void setEmails(String[] emails) {
        this.emails = emails;
    }

    public Person() {
    }

    public Person(int id, String name) {
        Id = id;
        Name = name;
    }

    public Person(int id, String name, String[] emails) {
        Id = id;
        Name = name;
        this.emails = emails;
    }

    public Person(int id, String name, String[] emails, Set<String> tels) {
        Id = id;
        Name = name;
        this.emails = emails;
        this.tels = tels;
    }

    @Override
    public String toString() {
        return "Person{" +
                "Id=" + Id +
                ", Name='" + Name + '\'' +
                '}';
    }
}

2.1 JDK内置类型:

   int等8种基本类型+string:直接按照上面的方式注入
   
   数组:		使用<list>标签
   Set集合:	使用<set>标签
   list集合:使用<list>标签,内部和set类似,但注意有序性和可重复性
   Map集合:	使用<map>和<entry>标签,entry 的key使用组合标签<key><value>,value直接使用<value>标签
   Properties集合:使用<props>和<prop>标签,properties的值只能是string类型,直接将其嵌入
    <bean id="personInjection" class="zyc.stu.Spring5_1_23.bean.Person">
        <property name="id">
            <value>19</value>
        </property>
        <property name="name">
            <value>zyc</value>
        </property>
        <property name="emails">
            <list>
                <value>7616.qq.com</value>
                <value>223344.qq.com</value>
                <value>556677.qq.com</value>
            </list>
        </property>
        <property name="tels">
            <set>
                <value>133123456</value>
                <value>123566666</value>
                <value>123555555</value>
                <value>123555555</value>
            </set>
        </property>
        <property name="qqs">
            <map>
                <entry>
                    <key><value>"zyc"</value></key>
                    <value>123456</value>
                </entry>
                <entry>
                    <key><value>"zyc1"</value></key>
                    <value>1234567</value>
                </entry>
            </map>
        </property>
        <property name="p">
            <props>
                <prop key="key1">value1</prop>
                <prop key="key2">value2</prop>
            </props>
        </property>
    </bean>
    @Test
    public void test2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
        
        Person personInjection = (Person) context.getBean("personInjection");
        String[] emails=personInjection.getEmails();
        for (String s :emails) {
            System.out.println(s);
        }

        Set<String> tels = personInjection.getTels();
        for (String s :tels) {
            System.out.println(s);
        }

        Map<String, String> qqs = personInjection.getQqs();
        System.out.println(qqs);

        Properties p = personInjection.getP();
        System.out.println(p);
    }

2.2 自定义类型:不做测试

方式一:直接使用<bean>标签
        缺点:代码冗余,浪费内存
方式二:先创建好bean,然后在其他地方引用 ref
        <bean id="xxxclass1" class="xxx.xxx">

        <bean id="xxxclass2" class="xxx.xxx.xxx">
            <properties name="xxxprop">
                <ref bean="xxxclass1"/>
            </properties>
        </bean>

3.构造注入

1.提供有参构造方法(个数对应)
        public Person(int id, String name) {
            Id = id;
            Name = name;
        }
2.配置文件中进行配置:
	使用<constructor-arg>标签,注意参数顺序对应,除非有相应的重载
	
        <bean id="person" class="zyc.stu.bean.Person">
            <constructor-arg>
                <value>22</value>
            </constructor-arg>
            <constructor-arg>
                <value>zyc</value>
            </constructor-arg>
        </bean>

3.1 构造方法发生重载时

  • 个数不同的重载----直接用对应的<constructor-arg>标签的数量进行区分
  • 数量相同类型不同的重载----对<constructor-arg>的类型进行限定,<constructor-arg type="int">

4.基于set注入的简化

4.1 value属性简化

将property的内部标签改成property的value属性

    <bean id="person" class="zyc.stu.bean.Person">
        <property name="name" value="zyc"/>
    </bean>     

4.2 ref属性简化

同理可以用在自定义类型上,将标签改为ref属性

    <bean id="person" class="zyc.stu.bean.Person">
        <property name="dao" ref="Person"/>
    </bean>

4.3 p命名空间简化

idea有智能提示,没有就自己手动加入xmlns:p="http://www.springframework.org/schema/p"

  JDK 8大类型+String:
    <bean id="personP" class="zyc.stu.bean.Person" p:name="zyc" p:id="20"/>
  自定义类型:
    <bean id="personDao" class="zyc.stu.Spring5_24_33.dao.PersonDao"/>
    <bean id="personServiceP" class="zyc.stu.service.PersonServiceImpl" p:dao-ref="personDao"></bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值