Spring学习四----------Bean的配置之Bean的配置项及作用域

Bean的作用域(每个作用域都是在同一个Bean容器中)

1.singleton:单例,指一个Bean容器中只存在一份(默认)

2.prototype:每次请求(每次使用)创建新的实例,destory方式不生效

3.request:每次http请求创建一个实例且仅在当前request内生效(只能在web中使用)

4.session:同上,每次http请求创建一个实例,当前session内有效(只能在web中使用)

5.global session:基于portlet的web中有效(portlet定义了global session),如果是在单个web中,同session。(只能在web中使用)

实例

1.singleton和prototype

  1.1 目录结构

  1.2 pom.xml

<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>org.spring</groupId>
	<artifactId>Spring</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>Spring</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<spring.version>4.3.7.RELEASE</spring.version>
	</properties>

	<dependencies>
		<!-- junit依赖 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<!-- spring依赖 -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-core</artifactId>
		    <version>${spring.version}</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-beans</artifactId>
		    <version>${spring.version}</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-context</artifactId>
		    <version>${spring.version}</version>
		</dependency>
	</dependencies>
</project>

  1.3 spring-beanscope.xml(scope="singleton" || scope="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">

	<bean id="beanScope" class="org.spring.bean.BeanScope" scope="singleton"/>        

</beans>

  1.4 BeanScope.java

package org.spring.bean;

public class BeanScope {

	public void say () {

		System.out.println("hashCode:" + this.hashCode());//通过hashCode判断是否是同一个实例

	}

}

  1.5 UnitTestBase.java

package org.spring.ioc.test;

import org.junit.After;
import org.junit.Before;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;

/**
 * 单元测试初始化类
 *
 */
public class UnitTestBase {

	private ClassPathXmlApplicationContext context;
	private String springXmlPath;

	/**
	 * 无参构造器
	 */
	public UnitTestBase() {

	}

	/**
	 * 含参构造器
	 *
	 * @param springXmlPath
	 * 						spring配置文件路径
	 */
	public UnitTestBase(String springXmlPath) {

		this.springXmlPath = springXmlPath;

	}

	/**
	 * 初始化spring配置文件
	 */
	@Before//在@Test注解的方法执行前执行
	public void before() {

		if(StringUtils.isEmpty(springXmlPath)) {//默认spring配置文件路径
			springXmlPath = "classpath*:spring-*.xml";
		}
		//加载配置文件,一个context表示一个容器
		context = new ClassPathXmlApplicationContext(springXmlPath.split("[,\\s]+"));
		//启动组件
		context.start();

	}

	/**
	 * 销毁spring组件
	 */
	@After//在@Test注解的方法执行后执行
	public void after() {

		context.destroy();//销毁组件

	}

	/**
	 * 获取spring中定义的bean实例
	 *
	 * @param beanId
	 *
	 * @return
	 */
	@SuppressWarnings("unchecked")
	protected <T extends Object> T getBean(String beanId) {

		return (T) context.getBean(beanId);

	}

	/**
	 * 获取spring中定义的bean实例
	 *
	 * @param clazz
	 *
	 * @return
	 */
	protected <T extends Object> T getBean(Class<T> clazz) {

		return (T) context.getBean(clazz);

	}

}

  1.6 TestBeanScope.java

package org.spring.ioc.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.spring.bean.BeanScope;

@RunWith(BlockJUnit4ClassRunner.class)//指定JUnit默认执行类
public class TestBeanScope extends UnitTestBase {

	public TestBeanScope() {//通过构造方法传入spring配置文件路径

		super("classpath*:spring-beanScope.xml");

	}

	@Test
	public void testScope() {

		BeanScope beanScope = super.getBean("beanScope");
		beanScope.say();

		/**
		 * 若在两个方法中执行这两行代码,则hashCode会不同。
		 * 因为每个test方法执行前都会执行@Before,会重新加载spring配置文件,此时是在两个容器中,所以不同
		 */
		BeanScope beanScope2 = super.getBean("beanScope");
		beanScope2.say();

	}

}

  1.7 singleton效果预览

  1.8 prototype效果预览

2.request和session

  2.1 项目结构

  2.2 pom.xml

<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/maven-v4_0_0.xsd">

	<modelVersion>4.0.0</modelVersion>

	<groupId>org.spring</groupId>
	<artifactId>springBeanScope</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>springBeanScope Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<properties>
		<spring.version>4.3.7.RELEASE</spring.version>
	</properties>

	<dependencies>
		<!-- junit依赖 -->
  		<dependency>
		    <groupId>junit</groupId>
		    <artifactId>junit</artifactId>
		    <version>4.12</version>
		    <scope>test</scope>
	  	</dependency>
	  	<!-- spring核心依赖 -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-core</artifactId>
		    <version>${spring.version}</version>
		</dependency>
	  	<!-- spring web层依赖 -->
	  	<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-webmvc</artifactId>
		    <version>${spring.version}</version>
		</dependency>
		<!-- jstl -->
		<dependency>
		    <groupId>jstl</groupId>
		    <artifactId>jstl</artifactId>
		    <version>1.2</version>
		</dependency>
		<!-- servlet -->
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
	    <version>3.1.0</version>
	</dependency>

	</dependencies>

  	<build>
    	<finalName>springBeanScope</finalName>
  	</build>

</project>

  2.3 mvc-dispatcher-servlet.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"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
    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
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 开启包扫描 -->
    <context:component-scan base-package="org.spring.*"/>

    <!-- 开启注解 -->
    <mvc:annotation-driven/>

    <!-- 定义视图解析器 -->
    <bean id="viewResolver"
    	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="prefix" value="/WEB-INF/jsp/"/>
    	<property name="suffix" value=".jsp"/>
   	</bean>

</beans>

  2.4 BeanScope.xml

package org.spring.bean;

public class BeanScope {

	public int say () {

		return this.hashCode();//通过返回的hashCode判断是否是同一个实例

	}

}

  2.5 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="beanScope" class="org.spring.bean.BeanScope" scope="singleton"/>

</beans>

  2.6 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  	version="3.0" metadata-complete="true">

  	<!-- 启动spring的监听器,默认加载applicationContext.xml -->
  	<listener>
  		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  	</listener>

  	<!-- 自定义spring配置文件路径 -->
  	<context-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:spring.xml</param-value>
  	</context-param>

  	<!-- 拦截所有请求,交由springMVC处理 -->
  	<servlet>
  		<servlet-name>springMVC</servlet-name>
  		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  		<init-param>
  			<param-name>contextConfigLocation</param-name>
  			<param-value>classpath:mvc-dispatcher-servlet.xml</param-value>
  		</init-param>
  	</servlet>
  	<servlet-mapping>
  		<servlet-name>springMVC</servlet-name>
  		<url-pattern>/</url-pattern>
  	</servlet-mapping>

</web-app>

  2.7 BeanScopeAction.java

package org.spring.action;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.spring.bean.BeanScope;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class BeanScopeAction implements ApplicationContextAware {

	private ApplicationContext context;

	@RequestMapping("/")
	public String testScope(ModelMap map, HttpSession session) {

		BeanScope scope = (BeanScope) context.getBean("beanScope");
		List<Integer> list = new ArrayList<Integer>();
		for(int i = 0; i < 3; i++){
			list.add(scope.say());
		}
		map.addAttribute("list", list);
		map.addAttribute("session", session);
		return "scope";

	}

	public void setApplicationContext(ApplicationContext context) throws BeansException {

		this.context = context;

	}

}

  2.8 scope.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring作用域测试</title>
</head>
<body>
	<font color="red">Session:${session }</font><br/>
	<c:forEach var="hashCode" items="${list }" varStatus="status">
		第${status.index + 1 }次获取实例:${hashCode }<br/>
	</c:forEach>
</body>
</html>

  2.9 效果预览

    需刷新才能看见效果,截图表达不清晰,可复制代码自行运行刷新查看结果。

3.global session

  需多个项目才能看见结果,此处不做测试。

参考:http://www.imooc.com/video/3750/

时间: 2024-12-07 14:48:08

Spring学习四----------Bean的配置之Bean的配置项及作用域的相关文章

Spring学习四、Bean自动装配与注解开发

七.Bean的自动装配 自动装配是Spring满足bean依赖的一种方式! Spring会在上下文中自动寻找bean,自动装备属性 在Spring中有三种自动装配方式 在xml中显示配置 在Java中显示配置 隐式的自动装配[重要] 7.1 测试 环境搭建:一个人两个宠物 7.2 ByName自动装配 <!-- ByName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid --> <bean id="people" class="c

Spring学习之路(三)bean注解管理AOP操作

在类上面.方法上面.属性上面添加注解:并用bean来管理: 书写方法:@注解名称(属性名称=值) 第一步:导入jar包 导入spring-aop.jar(spring注解包): 第二步:创建实体类(注解对象) package com.aop; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; /** * value的值是自定义属性值 * @Co

Spring学习(三)ioc工厂bean深入理解

一.ioc工厂配置的bean分类: 划分依据: getBean("xx") 调用某个bean对象返回的对象实例类型是否是class属性指向的类型 1.普通bean getBean("xxx") == class 属性 2.工厂bean getBean("xxx") != class属性 (class属性中指向的是一个工厂类,调用这个bean对象,想要的并不是class属性指向的工厂 ,而是该工厂负责创建的实例对象.) 二.工厂bean的必要性:

Spring 学习总结 使用静态工厂创建Bean

创建Bean时,class属性必须指定,此时为静态工厂类. factory-method指定静态工厂方法名. 接口: public interface Being { public void testBeing(); } Dog类 public class Dog implements Being{ private String msg; public void setMsg(String msg) { this.msg = msg; } @Override public void testBe

spring学习笔记(6)装配Bean 的种类和区别 【资源来自网络 版权非本人】

Bean的种类 1.普通Bean:之前操作的都是普通bean <bean  id="" class="A"> Spring 就直接创建A 然后返回 2.FactoryBean:是一个特殊的Bean,具有工厂生产对象的能力,但是只能生产特定的对象 bean必须实现Factorybean的接口,此接口提供一个getObject()来获得特定的bean. <bean id="" calss="Factorybean"

Spring学习(四)--面向切面的Spring

一.Spring--面向切面 在软件开发中,散布于应用中多处的功能被称为横切关注点(cross- cutting concern).通常来讲,这些横切关注点从概念上是与应用的业 务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑之中).把 这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的问题.--什么是面向切面编程 切面能帮助我们模块化横切关注点.简而言之,横切关注 点可以被描述为影响应用多处的功能.例如,安全就是一个横切关注 点,应用中的许多方法都会涉及到安全规则: --如上

spring学习四

1: InitializingBean  vs  init-method InitializingBean 是一个接口,有一个方法afterPropertiesSet,不建议使用:因为InitializingBean是Spring接口,这样导致 bean和spring耦合到一起了. <bean id="SimpleBean1" class="com.SimpleBean" init-method="init" destroy-method=

Spring学习九----------Bean的配置之Bean的定义及作用域的注解实现

Spring Bean常用注解 @Component:通常注解,可用于任何Bean @Repository:通常用于注解DAO层,即持久层 @Service:通常用于注解Service层,即服务层 @Controller:通常用于注解Controller层,即控制层 类的自动检测及Bean的注册 <context:component-scan base-package=""/>:自动扫描base-package定义的包或其子包下的类,并将带有@Component,@Cont

spring学习笔记(5)装配Bean 实例工厂 【资源来自网络 版权非本人】

实例工厂:必须现有工厂的实例对象,通过实例对象创建对象.所有的方法都是非静态的(这一点和静态工厂有区别) (直接看代码) 工厂(和静态工厂的区别就是非静态 其他都一样) package c_inject.c_factory; /* * 实例工厂 */ public class MyBeanFactory { public UserService createService(){ return new UserserviceImpl(); } } 配置(配置和静态的有点区别  仔细看看吧 ) <?