项目开发遇到的坑(记录)

操作系统把文件上传临时文件给删了,,报The temporary upload location ***is not valid 问题

原因就是:操作系统会定时的对temp这个文件夹下的临时文件进行清理,解决办法就是把项目的临时文件目录改了,不用操作系统默认的临时文件夹目录
在这里插入图片描述

解决办法:

注入对象
@Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setLocation("d:/tmp");
        return factory.createMultipartConfig();
    }

mybatis-generator逆向工程生成的mapper接口文件springboot 扫描不到 报错org.springframework.beans.factory.NoSuchBeanDefinitionException

原因:mybatis-generator生成的mapper并没有@mapper
扫描mapper接口的几种方式
因为扫描不到自动生成的mapper就无法注入到service

方案一.@Mapper
如果Mapper文件所在的包和你的配置mapper的项目的pom定义的groupid相同的话.

因为我的mapper是一个模块,portal一个模块.

mapper在com.haitian.mapper下

portal的groupid是com.haitian,这样可以直接扫描到.

但是这样有两个需要考虑的地方:

1.mybatis-generator生成的mapper并没有@mapper

配置文件不行,好像插件可以

还得折腾一会

2.如果第一个折腾出来了,默认会扫描com.haitian下的所有包来找@Mapper

虽然对运行效率不会有什么影响,启动就会变慢啊,浪费时间.

所以不推荐

方案二.
mybatis.mapper-locations=com.haitian.mapper/*.xml

不管用,有人说properties管用,我yml和propertis都试了,都不管用

方法三.加载xml文件

@SpringBootApplication
@ImportResource(locations = “classpath:spring-dao.xml”)
public class PortalApplication {

public static void main(String[] args) {
SpringApplication.run(PortalApplication.class, args);
}
}

可行是可行,不符合spring boot的开发理念,不美丽.

方案四:
@MapperScan(“com.haitian.mapper”)

一行搞定.

再在controlller类里面加入属性与静态属性衍生的@scope问题

controller类实际上也是一个类,但是之前都是没有增加过属性,都是只写方法体,给前端来访问,但是要是新加一些属性值可以接受前端传来的数据,比如说两个方法要共享一些数据,就可以利用这些属性来接受,但是这些属性是静态的还是普通的??普通的属性能不能在方法中共享??还是controller类本身就是一个静态类???这时就出现了一个注解@scope是一个写明spring框架里面的类的生命周期的注解,springmvc默认是单例模式的也就是controller方法是单例模式的,单例模式下可以共享普通属性和静态属性,多例模式是只共享静态变量的,
测试办法:
1.新建一个controller类:
2.分别加入:
@Scope(value=ConfigurableBeanFactory.SCOPE_PROTOTYPE)这个是说在每次注入的时候回自动创建一个新的bean实例

@Scope(value=ConfigurableBeanFactory.SCOPE_SINGLETON)单例模式,在整个应用中只能创建一个实例
3.新建一个普通属性,和一个静态属性,
4.方法体内打印这个属性值,前端每访问一次,就对这两个属性操作一下
5:看输出:


@Controller
@Scope(value= ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class TestScopeController {


    private int pt=0;
    private static int st=0;


    @RequestMapping("/testscoper")
    @ResponseBody
    public Object testscope(){
        pt++;
        st++;
        System.out.println("普通变量"+pt+"静态变量"+st);
        return "ok";

    }
}

输出:
普通变量1静态变量1
普通变量1静态变量2
普通变量1静态变量3
普通变量1静态变量4
普通变量1静态变量5
普通变量1静态变量6
普通变量1静态变量7
普通变量1静态变量8
普通变量1静态变量9
普通变量1静态变量10
普通变量1静态变量11
普通变量1静态变量12
普通变量1静态变量13
普通变量1静态变量14

结果可以看出:多例模式下,普通变量每一次访问的都不是同一个对象,静态就是共享的,普通变量每一次方法都会去新建一个;

如果把@scope改为单例模式
看结果:
普通变量1静态变量1
普通变量2静态变量2
普通变量3静态变量3
普通变量4静态变量4
普通变量5静态变量5
普通变量6静态变量6
普通变量7静态变量7
普通变量和静态变量一样输出;这是因为每一次访问都是公用同一个对象;

尽量不要在controller里面去定义属性,如果在特殊情况需要定义属性的时候,那么就在类上面加上注解@Scope(“prototype”)改为多例的模式,以前struts是基于类的属性进行发的,定义属性可以整个类通用,所以默认是多例,不然多线程访问肯定是共用类里面的属性值的,肯定是不安全的,但是springmvc是基于方法的开发,都是用形参接收值,一个方法结束参数就销毁了,多线程访问都会有一块内存空间产生,里面的参数也是不会共用的,所有springmvc默认使用了单例,所以controller里面不适合在类里面定义属性,只要controller中不定义属性,那么单例完全是安全的。springmvc这样设计主要的原因也是为了提高程序的性能和以后程序的维护只针对业务的维护就行,要是struts的属性定义多了,都不知道哪个方法用了这个属性,对以后程序的维护还是很麻烦的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值