bean的作用域
- 单例模式(Spring默认机制)
<bean id="user2" class="com.cloud.pojo.User" c:name="王狗蛋" c:age="65" scope="singleton"/>
- 原型模式:每次从容器中get的时候,都会产生一个新对象!
<bean id="user2" class="com.cloud.pojo.User" c:name="王狗蛋" c:age="65" scope="prototype"/>
- 其余的requst,session,application,这些只能在web开发中使用到!
Bean的自动装配
- 自动装配是Spring满足bean依赖一种方式!
- Spring会在上下文中自动寻找,并自动给bean装配属性!
在Spring中有三种装配的方式
- 在xml中显示的配置
- 在Java中显示配置
- 隐式的自动装配bean【重要】
测试
-
项目结构
-
实体类
package com.cloud.pojo;
public class Cat {
public void shout(){
System.out.println("喵");
}
}
package com.cloud.pojo;
public class Dog {
public void shout(){
System.out.println("汪");
}
}
package com.cloud.pojo;
public class People {
private Dog dog;
private Cat cat;
private String name;
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People{" +
"dog=" + dog +
", cat=" + cat +
", name='" + name + '\'' +
'}';
}
}
- beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cat" class="com.cloud.pojo.Cat"/>
<bean id="dog" class="com.cloud.pojo.Dog"/>
<!--
byName:会自动在容器上下文中呢去查找,和自己对象set方法后面的值对应的bean id!也就是 bean id="dog"是否和实体类中set dog
中的名字是否相同。
-->
<bean id="people" class="com.cloud.pojo.People" autowire="byName">
<property name="name" value="小兰"/>
</bean>
</beans>
- 测试
import com.cloud.pojo.People;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void Text1(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
People people = context.getBean("people", People.class);
people.getCat().shout();
people.getDog().shout();
}
}
ByName
<!--
byName:会自动在容器上下文中呢去查找,和自己对象set方法后面的值对应的bean id!也就是 bean id="dog"是否和实体类中set dog
中的名字是否相同。
-->
<bean id="people" class="com.cloud.pojo.People" autowire="byName">
<property name="name" value="小兰"/>
</bean>
ByType
<bean class="com.cloud.pojo.Cat"/>
<bean class="com.cloud.pojo.Dog"/>
<!--
byName:会自动在容器上下文中呢去查找,和自己对象set方法后面的值对应的bean id!也就是 bean id="dog"是否和实体类中set dog
中的名字是否相同。
byType:会自动在容器上下文中呢去查找,和自己对象属性类型相同的bean!
-->
<bean id="people" class="com.cloud.pojo.People" autowire="byType">
<property name="name" value="小兰"/>
</bean>
小结:
- byname的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法一致!
- bytype的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!