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.切入点:我们要把切面作用到当前目标对象功能的一种方式,就是使用切面的一个条件,就是什么情况
下才能把切面作用到目标对象中
切入点表达式最好要写的精确,因为这样才能快速的根据切入点表达式快速找到连接点,将切面作用于连接点