Spring细节知识点总结

1.IOC和DI的理解
DI依赖注入就是赋值    
注入就是依赖谁注入谁   换句话说依赖谁就为谁赋值

IOC(Inversion of Control):反转控制   
就是把原来我们程序员对对象的控制权交给了程序本身,让程序自己进行管理,程序本身由spring来控制

ioc可以理解为一种思想   DI理解为一种具体的实现方式

------------------------------------------------

2.bean的作用域
spring  bean  scope=singtle 单例模式 需要对象要有空参构造方法,且spring的单例对象不是线程安全的,
scope=prototype 多例是安全的,因为每次都会重新创建一个对象,不同线程不会共享同一个对象。

注:线程安全这个问题,要从单例与原型Bean分别进行说明。

原型Bean
对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。

单例Bean
对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。

如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,
那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,
这些Bean大多是无状态的,只关注于方法本身。

有状态对象(Stateful Bean) :就是有实例变量的对象,可以保存数据,是非线程安全的。每个用户
有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡
(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

无状态对象(Stateless Bean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。
bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定
结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户
的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些
变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

对于有状态的bean,Spring官方提供的bean,一般提供了通过ThreadLocal去解决线程安全的方法,比如
RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等。

使用ThreadLocal的好处
使得多线程场景下,多个线程对这个单例Bean的成员变量并不存在资源的竞争,因为ThreadLocal为每个线程
保存线程私有的数据。这是一种以空间换时间的方式。

当然也可以通过加锁的方法来解决线程安全,这种以时间换空间的场景在高并发场景下显然是不实际的。

spring容器中管理的有单例的时候  在容器初始化的时候就会创建 ,会调用对象的空参构造 , 多例不会调用,
也不会在容器初始化的时候创建对象,在使用的时候才会创建。
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数; 
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。 

单例创建原理:利用反射
 	 Class clazz =  Class.forName(“全类名”);
     Object obj= clazz.newInstance();

 	 newInstance():调用此方法,创建对应的运行时类的对象。内部调用了运行时类的空参的构造器。

        要想此方法正常的创建运行时类的对象,要求:
        1.运行时类必须提供空参的构造器
        2.空参的构造器的访问权限得够。通常,设置为public。


        在javabean中要求提供一个public的空参构造器。原因:
        1.便于通过反射,创建运行时类的对象
        2.便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器


-----------------------------------------------------------
3.spring注解的组件扫描
spring注解的组件扫描 :就是扫描dao  service  controller包

这样spring容器就不需要配置bean  id=" "  class="
他会自动扫描对应包里的所有类

spring容器初始化的时候  加载配置文件 可以通过上下文对象获取spring管理的对象
ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
UserController us=ac.getBean("userController",UserController.class);

spring通过注解方式管理的bean对象  默认的bean  id是类首字母小写加后面部分

--------------------------------------------

4.spring-aop术语

1.横切关注点,就是从每个方法中抽取出来的同一类非业务核心代码,比如日志的抽取,但是
把这些代码放到切面里又叫通知

2.切面:封装横切关注点的类,每个关注点体现为一个通知方法

3.通知:切面必须要完成的各个具体工作

4.目标对象:对通知的对象,就是抽取出来的代码要作用到的对象

5.代理:向目标对象应用通知之后创建的代理对象

6.连接点:就是功能执行过程中的各个位置,比如方法前  后  异常 以及finally里  这4个位置

7.切入点:我们要把切面作用到当前目标对象功能的一种方式,就是使用切面的一个条件,就是什么情况
下才能把切面作用到目标对象中


切入点表达式最好要写的精确,因为这样才能快速的根据切入点表达式快速找到连接点,将切面作用于连接点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值