Bean的概念
Spring中Bean就是一个类的实例
<bean id="" class="" />
通过构造器完成类的实例化
Bean的生成方式有三种:
1、构造器生成
<?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的生成方式
1、构造器生成
com.hhh.pojo.User必须有为空的构造器
-->
<bean id="user" class="com.hhh.pojo.User"></bean>
</beans>
@Test
public void testConstrutor(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("app2.xml");
User user = (User) applicationContext.getBean("user");
System.out.println(user);
}
2、静态工厂
package com.hhh.util;
import com.hhh.pojo.User;
/**
* @Author: hehehe
* @Date: 2022/4/15 15:22
*/
public class UserFactory {
public static User getUser(){
return new User();
}
}
<?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">
<!--
2、静态工厂
User user = UserFactory.getUser();
-->
<bean id="user2" class="com.hhh.util.UserFactory" factory-method="getUser"></bean>
</beans>
3、实例工厂
package com.hhh.util;
import com.hhh.pojo.User;
/**
* @Author: hehehe
* @Date: 2022/4/15 15:22
*/
public class UserFactory2 {
public User getUser(){
return new User();
}
}
<?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">
<!--
3、实例工厂
UserFactory userFactory = new UserFactory();
User user = userFactory.getUser();
-->
<bean id="userFactory" class="com.hhh.util.UserFactory2"></bean>
<bean id="user3" factory-bean="userFactory" factory-method="getUser"></bean>
</beans>
bean的作用域范围
scope有如下五个取值:
- singleton:单例的(默认的),使用singleton定义的Bean是单例的,每次调用getBean都是调用的同一个对象。只要IoC容器一创建就会创建Bean的实例。
- prototype:多例的,每次通过Spring IoC容器获取prototype定义的Bean时,容器都将创建一个新的Bean实例。创建时不会实例该Bean,只有调用getBean方法时,才会实例化。
- request:作用于web的请求范围,在每一次HTTP请求时,容器会返回Bean的同一个实例,对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Request内有效。
- session:作用于web的会话范围,在一次HTTP Session中,容器会返回该Bean的同一个实例,对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Session内有效。
- global-session:作用于集群环境的会话范围(全局会话范围),在一个全局的HTTP Session中,容器返回Bean的同一个实例。当不是集群环境时,它就是session。
<?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的作用范围
prototype 原型 每次获取产生一个新的实例
singleton 单例 每次获取都是同一个实例
request 以下三个属性是在web应用中使用
session
gobal-session
-->
<bean id="user" class="com.hhh.pojo.User" scope="singleton"></bean>
</beans>
@Test
public void testScope(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("app3.xml");
//从容器中两次获得相同的id,判断两个实例是否相等,相等为单例,否则为多例
User user = (User) applicationContext.getBean("user");
User user2 = (User) applicationContext.getBean("user");
System.out.println(user==user2);
}