高斋晓开卷,独共圣人语。这篇文章主要讲述Spring:玩转bean的作用域和自动装配!相关的知识,希望能为你提供帮助。
一、bean的作用域
文章图片
- 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。
- 简单地讲,bean就是由IoC容器初始化、装配及管理的对象 .
- 实体类:
public class Person {
private String name;
private int age;
private String like;
private String high;
}
1.1、Singleton:单例
①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="person" class="dyj.entity.Person" scope="singleton">
<
property name="like" value="https://www.songbingjia.com/android/钓鱼"/>
<
property name="age" value="https://www.songbingjia.com/android/23"/>
<
property name="name" value="https://www.songbingjia.com/android/丁大大"/>
<
/bean>
<
/beans>
②测试类:
public class Test {
public static void main(String[] args) {
ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml");
Person person1 =Context.getBean("person",Person.class);
Person person2 =Context.getBean("person",Person.class);
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
System.out.println(person1==person2);
}
}
③执行结果如下:
文章图片
④总结:
- scope为singleton时,Spring容器里面有且只有一个实例。
- 不管你是否使用了该实例,在容器启动时就已经创建好了。
①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="person" class="dyj.entity.Person" scope="prototype">
<
property name="like" value="https://www.songbingjia.com/android/钓鱼"/>
<
property name="age" value="https://www.songbingjia.com/android/23"/>
<
property name="name" value="https://www.songbingjia.com/android/丁大大"/>
<
/bean>
<
/beans>
②测试类:
public class Test {
public static void main(String[] args) {
ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml");
Person person1 =Context.getBean("person",Person.class);
Person person2 =Context.getBean("person",Person.class);
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
System.out.println(person1==person2);
}
}
③执行结果:
文章图片
【Spring(玩转bean的作用域和自动装配!)】④总结:
- 当scope为prototype时,一个bean对应多个对象实例!
- 在我们启动容器时并没有实例化,只有在使用时才会在Spring容器里实例化!
- 当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:
<
bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
- 针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。
- 当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:
<
bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
- 针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。
①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="car" class="dyj.entity.Car"/>
<
bean id="house" class="dyj.entity.House"/>
<
bean id="person" class="dyj.entity.Person">
<
property name="car" ref="car"/>
<
property name="house" ref="house"/>
<
property name="like" value="https://www.songbingjia.com/android/钓鱼"/>
<
property name="age" value="https://www.songbingjia.com/android/23"/>
<
property name="name" value="https://www.songbingjia.com/android/丁大大"/>
<
/bean>
<
/beans>
②实体类:
public class Car {
public void getName(){
System.out.println("我是一辆车!");
}
}
public class House {
public void getName(){
System.out.println("我是一栋房子!");
}
}
public class Person {
private Car car;
private House house;
private String name;
private int age;
private String like;
private String high;
}
③测试类:
public class Test {
public static void main(String[] args) {
ApplicationContext Context = new ClassPathXmlApplicationContext("ContextAplication.xml");
Person person =Context.getBean("person",Person.class);
person.getCar().getName();
person.getHouse().getName();
}
}
④执行结果:
文章图片
⑤总结:
- 搭建完成。
- 可正常注入Bean。
①修改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="car" class="dyj.entity.Car"/>
<
bean id="house" class="dyj.entity.House"/>
<
bean id="person" class="dyj.entity.Person" autowire="byName">
<
property name="like" value="https://www.songbingjia.com/android/钓鱼"/>
<
property name="age" value="https://www.songbingjia.com/android/23"/>
<
property name="name" value="https://www.songbingjia.com/android/丁大大"/>
<
/bean>
<
/beans>
②执行结果:
文章图片
③总结:
- 证明可以通过 autowire="byName" 根据名称来自动装配!
- 前提是:bean 的值和实体类中的属性名一致!
①修改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 class="dyj.entity.Car"/>
<
bean class="dyj.entity.House"/>
<
bean id="person" class="dyj.entity.Person" autowire="byType">
<
property name="like" value="https://www.songbingjia.com/android/钓鱼"/>
<
property name="age" value="https://www.songbingjia.com/android/23"/>
<
property name="name" value="https://www.songbingjia.com/android/丁大大"/>
<
/bean>
<
/beans>
②执行结果:
文章图片
③总结:
- 跟bean中的id无关,可去除!
- 同一个bean只能有一个,否则报错!
- 前面已经讲解过了!
推荐阅读
- Alibaba工具型技术系列「EasyExcel技术专题」摒除OOM!让你的Excel操作变
- 如何一次向所有wp帖子添加功能
- 如何在WordPress中添加活动类以锚定标签
- 如果它是WordPress的首页,如何将类添加到body元素()
- 如何从WordPress中的另一个PHP文件访问数组变量()
- WordPress数组如何在后台工作()
- 如何使用自定义分类(产品,类别,用户,自定义帖子类型)进行搜索,使用没有任何插件的功能搜索WordPress
- 如何在WordPress中创建响应式图像轮播和幻灯片自定义帖子类型内容
- 你如何正确地向WordPress Customizer添加图像控件()