Spring 学习笔记(二) IoC用法解析

bean之间相互调用

  1. 创建三个实体类
package entity;

public class School {
    private int id;
    private Student student;

    public int getId() {
        return id;
    }

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

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }
}
import java.util.List;

public class Student {
    private long id;
    private String name;
    private int age;
    private List<Address> addresses;

    public long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<Address> getAddresses() {
        return addresses;
    }

    public void setAddresses(List<Address> addresses) {
        this.addresses = addresses;
    }
}

package entity;

public class Address {
        private String road;

    public String getRoad() {
        return road;
    }

    public void setRoad(String road) {
        this.road = road;
    }
}

  1. spring.xml设置bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.3.xsd ">
    <bean id="student" class="entity.Student">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
        <property name="age" value="22"></property>
        <property name="addresses">
            <list>
                <ref bean="address1"></ref>
                <ref bean="address2"></ref>
            </list>
        </property>
    </bean>
    <bean id="school" class="entity.School">
        <property name="id" value="1"></property>
        <property name="student" ref="student"></property>
    </bean>
    <bean id="address1" class="entity.Address">
        <property name="road" value="泉城路"></property>
    </bean>
    <bean id="address2" class="entity.Address">
        <property name="road" value="春熙路"></property>
    </bean>
</beans>
  1. 测试类
package test;

import entity.School;
import entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
//        Student student = new Student();
//        student.setId(1);
//        System.out.println(student.getId());
        //加载配置文件
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring.xml");
        //去除其中的bean
        Student student =(Student) applicationContext.getBean("student");
        School school = (School) applicationContext.getBean("school");
        System.out.println(student.getAddresses());
        System.out.println(school.getStudent());
    }
}

scope作用域

bean是根据scope来生成的,有一下四种作用域

  • singleton:单例,从Ioc容器获取的bean为唯一的
  • prototype:原型,从IoC容器获取的bean为不同的
  • request:请求,再一次HTTP请求内是有效
  • session:会话,在一次用户会话中有效

Spring 继承

spring继承会继承parent的内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.3.xsd ">
    <bean id="student" class="entity.Student">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
        <property name="age" value="22"></property>
        <property name="addresses">
            <list>
                <ref bean="address1"></ref>
                <ref bean="address2"></ref>
            </list>
        </property>
    </bean>
    <bean id="student2" class="entity.Student" parent="student">
        <property name="id" value="2"></property>
    </bean>
    <bean id="school" class="entity.School">
        <property name="id" value="1"></property>
        <property name="student" ref="student"></property>
    </bean>
    <bean id="address1" class="entity.Address">
        <property name="road" value="泉城路"></property>
    </bean>
    <bean id="address2" class="entity.Address">
        <property name="road" value="春熙路"></property>
    </bean>
</beans>
package test;

import entity.School;
import entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
//        Student student = new Student();
//        student.setId(1);
//        System.out.println(student.getId());
        //加载配置文件
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring.xml");
        //去除其中的bean
        Student student =(Student) applicationContext.getBean("student");
        School school = (School) applicationContext.getBean("school");
        Student student1 =(Student) applicationContext.getBean("student2") ;
        System.out.println(student1.getId());
        System.out.println(student1.getName());
    }
}

运行结果

2
张三

Spring依赖

bean的depends-on属性表示依赖,是一种bean之间的关系
被依赖的bean要首先创建,才可以创建依赖的bean

Spring的p命名空间

是一种创建bean的简化模式

<bean id="Student4" class="entity.Student" p:id="3" p:addresses-ref="address2"/>

bean的另一种注入方法constructor-arg

package entity;

public class Anew {
    private int id;
    private String name;
    public Anew(){

    }
    public Anew(int id,String name){
        this.id=id;
        this.name=name;
    }

    @Override
    public String toString() {
        return "Anew:id:"+id+",name:"+name;
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.3.xsd ">    
    <bean id="anew" class="entity.Anew">
        <constructor-arg index="0" value="1"></constructor-arg>
        <constructor-arg index="1" value="anew"></constructor-arg>
    </bean>
 
</beans>
package test;

import entity.Anew;
import entity.School;
import entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
//        Student student = new Student();
//        student.setId(1);
//        System.out.println(student.getId());
        //加载配置文件
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring.xml");
        //去除其中的bean
        Anew anew =(Anew) applicationContext.getBean("anew");
        System.out.println(anew.toString());
    }
}

结果:

Anew:id :1,name:anew

分析:constructor-arg的实体类中不设置set、get方法,设置一个带参构造函数和一个不带参构造函数,用index表示是第几个变量来进行注入。也可不用index属性,使用name属性来注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值