Spring Bean中的五大作用域(Spring web.xml配置)

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"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans 
	                       http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

	<!-- 
			bean的作用域:singleton、prototype、request、session、globalSession
					1、scope="singleton":单例模式,默认配置,所有bean在内存中仅存在一个对象
										好处:节省内存、共享对象、注意线程安全
										
					2、scope="prototype":原型模式(非单例模式),在用户每次调用一个getBean,生成一个对象
										  有状态的bean使用原型模式
										  无状态的bean使用单例模式
				  	3、scope="request":在一次请求中有效
				  	
				  	4、scope="session":在一次会话中有效
				  	
				  	5、 scope="globalSession":在一次会话中有效
				  	
				  	3、4、5需要在web环境下才能使用
				
	 -->
	 	
	 	
	 	
		<bean id="userDao" class="spring.UserDaoImpl" scope="globalSession"></bean>
</beans>

测试的环境就不说了,前面几篇都有,直接上test类

package spring.factory;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import spring.IUserDao;

public class test {
	public static void main(String[] args) {
		//加载并解析ApplicationContext.xml
		ClassPathXmlApplicationContext 	factory=  new ClassPathXmlApplicationContext("applicationContext.xml");
		
		//获取工厂中的IUseDao对象
		IUserDao userDao= (IUserDao)factory.getBean("userDao");
		IUserDao userDao2= (IUserDao)factory.getBean("userDao");
		
		System.out.println(userDao==userDao2);
		System.out.println(userDao.equals(userDao2));
		
		
		//掉用方法
		userDao.selectUser();
		userDao2.selectUser();
		
		
		//销毁对象
		factory.close();
	}

}

如果不是单例模式,它使用对象时就要new一次,所以他们的是不会相等的,如果是单例模式则反之。

web中的作用域:applicatinContext.xml文件跟之前的一样,只是scope的值不一样

必备环境,一个jsp页面或者HTML页面里面一个a标签路径为servlet的路径、一个servlet里面调用我们的IOC容器(applicationContext.xml)

通过WebApplicationContextUtils.getRequiredWebApplicationContext (request.getServletContext());获取容器需要在web.xml里面配置监听,你可以尝试不配之前让它出bug,然后我们在里面找到报错信息,根据报错信息来解决问题:

UserServlet:

package com.dayo2_IOCWeb.Servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.context.support.XmlWebApplicationContext;

import spring.IUserDao;
import spring.UserService;

@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取IOC容器
		WebApplicationContext  factory=WebApplicationContextUtils.getRequiredWebApplicationContext	(request.getServletContext());
		
		//调用UserDao
		IUserDao userDao= (IUserDao)factory.getBean("userDao");
		IUserDao userDao2= (IUserDao)factory.getBean("userDao");
		
		System.out.println(userDao==userDao2);
		System.out.println(userDao.equals(userDao2));
		
		
	}
}

不配置监听器之前:
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
大概就是整个错误,说找不到WebApplicationContext 你使用的这个东西,原因是你没有注册ContextLoaderListener 。

这个时候我们就需要再web.xml中注册ContextLoaderListener ,

如何注册?
请看代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>day02_IOCWeb</display-name>
  <!-- Spring配置文件路径 -->
  <context-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:applicationContext.xml</param-value>
  	
  </context-param>
  
  
  
 <!-- Spring监听器 -->
 	<listener>
 			<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 			
 	</listener> 
 	<listener>
 		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
 	
 	</listener> 
  
  	
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

这个里面的路径哪里来的?你可以把ContextLoaderListener 复制到servlet里面然后按住Ctrl点它就会进去到它的源码里面,当然,这里没有导入源码,不影响使用
在这里插入图片描述
然后配置它的路径:如代码,这里的
contextConfigLocation
classpath:applicationContext.xml

name不能乱用,不然它找不到:这里用的的是它父类的位置参数名:那么怎么找?
找到web导的包,随后根据父类的路径找到父类。
在这里插入图片描述
在这里插入图片描述
vale是什么?就是你的ApplicationContext.xml文件了,主意路径的书写,看你自己放在哪了,我放的是类路径下方,
在这里插入图片描述
如果你放在了WEB_INF里面,那么就是WEB_INF/ApplicationContext.xml了。

配置完成之后,再次测试,你又发现又有bug了,这次我们来看看它说啥?
In this case, use RequestContextListener or RequestContextFilter to expose the current request.

跟之前的一样,需要引入RequestContextListener 来解决。我就不说怎么找了,看上面。

随后就ok了,你可以在servlet中使用
request.getRequestDispatcher(“路径”).forward(request, response);(站内跳转)
response.sendRedirect(“路径”);(站外跳转)
进行测试,然后换一下scope的值,进行测试。

ok今天就到这个,学了十分钟,写了一小时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值