spring獲取ApplicationContext對象的方法——ApplicationContextAware

1、 引言

  工做之餘,在看一下當年學的spring時,感受咱們之前都是經過get~ set~方法去取spring的Ioc取bean,今天就想能不能換種模型呢?由於咱們在整合s2sh時,也許有那麼一天就不用再遵循model-dao-service-action了,因此仍是能夠經過其餘方法獲取applicationContext,而後再獲取相應的bean的。web

2、 方法

  如何獲取ApplicationContext對象呢?spring

  1. 可經過ClassPathXmlApplicationContext, FileSystemClassPathXmlApplicationContext, FileSystemXmlApplicationContext 去加載applicationContext.xml等配置文件去加載;安全

  2. 可經過實現ApplicationContextAware接口獲取;app

  3. 也許還有其餘.....ide

  區別:測試

  筆者暫且只比較一下1與2吧。第一種會產生一種新的一個ApplicationContext對象,而這個對象與由web啓動時生成的ApplicationContext對象是持有同樣的資源,而第2種則是取當前運行環境下的ApplicationContext的對象。ui

3、 示例

  1. SpringHelperthis

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. ISpringContextspa

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. AbstractSpringContextcode

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就再也不羅列了......

4、 總結

  1. 利用這種取ApplicationContext會不會形成混亂呢,也便是資源不一樣步呢?其實筆者認爲,咱們也只是取到這個ApplicationContext對象,利用這個對象來獲取咱們所須要的Bean資源,並未對該對象進行修改更新操做,因此以爲這個在應用過程當中仍是安全的。

相關文章
相關標籤/搜索