spring 获取bean的几种方法
-
实现BeanFactoryAware
public class ServiceLocator implements BeanFactoryAware { private static BeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { ServiceLocator.beanFactory = beanFactory; } /** * 根据提供的bean名称得到相应的服务类 * * @param servName * bean名称 */ public static Object getService(String servName) { return beanFactory.getBean(servName); } }
spring配置文件
<bean id="serviceLocator" class="com.taobao.appcenter.common.ServiceLocator" lazy-init="false"/>
-
实现ApplicationContextAware
public class SpringContextsUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; //Spring context @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextsUtil.applicationContext = applicationContext; } /** * @return ApplicationContext */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 获取对象 * @param name * @return Object 一个以所给名字注册的bean的实例 * @throws BeansException */ public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } }
spring xml配置文件
<bean id="springContext" class="com.taobao.appcenter.common.SpringContext" lazy-init="false"/>
-
通过servlet 或listener设置spring的ApplicationContext,以便后来引用,这个是针对web 工程的
public class SpringContext { private static ApplicationContext applicationContext; // Spring应用上下文环境 public static void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContext.applicationContext = applicationContext; } /** * @return ApplicationContext */ public static ApplicationContext getApplicationContext() { return applicationContext; } public static Object getBean(String name) throws BeansException { return applicationContext.getBean(name); } }
上面的SpingContext谁没实现任何接口的,不是回调的方式。而是在listener或者servlet中set进来
public class SpringContextLoaderListener extends ContextLoaderListener { public void contextInitialized(ServletContextEvent event){ super.contextInitialized(event); SpringContext.setApplicationContext(WebApplicationContextUtils.getWebApplicationContext(event.getServletContext())); } }
替换web.xml文件的listener为上面的文件
<listener> <listener-class>com.taobao.appcenter.common.SpringContextLoaderListener</listener-class> </listener>
servlet的代码如下
public class SpringContextLoaderServlet extends ContextLoaderServlet { private ContextLoader contextLoader; public void init() throws ServletException { this.contextLoader = createContextLoader(); SpringContext.setApplicationContext(this.contextLoader.initWebApplicationContext(getServletContext())); } }
然后配置web.xml中的servlt和mapping即可。
-
调用
由于使用的都是静态函数,使用getBean(Stirng name)或者getService(String serviceName)就可以获得xml配置的业务自己bean。