美文网首页Java 杂谈Java进阶之路
Spring Aware与静态方法的使用自动注入

Spring Aware与静态方法的使用自动注入

作者: elijah777 | 来源:发表于2019-05-25 02:07 被阅读3次

Spring Aware

1、介绍

Spring的依赖注入的最大亮点就是你所以的Bean对Spring容器的存在是没有意思的。即你可以将你的容器换成别 的容器

在项目中,只有容器存在时,才可以调用Spring所提供的资源。

@Autowired 用在构造函数上
我们知道@Autowired 注释,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,此种方式就是在构造函数上使用@Autowired。

最后会介绍在静态方法中注入

2、简单的示例

程序清单

  1. 一个text文件
  2. 演示的bean,即AwareService
  3. 配置类 AwareConfig 类似于applicationContext.xml
  4. 程序入口,AwareMain
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * @description: 依赖注入的使用
 *      继承之后重新
 *      BeanNameAware 获取到容器中Bean的名称
 *      ResourceLoaderAware 获得记载器
 *      
 * @author: Shenshuaihu
 * @version: 1.0
 * @data: 2019-05-25 00:24
 */
@Service
public class AwareService implements BeanNameAware, ResourceLoaderAware {

    private String beanName;
    private ResourceLoader loader;

    @Override
    public void setBeanName(String name) {
        this.beanName = name;
    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.loader = resourceLoader;
    }

    public void outputResult() {
        System.out.println("Bean的名称为:" + beanName);
        Resource resource = loader.getResource("classpath:com/ch3/aware/test.txt");

        try {
            System.out.println("加载文件内容为:" + IOUtils.toString(resource.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * @description:  配置类
 * @author: Shenshuaihu
 * @version: 1.0
 * @data: 2019-05-25 00:35
 */
@Configuration
@ComponentScan("com.ch3.aware")
public class AwareConfig {
}
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @description: 运行
 * @author: Shenshuaihu
 * @version: 1.0
 * @data: 2019-05-25 00:36
 */
public class AwareMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(AwareConfig.class);
        AwareService awareService = context.getBean(AwareService.class);
        awareService.outputResult();
        context.close();
    }
}

3、深入理解

在项目中正常情况是直接自动注入的

@Service
public class SpitterUserDetailService implements UserDetailService {

    @Autowired
    public  SpittleRepository spittleRepository;
    
}

或者是

@Service
public class SpitterUserDetailService implements UserDetailService {

    public  SpittleRepository spittleRepository;

    @Autowired
    public void setSpittleRepository(SpittleRepository spittleRepository) {
        this.spittleRepository = spittleRepository;
    }

如果出现静态的就尴尬了

4、拓展理解

在项目上,可能是在Utils类中,静态方法需要调用Service 会使用到自动注入,或者静态方向需要访问数据,咱需要静态方法时的注入

@Component
public class HttpUtil {
    private static RedisTemplate redisTemplate;
    /**
     * 注入bean,可以使用静态方法
     * @param redisTemplate redis
     */
    @Autowired
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        HttpUtil.redisTemplate = redisTemplate;
    }
    
     public static String postRest(String sysUrl, String tokenParam) {
        String tokenKey = REDIS_KEY_TOKEN + sysUrl;
        /**
         * 每次请求都获取,改变成从redis中取 获取token,
         * 如果redis不存在需要重新获取,如果执行失败了,需要重新获取
         */
        String token = (String) redisTemplate.opsForValue().get(tokenKey);
        return token;
        }
  }

例子2,参考于其他:

2. 使用 @PostConstruct 注解
@PostConstruct是Java EE 5引入来影响Servlet生命周期的注解,被用来修饰非静态的void()方法,@PostConstruct在构造函数之后执行,init()方法之前执行。

代码:

@Component
public class PropConfig {
    @Autowired
   private SysConfigService sysConfigService;

   private static PropConfig propConfig;

    @PostConstruct
    public void init() {
        propConfig = this;
        propConfig.sysConfigService = this.sysConfigService;
    }

    public static   Map<String, String> LoadPoperties(String filePath) 
    throws ConfigException {
        List<SysConfig> configs = propConfig.sysConfigService.getSysConfigData();
          return poperties;
        }
}

参考文章
https://blog.51cto.com/zhengjiang/2141118

        2019/05/25凌晨于成都

相关文章

网友评论

    本文标题:Spring Aware与静态方法的使用自动注入

    本文链接:https://www.haomeiwen.com/subject/ulgozqtx.html