Bean的作用范围
singleton (默认)将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例。
prototype 将单个 bean 定义的作用域限定为任意数量的对象实例。
request 将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有一个在单个 bean 定义后面创建的 bean 实例。仅在可感知网络的 Spring ApplicationContext中有效。
session 将单个 bean 定义的范围限定为 HTTP Session的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。
application 将单个 bean 定义的范围限定为ServletContext的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。
websocket 将单个 bean 定义的范围限定为WebSocket的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。
当我们是使用单例模式,在多线程下经常使用
<bean id="user" class="aw.dao.User" c:args="阿牛" p:name="阿威" p:age="20" p:sex="男" scope="singleton"/>
public void test3(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext5.xml");
User user = (User) context.getBean("user");
User user2 = (User) context.getBean("user");
//true
System.out.println(user==user2);
}
使用原型模式,
<bean id="user" class="aw.dao.User" c:args="阿牛" p:name="阿威" p:age="20" p:sex="男" scope="prototype"/>
每次调用bean方法他都会创建一个对象。
public void test3(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext5.xml");
User user = (User) context.getBean("user");
User user2 = (User) context.getBean("user");
//false
System.out.println(user==user2);
}
其他几种模式实在web端下使用。
Bean的自动装配
1.使用xml进行(已经了解)
2.使用原生java显示配置
3.隐士的自动装配
隐士装配
我们可以在bean中添加autowire属性,这是自动装饰的意思。
byName值:需要保证在当前xml文件中bean的id唯一,并且这个bean需要和注入对象中属性的set方法名一致
<bean id="cat" class="aw.dao.Cat"/>
<bean id="dog" class="aw.dao.Dog"/>
<bean id="people" class="aw.dao.People" autowire="byName">
<property name="name" value="阿威"/>
</bean>
byType值:需要保证在当前xml文件中bean的class唯一,并且这个bean需要和注入对象中属性的类型一致
<bean id="cat" class="aw.dao.Cat"/>
<bean id="dog" class="aw.dao.Dog"/>
<bean id="people" class="aw.dao.People" autowire="byType">
<property name="name" value="阿威"/>
</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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
开启注解、context:annotation-config/仅在定义它的相同应用程序上下文中查找 bean 上的 注解。
<context:annotation-config/>
@Autowired注解
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="cat" class="aw.dao.Cat"/>
<bean id="dog" class="aw.dao.Dog"/>
<bean id="people" class="aw.dao.People">
<property name="name" value="阿威"/>
</bean>
</beans>
我们需要在实体类中相应的属性上面添加上@Autowired注解,这样我们就不用再去写他的set方法了。
package aw.dao;
import org.springframework.beans.factory.annotation.Autowired;
public class People {
@Autowired
private Cat cat;
@Autowired
public Dog dog;
public String name;
public Cat getCat() {
return cat;
}
public Dog getDog() {
return dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我们还可以直接在set方法上面添加@Autowired
package aw.dao;
import org.springframework.beans.factory.annotation.Autowired;
public class People {
private Cat cat;
public Dog dog;
public String name;
public Cat getCat() {
return cat;
}
@Autowired
public void setCat(Cat cat) {
this.cat = cat;
}
public Dog getDog() {
return dog;
}
@Autowired
public void setDog(Dog dog) {
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我们进到这个注解的内部可以看到有一个required默认值为true。
public @interface Autowired {
boolean required() default true;
}
当我们在中的添加required=false 。意思是这个对象可以为空,我们不写set方法也可以使用。
package aw.dao;
import org.springframework.beans.factory.annotation.Autowired;
public class People {
@Autowired(required = false)
private Cat cat;
@Autowired
public Dog dog;
public String name;
public Cat getCat() {
return cat;
}
//
// public void setCat(Cat cat) {
// this.cat = cat;
// }
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Qualifier(value=“xx”)次注解是配合@Autowired使用的,当我们有多个bean执行的类型一样但是名字不一样,我们可以使用@Qualifier使用来确定他的唯一值。
@Autowired
@Qualifier(value="cat123")
private Cat cat;
<bean id="cat1" class="aw.dao.Cat"/>
<bean id="cat123" class="aw.dao.Cat"/>
@Nullable 这个注解的意思是可以让这个字段为空。
public void setName(@Nullable String name) {
this.name = name;
}
@Resource这个注解相对来说比较强大,他会先通过名来进行查找,然后在通过类型查找。这里的类型必须全局唯一的,不然会报错。
@Resource
public Dog dog;
<bean id="dog1" class="aw.dao.Dog"/>
现在类型不是唯一的,我们就需要给他添加名字。
@Resource(name = "dog2")
public Dog dog;
<bean id="dog1" class="aw.dao.Dog"/>
<bean id="dog2" class="aw.dao.Dog"/>
@Autowired是通过类型来查找的,对象不能为空。
@Resource是通过默认的名字来找的,找不到他就会通过类型来查找。