网站用户体验分析怎么做模板app
2026/4/24 3:59:19 网站建设 项目流程
网站用户体验分析怎么做,模板app,百度文库官网入口,宣传片拍摄预算表目录 一、BeanFactory与ApplicationContext的区别 二、通过BeanFactory获取 三、通过BeanFactoryAware获取 四、启动获取ApplicationContext 五、通过继承ApplicationObjectSupport 六、通过继承WebApplicationObjectSupport 七、通过WebApplicationContextUtils 八、通…目录一、BeanFactory与ApplicationContext的区别二、通过BeanFactory获取三、通过BeanFactoryAware获取四、启动获取ApplicationContext五、通过继承ApplicationObjectSupport六、通过继承WebApplicationObjectSupport七、通过WebApplicationContextUtils八、通过ApplicationContextAware九、通过ContextLoader十、通过BeanFactoryPostProcessor十一、通过工具类获取一、BeanFactory与ApplicationContext的区别BeanFactory是Spring框架的基础设施面向Spring本身。ApplicationContext则面向使用Spring框架的开发者几乎所有的应用场景都可以直接使用ApplicationContext而非底层的BeanFactory。ApplicationContext的初始化和BeanFactory有一个重大的区别BeanFactory在初始化容器时并未实例化Bean直到第一次访问某个Bean时才实例目标Bean。这样我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入BeanFacotry加载后直至第一次使用调用getBean方法才会抛出异常。而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean相对应的ApplicationContext的初始化时间会比BeanFactory长一些。二、通过BeanFactory获取通过BeanFactory来获取Bean。基于xml配置文件不推荐使用BeanFactory beanFactory new XmlBeanFactory(new ClassPathResource(applicationContext.xml)); User user (User) beanFactory.getBean(user);三、通过BeanFactoryAware获取获取BeanFactory实例最简单的方式就是实现BeanFactoryAware接口。BeanFactoryAware接口源码public interface BeanFactoryAware extends Aware { ?/** ??* 初始化回调方法Spring会自动将BeanFactory注入进去接收之后即可使用BeanFactory ??*/ ?void setBeanFactory(BeanFactory beanFactory) throws BeansException; }BeanFactoryAware属于org.springframework.beans.factory.Aware根标记接口使用setter注入来在应用程序上下文启动期间获取对象。Aware接口是回调监听器和观察者设计模式的混合它表示Bean有资格通过回调方式被Spring容器通知。示例如下Component public class BeanFactoryHelper implements BeanFactoryAware { ?private static BeanFactory beanFactory; ?/** ??* 重写 BeanFactoryAware 接口的方法 ??* param beanFactory 参数赋值给本地属性之后即可使用 BeanFactory ??* throws BeansException BeansException ??*/ ?Override ?public void setBeanFactory(BeanFactory beanFactory) throws BeansException { ??BeanFactoryHelper.beanFactory beanFactory; ?} ?/** ??* 根据名称获取容器中的对象实例 ??* param beanName 注入的实例必须已经存在容器中否则抛异常NoSuchBeanDefinitionException ??* return Object ??*/ ?public static Object getBean(String beanName) { ??return beanFactory.getBean(beanName); ?} ?/** ??* 根据 class 获取容器中的对象实例 ??* param requiredType 被注入的必须已经存在容器中否则抛异常NoSuchBeanDefinitionException ??* param T Class ??* return 对象 ??*/ ?public static T T getBean(ClassT requiredType) { ??return beanFactory.getBean(requiredType); ?} ?/** ??* 判断 spring 容器中是否包含指定名称的对象 ??* param beanName bean名称 ??* return 是否存在 ??*/ ?public static boolean containsBean(String beanName) { ??return beanFactory.containsBean(beanName); ?} ?//其它需求皆可参考 BeanFactory 接口和它的实现类 }上述基于BeanFactoryAware的特性获得了BeanFactory然后再通过BeanFactory来获得指定的Bean。四、启动获取ApplicationContext在项目启动时先获取ApplicationContext对象然后将其存储在一个地方以便后续用到时进行使用。这里提供两种场景的获取1.基于xml配置bean的形式适用于比较古老的项目已经很少使用了2.基于SpringBoot启动时获取ApplicationContext对象基于xml的形式实现// 其中applicationContext.xml 为配置容器的xml不过现在一般很少使用了 ApplicationContext ac new FileSystemXmlApplicationContext(applicationContext.xml);基于SpringBoot启动实现SpringBootApplication public class ExampleApplication { ????public static void main(String[] args) { ????????// 启动时保存上下文并保存为静态 ????????ConfigurableApplicationContext ac SpringApplication.run(ExampleApplication.class, args); ????????SpringContextUtil.setApplicationContext(ac); ????} }对应的SpringContextUtil类如下public class SpringContextUtil1 { ????private static ApplicationContext ac; ????public static T? T getBean(String beanName, ClassT clazz) { ????????T bean ac.getBean(beanName, clazz); ????????return bean; ????} ????public static void setApplicationContext(ApplicationContext applicationContext){ ????????ac applicationContext; ????} }五、通过继承ApplicationObjectSupport此种方式依旧是先获得ApplicationContext容器然后从中获取Bean对象只不过是基于继承ApplicationObjectSupport类实现的。具体实现代码SpringContextUtil类需要实例化。Component public class SpringContextUtil extends ApplicationObjectSupport { ?public T T getBean(ClassT clazz) { ??ApplicationContext ac getApplicationContext(); ??if(ac null){ ???return null; ??} ??return ac.getBean(clazz); ?} }ApplicationObjectSupport类图入下我们看到它实现了ApplicationContextAware接口在Spring容器初始化过程中回调方法setApplicationContext来完成ApplicationContext的赋值。六、通过继承WebApplicationObjectSupportWebApplicationObjectSupport是ApplicationObjectSupport的一个实现类提供了Web相关的支持。实现原理与ApplicationObjectSupport一样。具体实现代码如下Component public class SpringContextUtil extends WebApplicationObjectSupport { ?public T T getBean(ClassT clazz) { ??ApplicationContext ac getApplicationContext(); ??if(ac null) ???return null; ??} ??return ac.getBean(clazz); ?} }通过类图我们可以看到它是ApplicationObjectSupport的实现子类此方式除了继承对象不同外没有其他区别都是基于getApplicationContext方法来获取。七、通过WebApplicationContextUtilsSpring提供了工具类WebApplicationContextUtils通过该类可获取WebApplicationContext对象。具体实现代码如下public class SpringContextUtil2 { ?public static T T getBean(ServletContext request, String name, ClassT clazz){ ??WebApplicationContext webApplicationContext WebApplicationContextUtils.getRequiredWebApplicationContext(request); ??// 或者 ??WebApplicationContext webApplicationContext1 WebApplicationContextUtils.getWebApplicationContext(request); //??????? webApplicationContext1.getBean(name, clazz) ??T bean webApplicationContext.getBean(name, clazz); ??return bean; ?} }这个方法很常见于SpringMVC构建的Web项目中适用于Web项目的B/S结构。八、通过ApplicationContextAware通过实现ApplicationContextAware接口在Spring容器启动时将ApplicationContext注入进去从而获取ApplicationContext对象这种方法也是常见的获取Bean的一种方式推荐使用。具体实现代码如下Component public class SpringContextUtil3 implements ApplicationContextAware { ?private static ApplicationContext ac; ?Override ?public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ??ac applicationContext; ?} ?public static T T getBean(ClassT clazz) { ??T bean ac.getBean(clazz); ??return bean; ?} }九、通过ContextLoader使用ContextLoader提供的getCurrentWebApplicationContext方法也是常用的获取WebApplicationContext的一种方法。具体实现代码如下WebApplicationContext wac ContextLoader.getCurrentWebApplicationContext(); wac.getBean(beanID);该方法常见于SpringMVC实现的Web项目中。该方式是一种不依赖于Servlet不需要注入的方式。但是需要注意一点在服务器启动时和Spring容器初始化时不能通过该方法获取Spring容器。十、通过BeanFactoryPostProcessorSpring工具类方便在非Spring管理环境中获取Bean。Component public final class SpringUtils implements BeanFactoryPostProcessor{ ????/** Spring应用上下文环境 */ ????private static ConfigurableListableBeanFactory beanFactory; ????Override ????public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException{ ????????SpringUtilsS.beanFactory beanFactory; ????} ????/** ?????* 获取对象 ?????* ?????* param name ?????* return Object 一个以所给名字注册的bean的实例 ?????* throws BeansException ?????* ?????*/ ????SuppressWarnings(unchecked) ????public static T T getBean(String name) throws BeansException{ ????????return (T) beanFactory.getBean(name); ????} ????/** ?????* 获取类型为requiredType的对象 ?????* ?????* param clz ?????* return ?????* throws BeansException ?????* ?????*/ ????public static T T getBean(ClassT clz) throws BeansException{ ????????T result (T) beanFactory.getBean(clz); ????????return result; ????} ????/** ?????* 如果BeanFactory包含一个与所给名称匹配的bean定义则返回true ?????* ?????* param name ?????* return boolean ?????*/ ????public static boolean containsBean(String name){ ????????return beanFactory.containsBean(name); ????} ????/** ?????* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到将会抛出一个异常NoSuchBeanDefinitionException ?????* ?????* param name ?????* return boolean ?????* throws NoSuchBeanDefinitionException ?????* ?????*/ ????public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException{ ????????return beanFactory.isSingleton(name); ????} ????/** ?????* param name ?????* return Class 注册对象的类型 ?????* throws NoSuchBeanDefinitionException ?????* ?????*/ ????public static Class? getType(String name) throws NoSuchBeanDefinitionException{ ????????return beanFactory.getType(name); ????} ????/** ?????* 如果给定的bean名字在bean定义中有别名则返回这些别名 ?????* ?????* param name ?????* return ?????* throws NoSuchBeanDefinitionException ?????* ?????*/ ????public static String[] getAliases(String name) throws NoSuchBeanDefinitionException{ ????????return beanFactory.getAliases(name); ????} ????/** ?????* 获取aop代理对象 ?????* ?????* param invoker ?????* return ?????*/ ????SuppressWarnings(unchecked) ????public static T T getAopProxy(T invoker){ ????????return (T) AopContext.currentProxy(); ????} }其中ConfigurableListableBeanFactory接口也属于BeanFactory的子接口。十一、通过工具类获取RequestContextUtils.findWebApplicationContext(HttpServletRequest request)WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)controller中获取public String test(HttpServletRequest request,HttpServletRequest response) { WebApplicationContext wc RequestContextUtils.findWebApplicationContext(request); wc.getBean(beanName); WebApplicationContext wc2 WebApplicationContextUtils.getWebApplicationContext(request.getServletContext()); wc2.getBean(beanName); }在service中或者其他后端服务中获取HttpServletRequest request ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); WebApplicationContext wc RequestContextUtils.findWebApplicationContext(request); WebApplicationContext wc2 WebApplicationContextUtils.getWebApplicationContext(request.getServletContext()); wc.getBean(beanName); wc2.getBean(beanName);

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询