美文网首页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