如何取得Spring管理的bean (请用第3种方法):
1、servlet方式加载时,
【web.xml】
- <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*:/springMVC.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
spring容器放在ServletContext中的key是org.springframework.web.servlet.FrameworkServlet.CONTEXT.springMVC
注意后面的springMVC,是你的servlet-name配置的值,注意适时修改。
- ServletContextsc=略
- WebApplicationContextattr=(WebApplicationContext)sc.getAttribute("org.springframework.web.servlet.FrameworkServlet.CONTEXT.springMVC");
2、listener方式加载时:
【web.xml】
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
【jsp/servlet】可以这样取得
- ServletContextcontext=getServletContext();
- WebApplicationContextapplicationContext=WebApplicationContextUtils.getWebApplicationContext(context);
3、通用的方法来了,神器啊,前的 1、2两种方法并不通用,可以抛弃了。
在配置文件中加入:
- <!--用于持有ApplicationContext,可以使用SpringContextHolder.getBean('xxxx')的静态方法得到springbean对象-->
- <beanclass="com.xxxxx.SpringContextHolder"lazy-init="false"/>
- importorg.springframework.context.ApplicationContext;
- importorg.springframework.context.ApplicationContextAware;
- /**
- *以静态变量保存SpringApplicationContext,可在任何代码任何地方任何时候中取出ApplicaitonContext.
- *
- */
- publicclassSpringContextHolderimplementsApplicationContextAware{
- privatestaticApplicationContextapplicationContext;
- /**
- *实现ApplicationContextAware接口的context注入函数,将其存入静态变量.
- */
- publicvoidsetApplicationContext(ApplicationContextapplicationContext){
- SpringContextHolder.applicationContext=applicationContext;//NOSONAR
- }
- /**
- *取得存储在静态变量中的ApplicationContext.
- */
- publicstaticApplicationContextgetApplicationContext(){
- checkApplicationContext();
- returnapplicationContext;
- }
- /**
- *从静态变量ApplicationContext中取得Bean,自动转型为所赋值对象的类型.
- */
- @SuppressWarnings("unchecked")
- publicstatic<T>TgetBean(Stringname){
- checkApplicationContext();
- return(T)applicationContext.getBean(name);
- }
- /**
- *从静态变量ApplicationContext中取得Bean,自动转型为所赋值对象的类型.
- */
- @SuppressWarnings("unchecked")
- publicstatic<T>TgetBean(Class<T>clazz){
- checkApplicationContext();
- return(T)applicationContext.getBeansOfType(clazz);
- }
- /**
- *清除applicationContext静态变量.
- */
- publicstaticvoidcleanApplicationContext(){
- applicationContext=null;
- }
- privatestaticvoidcheckApplicationContext(){
- if(applicationContext==null){
- thrownewIllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");
- }
- }
- }