我这两天对spring原理,权限,ThreadLocal的使用因为有点不是太了解,就看了几篇文章看了点源码,在这里分享出来,以供自己和程序员朋友们以后使用,在这里我想让看到这篇文章的朋友,也多一些分享的习惯(简单说两句,平时什么不会都知道baidu,但是baidu的东西也是前辈们分享的,多一分分享)
开始:spring原理,是因为我这两天和别人聊天,他们的面试题有问spring原理的,我在想如果是我怎么回答
spring 最主要的是ioc和aop,ioc是控制反转,就是应用程序把创建对象实例的功能给了ioc容器,让ioc帮助创建,然后依赖注入。说到这就要说道ioc容器是怎么创建对象的了,在项目启动的初始化,根据配置文件,spring会先去查找@Requestmapping 和 @Controller 修饰的类,构造方法,属性,方法,别的也找(这是依赖查找),把这些都放到map中(这些都被变为信息类了),也就是container,然后依赖注入的时候,就去container中找,如果找到了,就创建,然后里面可能有@Autowired 修饰的全局变量,这个也是去查找,这是根据类型查找,说到这就要说道@Resource修饰的,这是javaee的,先根据名称查找,如果这不到在根据类型查找.
说到这,又想到依赖注入的方式:setter 构造器,接口,注解
我们平时基本上都是注解,这里面要一下的也就是setter,因为依赖注入的时候还要用setter把对象注入进来。
aop:就是spring拦截器,对前置通知,后置通知,环绕通知,原理就是动态代理,说到动态代理就要说一下和静态代理的区别:静态代理是根据一个之前就有的类去创建一个代理对象,就是在执行执行方法的前后可以进行一些操作,在项目中就是把业务代码和日志,权限过滤什么的分离出去。动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。?动态代理的时候在我们项目配置中一般都是cglib,他和jdk动态代理的区别是:jdk动态代理是实现接口的,如果没有接口就瞎了,而cglib动态代理是继承实现的,不管上一个有没有接口都ok。
然后说到这又想到 aop 自定义注解,声明一个注解类,声明一个处理类,取注解上的值进行处理,然后在声明在那些方法和方法前后执行。
好了,上面这些就是我如果面试的时候被问spring'原理的答案,应该差不多了,如果不对,大家给我留言。
好,2.权限
大家可能一想到权限就是想到用户 角色 权限的关系,其实在项目中很多是需要我们了解的,数据权限和字段权限
其中用户 角色 权限 都是多对多关系,然后还要有一个表去存别的信息,说到这我想到数据字典表,把他存在redis中,但是首先是每一次都取?还是在登陆的时候给一遍就行,我感觉还是每一次都取比较好,反正在redis中,说道redis了,又想到缓存击穿 缓存失效的问题:我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB
有一个比较巧妙的作法是,可以将这个不存在的key预先设定一个值。
比如,"key" , “&&”。
在返回这个&&值的时候,我们的应用就可以认为这是不存在的key,那我们的应用就可以决定是否继续等待继续访问,还是放弃掉这次操作。如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是&&,则可以认为这时候key有值了,从而避免了透传到数据库,从而把大量的类似请求挡在了缓存之中
二、缓存并发
有时候如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。
我现在的想法是对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。
这种情况和刚才说的预先设定值问题有些类似,只不过利用锁的方式,会造成部分请求等待。
缓存失效 : 其中的一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
差不多了,下一个 ThreadLocal 的使用:其实这是因为我偶尔的机会看到问如果在Controller中要共享变量,如果是一个boolean 或者对象大家公用基本算废了(可想而知),所以就有了这个ThreadLocal,其实也可以用同步代码块,但是不是有性能的消耗么,这个可以一个方法改了,别的也能看到,它是提供复制版本,避免参数传递的方便的对象访问方式?,
说到这我想到同步代码块和volidate的区别:同步代码块没什么可说的,volidate不能保证原子性,能保证可见性,同步:有互斥性和可见性。
互斥性:当多个线程需要访问同一资源时,要求在一个时间段内只能允许一个线程来操作共享资源,操作完毕后别的线程才能读取该资源,这叫线程的互斥
好了,大概就先这些,今天晚上还要和一个朋友的朋友讲讲java程序员的悲剧,哈,看了之后有什么感想可以留言

5万+

被折叠的 条评论
为什么被折叠?



