• spring获取ApplicationContext对象的方法——ApplicationContextAware


    一、 引言

      工作之余,在看一下当年学的spring时,感觉我们以前都是通过get~ set~方法去取spring的Ioc取bean,今天就想能不能换种模型呢?因为我们在整合s2sh时,也许有那么一天就不用再遵循model-dao-service-action了,所以还是可以通过其他方法获取applicationContext,然后再获取相应的bean的。

    二、 方法

      如何获取ApplicationContext对象呢?

      1. 可通过ClassPathXmlApplicationContext, FileSystemClassPathXmlApplicationContext, FileSystemXmlApplicationContext 去加载applicationContext.xml等配置文件去加载;

      2. 可通过实现ApplicationContextAware接口获取;

      3. 也许还有其他.....

      区别:

      笔者暂且只比较一下1与2吧。第一种会产生一种新的一个ApplicationContext对象,而这个对象与由web启动时生成的ApplicationContext对象是持有一样的资源,而第2种则是取当前运行环境下的ApplicationContext的对象。

    三、 示例

      1. SpringHelper

    package com.swyma.spring.core;
    
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    public class SpringHelper implements ApplicationContextAware{
    
        public static SpringHelper springHelper = new SpringHelper();
        
        private static ApplicationContext applicationContext;
        
        public final static SpringHelper getInstance() {
            return springHelper;
        }
        
        private SpringHelper() {
            super();
        }
        
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        public ApplicationContext getApplicationContext() {
            return applicationContext;
        }
    }

      2. ISpringContext

    package com.swyma.spring.core;
    
    import org.springframework.context.ApplicationContext;
    
    public interface ISpringContext {
    
        ApplicationContext getContext();
        
        <T> T lookup(String type);
        
        <T> T lookup(Class cls);
        
        boolean isSingleton(Class cls);
    
    }

      3. AbstractSpringContext

    package com.swyma.spring.core;
    
    import org.springframework.context.ApplicationContext;
    
    
    public abstract class SpringContext implements ISpringContext  {
    
        @Override
        public ApplicationContext getContext() {
            return SpringHelper.getInstance().getApplicationContext();
        }
    }

      4. basicSpringContext

    package com.swyma.spring.service;
    
    import com.swyma.spring.core.SpringContext;
    import com.swyma.spring.core.StringUtils;
    
    public class BasicSpringContext extends SpringContext{
    
        static BasicSpringContext springContext = new BasicSpringContext();
        
        public static BasicSpringContext getSpringContext() {
            return springContext;
        }
    
        public static void setSpringContext(BasicSpringContext springContext) {
            BasicSpringContext.springContext = springContext;
        }
    
        public <T> T lookup(String type) {
            if(getContext().containsBean(type)) {
                return (T) getContext().getBean(type);
            }
            return null;
        }
    
        public <T> T lookup(Class cls) {
            String type = cls.getSimpleName();
            return lookup(StringUtils.toLowerInitial(type, true));
        }
        
        public boolean isSingleton(Class cls) {
            return getContext().isSingleton(StringUtils.toLowerInitial(cls.getSimpleName(),true));
        }
    
    }

      5. applicationContext.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:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-2.5.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
    
        <context:annotation-config />
        <aop:aspectj-autoproxy />
        <context:component-scan base-package="com.swyma.spring"/>
        <bean id="springhelper" class="com.swyma.spring.core.SpringHelper" lazy-init="false"/>
    </beans>

      6. 测试用例

    package com.swyma.spring.test;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.swyma.spring.core.ISpringContext;
    import com.swyma.spring.entity.User;
    import com.swyma.spring.service.BasicSpringContext;
    import com.swyma.spring.service.LoginService;
    import com.swyma.spring.service.RegisterService;
    import com.swyma.spring.service.ServiceFacade;
    import com.swyma.spring.service.UserService;
    
    
    /**
     * juint test
     * @author yemaoan
     *
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "classpath:applicationContext.xml" })
    public class TestSpringEnv {
    
        @Test
        public void testLookup() {
            ISpringContext context = BasicSpringContext.getSpringContext();
            LoginService loginService = context.lookup(LoginService.class);
            loginService.handle();
        }
        
        @Test
        public void testAspect() {
            ISpringContext context = new BasicSpringContext();
            UserService userService = context.lookup(UserService.class);
            RegisterService registerService = context.lookup(RegisterService.class);
            userService.create(new User());
            registerService.create();
        }
        
        @Test
        public void testFacade() {
            ServiceFacade serviceFacade = new ServiceFacade();
            LoginService loginService = serviceFacade.getLoginService();
            loginService.handle();
        }
        
    }

      6. 其他的各种service就不再罗列了......

    四、 总结

      1. 利用这种取ApplicationContext会不会造成混乱呢,也即是资源不同步呢?其实笔者认为,我们也只是取到这个ApplicationContext对象,利用这个对象来获取我们所需要的Bean资源,并未对该对象进行修改更新操作,所以觉得这个在应用过程中还是安全的。

  • 相关阅读:
    Golang手动分页,按等份拆分数据
    GORM无法映射到结构体上
    VSCODE GOLANG运行多个服务
    解决,MAVEN
    Properties配置文件常见错误写法以及转义字符说明
    Pentaho Data Integration (PDI/Kettle)与Java版本支持关系
    MYSQL之读写分离搭建方案
    Windows下创建软件快速启动命令
    Sonar的一些使用总结
    使用SVG Path绘图
  • 原文地址:https://www.cnblogs.com/maoan/p/3446224.html
Copyright © 2020-2023  润新知