冰冻三尺非一日之寒
Spring是轻量级和面向切面的容器框架
注入方式:
@Configruation+@Bean
配置类加方法
@Xml
节点使用 set 方式注入
节点使用 构造方法注入
<bean id="person" class="类文件名类路径">
<property name="bowl" ref="bowl"></property>
</bean>
<bean id="person" class="构造函数类路径">
<constructor-arg name="bowl" ref="bowl"></constructor-arg>
</bean>
工厂注入
public class BowlFactory {
public static final Bowl getBowl() {
return new Bowl();
}
}
<bean id="person" class="constxiong.interview.inject.Person">
<constructor-arg name="bowl" ref="bowl"></constructor-arg>
</bean>
常用的注解:
@Compont
@Restcontroller
@Autowried
@Bean
@Service
@Repository
@Qualifier 指定Bean名称
控制反转,即把我们自己创建的类的权利交由外部容器负责,负责类的生命周期。
前置通知@Beafore,后置通知@Afater,最后通知@AfaterReturning,异常通知@AfaterThrowing,环绕通知@Around
自定义aop-aspectJ:
切面(Aspect)
排除业务代码外的代码,列入转账,安全检查,日志,缓存,权限等…把项目切一刀,公共逻辑交由AOP管理,业务逻辑交给业务类管理好比切一刀西瓜,只用关注当前切面,不用关注西瓜其他部分
连接点(join point)
连接点指可以被切面织入的具体方法。通常业务接口中的方法均为连接点。
切入点(Pointcut)
切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法。被标记为final的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。
目标对象(Target)
目标对象指将要被增强的对象。即包含主业务逻辑的类的对象。目标类的对象若被增强,则该类称为目标类,该类对象称为目标对象。当然,不被增强,也就无所谓目标不目标了。
面向切面:在多个项目组件之中需要对项目进行增强则可以使用AOP,对代码无侵入的增加并实现了公共逻辑的统一处理,比如日志报错等。
都是Bean容器。
1.Application是Bean的子接口
2.Application提供了更全面的功能
BeanFactory是延迟加载的,只有在getBean的时候才会将Bean给创建,也就是说在getbean的时候可能有会发现属性没有注入等报错
ApplicationContext是程序启动的时候一次性全部加载。
1.解析类去定义Beandefintion解析Bean定义。
2.如果有多个构造方法则要推断构造方法
3.得到构造方法后,实例化得到一个对象
4.对加了@Autowired属性注解的进行填充注入
5.回调扩展方法Aware方法,比如BeanNameAware,BeanFactoryAware
6.调用BeanPostprocesser初始化前方法
7.调用intigerBean初始化方法
8.调用BeanPostProcesser的初始化后方法,在这里进行AOP
9.如果当前创建的是单例Bean会放入单例池
10.使用Bean
11.spring容器关闭时调用disposableBean中的distory()方法
singleton:默认的,全部单例模式,生命周期和IOC容器一致。
prototype:为每一个Bean提供一个实例,在每次getBean()注入的时候都是一个新的对象。
request:bean定义为在每次请求的时候创建一个实例。单个请求使用这个对象。
session:确保每个session有一个实例,session过期后,实例也会消失
application:bean定义ServletContext中一个生命周期中单列对象,定义在application中就可以跨容器。
websocket:bean定义websocket:bean中一个生命周期中单列对象。
不是线程的安全的。
如果不想线程共享,可以使用threadlocal,线程副本变量。DAO操作数据库维护线程副本connection就是使用的threadLocal
如果需要线程之间的共享,就需要考虑synchronize,voiletor,CAS,自旋锁等方法保证线程安全。
装饰器,工厂,代理,适配器,观察者(listener),策略模式
1.调用transcation类中的api,操作数据库的事务、
2.使用注解@transcation,生成代理类,将事务自动提交设置为false,执行业务后没有报错后继续执行。
读未提交: 线程A在修改数据,线程B读取到了未修改的数据。脏读。
读已提交: 需要等待线程A提交数据,线程B才可以读取。
可重复读" 可以任意时刻读我到我修改的数据,但是会引发幻读:2个线程同时读取到了为空,插入数据,这个时候就插入了2条数据。
**串行化 **:即每个操作需要等待上一个操作执行完成。
1.使用this方法调用。只能是@Autowried注入事务才行。
2.方法不是public
3.事务不支持数据库
4.抛出的异常没有被定义,默认为runtimeException
5.没有被spring管理
什么是Bean的自动装配: 无须在Spring配置文件中描述javaBean之间的依赖关系(如配置、)。IOC容器会自动建立javabean之间的关联关系。
手动装配: 需要定义javaBean直接的关系如下代码
<bean id="customerDAO" class="com.hebeu.customer.dao.JdbcCustomerDAO">
<property name="dataSource" ref="dataSource" />
</bean>
自动装配:需要写入Autowried
常见的自动装配:byname
<bean id="user" class="com.shw.User">
<property name="name" >
<value>小强</value>
</property>
<property name="age" >
<value>25</value>
</property>
<property name="sex" >
<value>男</value>
</property>
</bean>
<bean autowire="byName" id="manger" class="com.shw.Manger"></bean>
bytype
:根据类型进行装配
constructor
:通过构造器进行装配
aotodetect
:有构造器按构造器,没有按bytype
Spring是一个IOC容器吗,提供了AOP机制。
Spring-mvc是spring整合servlet,用于返回前端请求,进行路由等操作。
Spring-boot是一套快速开发工具包,简化了spring和spring-mvc的整合开发,约定俗成了一些配置文件。
1)用户请求到前端控制器dispatcherservlet。
2)dispatcherservlet调用handlermapping控制处理器。
3)dispatcherservlet找到对应的处理器,拦截器等一并返回给handler。
4)dispatcherservlet调用handleradapter处理器适配器。
5)Handleradpater调用后端适配好的controller处理器
6)controller执行完返回对应的modelandview
7)handleradpater将得到的modelandview交给dispatcherservlet。
8)dispatcherservlet将modelandview传给视图解析器viewreslover视图解析器
9)viewreslover解析后返回对应的view
10)dispatcher对view进行数据渲染
11)dispatcher返回给用户