bean之间相互调用
- 创建三个实体类
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;
}
}
- 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>
- 测试类
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属性来注入