Bean标签基本配置
作用:
用于配置对象交由Spring来创建。
默认情况下它调用的是类中的无参构造函数,如果没有无参构造则无法创建成功。
基本属性:
id:Bean实例在Spring容器中的唯一标识
class:Bean的全限定名称
Bean标签范围配置
scope:指对象的作用范围,取值如下:
前面两个标红的很熟了,后面三个是要部署在web环境中的。它们仨差不多,意思是Spring除了创建一个Bean对象放进容器的同时呢,还会将该对象放入request域啊、session域啊等等。
代码实操
注意使用单元测试时,要先在pom.xml中引入单元测试junit包的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--项目坐标-->
<groupId>com.Why</groupId>
<artifactId>Spring-learning</artifactId>
<version>1.0-SNAPSHOT</version>
<!--Spring的上下文jar包依赖
Spring通过应用上下文(Application Context)装载bean的定义并把它们组装起来。
Spring应用上下文全权负责对象的创建和组装。
这也就对应了前一标题提到的开发流程中Spring的操作实现
-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
</project>
然后我们先测试scope=“singleton”
<?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">
<!--id叫什么名儿都行,然后后面的class跟上全类名-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="singleton">
</bean>
</beans>
测试代码为:
package com.itheima;
import com.itheima.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class springtest {
@Test
//测试scope="singleton"
public void test1(){
//寻找Spring的配置文件
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//id就是这里的Spring容器要创建的哪个bean对象的标识
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
}
}
输出为:
再测试prototype
<?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">
<!--id叫什么名儿都行,然后后面的class跟上全类名-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="prototype">
</bean>
</beans>
package com.itheima;
import com.itheima.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class springtest {
@Test
//测试scope="prototype"
public void test1(){
//寻找Spring的配置文件
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//id就是这里的Spring容器要创建的哪个bean对象的标识
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
}
}
输出结果为:
scope值不同时,所产生的差别: