美文网首页
后端小问题汇总

后端小问题汇总

作者: 山与海Lucky7 | 来源:发表于2021-05-13 10:21 被阅读0次

    Java Md5_16位/32位加密方式

    private static String getMd5_16(String string) {
        // TODO Auto-generated method stub
        return encrypt32(string).substring(8, 24);
    }
    
    public static String encrypt32(String encryptStr) {
        MessageDigest md5;
        try {
            md5 = MessageDigest.getInstance("MD5");
            byte[] md5Bytes = md5.digest(encryptStr.getBytes());
            StringBuffer hexValue = new StringBuffer();
            for (int i = 0; i < md5Bytes.length; i++) {
                int val = ((int) md5Bytes[i]) & 0xff;
                if (val < 16)
                    hexValue.append("0");
                hexValue.append(Integer.toHexString(val));
            }
            encryptStr = hexValue.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return encryptStr;
    }
    

    调用方法

    String pwd = getMd5_16("test"+"test"+sf.format(new Date()));//账户&密码&当天日期
    

    @PostConstruct 注解失效

    @PostConstruct   //指定该方法在对象被创建后马上调用 相当于配置文件中的init-method属性
    public void init(){
       System.out.println("开始执行初始化...");
       ... ....
    }
    

    分析:

    • ClassPathXmlApplicationContext方式装载bean, 则@PostConstruct可以生效;

    • BeanFactory方式装载bean, @PostConstruct初始化方式并没有生效。

    参考/引用/转载自:

    关于Spring中 @PostConstruct 没有生效的问题
    https://blog.csdn.net/u012989337/article/details/81332146

    @PostConstruct、构造函数、@AutoWired的执行顺序

    Constructor >> @Autowired >> @PostConstruct

    参考/引用/转载自:

    @PostConstruct、构造函数和@AutoWired的执行顺序
    https://blog.csdn.net/YSC1123/article/details/84941075

    @PostConstruct详解
    https://blog.csdn.net/sunayn/article/details/92840439

    static静态变量使用@Value注入方式

    @Component
    public class MyConfig {
     
        private static String env;
     
        public static String getEnv() {
            return env;
        }
     
        @Value("${env}")
        public void setEnv(String env) {  //一定是在非静态方法setEnv前使用@Value注解
            MyConfig.env = env;
        }
    }
    

    参考/引用/转载自:

    static静态变量使用@Value注入方式
    https://blog.csdn.net/dadaoke/article/details/79460677

    反射调用方法时获取bean失败

    调用失败的写法:

    Service service = (Service)Class.forName("com.service.TestService").newInstance();// 加载类,并实例化对象
    Method objMethod = service.getClass().getDeclaredMethod("test");//获取方法
    objMethod.invoke(service);//执行方法
    

    解决方案:

    通过applicationContext.getBean(“className”)来获取bean。

    @Component
    public class SpringContextUtil implements ApplicationContextAware {
    
        private static ApplicationContext applicationContext; // Spring应用上下文环境
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            if(SpringContextUtil.applicationContext == null){
                SpringContextUtil.applicationContext  = applicationContext;
            }
        }
    
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
    
        public static Object getBean(String name) throws BeansException {
            return applicationContext.getBean(name);
        }
    
        public static Object getBean(String name, Class requiredType)
                throws BeansException {
            return applicationContext.getBean(name, requiredType);
        }
    
        // 通过class获取Bean.
        public static <T> T getBean(Class<T> clazz) {
            return getApplicationContext().getBean(clazz);
        }
    }
    
    Service  service = (Service) SpringContextUtil.getBean(Class.forName("com.service.TestService"));
    Method objMethod = service.getClass().getDeclaredMethod("test");//获取方法
    objMethod.invoke(service);//执行方法
    

    参考/引用/转载自:

    java 反射调用方法时获取bean失败解决方案
    https://blog.csdn.net/Marlene_me/article/details/107663050

    JAVA中实现让程序等待一段时间的方法

    方法一:通过线程的sleep方法。

     Thread.currentThread().sleep(1000);
    

    在需要程序等待的地方加入这个语句,实现让程序等待,这里的参数1000是以毫秒为单位,即这语句可以让程序等待1秒。

    方法二:TimeUnit类里的sleep方法。

    TimeUnit.DAYS.sleep(1);//天
    TimeUnit.HOURS.sleep(1);//小时
    TimeUnit.MINUTES.sleep(1);//分
    TimeUnit.SECONDS.sleep(1);//秒
    TimeUnit.MILLISECONDS.sleep(1000);//毫秒
    TimeUnit.MICROSECONDS.sleep(1000);//微妙
    TimeUnit.NANOSECONDS.sleep(1000);//纳秒
    

    TimeUnit类提供的方法,其实底层调用的也是Thread类的sleep方法,让程序进行等待。只不过他在上层根据时间单位进行了封装,如上图,共有7种可以选择,可以方便的选择自己需要的时间单位进行使用。

    参考/引用/转载自:

    JAVA中实现让程序等待一段时间的方法
    https://blog.csdn.net/zhizhengguan/article/details/101070155

    复制目录及其子目录、文件,到另外一个目录

    /**
     * 复制一个目录及其子目录、文件到另外一个目录
     *
     * @param src
     * @param dest
     * @throws IOException
     */
    private void copyFolder(File src, File dest) throws IOException {
        if (src.isDirectory()) {
            if (!dest.exists()) {
                dest.mkdir();
            }
            String files[] = src.list();
            for (String file : files) {
                File srcFile = new File(src, file);
                File destFile = new File(dest, file);
                // 递归复制
                copyFolder(srcFile, destFile);
            }
        } else {
            InputStream in = new FileInputStream(src);
            OutputStream out = new FileOutputStream(dest);
    
            byte[] buffer = new byte[1024];
    
            int length;
    
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
            in.close();
            out.close();
        }
    }
    

    PS: apache commons-io包,FileUtils有相关的方法,IOUtils一般是拷贝文件。

    删除目录结构 FileUtils.deleteDirectory(dest);
    递归复制目录及文件 FileUtils.copyDirectory(src, dest);

    java拷贝目录及其子目录、文件,到另外一个目录
    https://blog.csdn.net/hardwin/article/details/7914610

    相关文章

      网友评论

          本文标题:后端小问题汇总

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