Spring优点
1.通过控制反转和依赖注入实现低耦合
2.面向切面编程,将业务逻辑和系统功能区分开来(日志记录、事务管理、安全性)
3.切面和模板可以减少板式代码
4.声明式事务的支持(@Translation)可以实现对事务代码的灵活管理,提高代码的质量和效率
5.多种内置的框架(Mybaties)
6.可以进行方便的测试,添加注释就可以进行测试数据
Spring 用到了哪些设计模式
1.简单工厂模式,根据传入的关键词返回一个唯一bean
简单工厂模式和工厂方法模式的区别
工厂方法表现在父类和子类,父类是抽象的,子类是给出具体实现方法的。
什么是AOP
面向切面编程,将一些系统的公共逻辑如日志缓存等操作设置为切面,来实现与业务逻辑的分离。减少了系统的重复代码降低了耦合度,aop就是那些与业务无光,所有业务都可以调用的公共业务逻辑。
AOP有哪些实现方式
1.静态代理
有目标类和代理类,在编译的时候就设置了代理类,是在目标类上的增强。需要和目标类具有相同的接口。
缺点:目标类和代理类之间会有冗余代码,并且更新了接口后需要在目标类和代理类之间同时改动。
缺点:
代理类和目标类的区别
编译时注入,在编译过程中,目标类多出了一些增强的功能,变成了一个新的代理类。
2.动态代理
在程序运行中建立,对原有的目标类进行了增强但没有生成新的类。
并非主动的去建立了一个类,代理对象可以在调用前后去执行一些逻辑。。程序要主动执行到那个地方才会生成的新类,在这个类中去定义一些调用前后的逻辑。
介绍动态代理
普通类和实体类区别
普通类没有去实现接口,实现类完成了接口的定义方法
JDK动态代理和CGLIB动态代理的区别
1.如果类实现了接口,通过jdk动态代理生成的代理类,会自动实现接口中的方法。JDK动态代理的核心是InvocationHandler接口和Proxy类。
缺点:目标类必须有实现的接口。如果某个类没有实现接口,那么这个类就不能用JDK动态代理
2.CGLTB动态代理:通过继承实现。如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类
CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
Spring AOP相关术语
Spring通知有哪些类型
在方法执行的某个阶段调用的方法,如执行前后,异常等
什么是IOC?
IOC:控制反转,由Spring容器管理bean的整个生命周期。通过反射实现对其他对象的控制,包括初始化、创建、销毁等,解放手动创建对象的过程,同时降低类之间的耦合度
不同于传统的对象建立,去new,控制反转将对象的状态管理,交给了spring容器实现
IOC的好处
spring容器就是一个第三方容器,spring就是一个ioc
什么是依赖注入
在Spring创建对象的过程中,把对象依赖的属性注入到对象中。依赖注入主要有两种方式:构造器注入和属性注入
IOC容器初始化过程
在容器启动加载时,bean对象都会被加载注入到容器中,但懒加载是使用到它时候才去构建
BeanFactory和FactoryBean的区别
BeanFactory和ApplicationContext有什么区别
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
1.作为子接口,其功能更多,支持国际化,统一的资源文件访问方式
2。加载方方式,一个是懒加载一个是全加载,带来的系统开销压力都不同。
3.创建方式和注册方式。
Bean注入容器有哪些方式
1.@Configuation,@Bean
bean的作用域
因为bean是在内存中,提供了几种方法来管理bean。
Spring自动装配的方式有哪些
指定了一个类class
根据id去寻找,三个都是一体的
@Autowired和@Resource的区别
同一类型可以存在多个bean吗(可以)
@Qualifier 注解有什么作用
相同类型bena很多,通过唯一的name从中获得正确的bean。
当需要创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个 bean 来消除歧义
@Bean和@Component有什么区别
都是使用注解定义 Bean。@Bean 是使用 Java 代码装配 Bean,@Component 是自动装配 Bean
- @Component用于类上,表明一个类会作为组件类,并告知Spring要为这个类创建bean,每个类对应一个 Bean。
- @Bean 注解用在方法上,表示这个方法会返回一个 Bean。@Bean 需要在配置类中使用,即类上需要加上@Configuration注解。
@Component、@Controller、@Repositor和@Service 的区别?
Spring 事务实现方式有哪些
事务定义就是原子操作,不可分隔。
编程式就是自己写逻辑,声明式就是用注解
有哪些事务传播行为
在TransactionDefinition接口中定义了七个事务传播
1.存在,则去添加,如果是嵌套了多次。对于不同线程要开启不同的事务。相同线程则只需要一个
2.存在则执行,不存在在不作为事务执行。
3.存在则执行,不存在则抛出异常
4.不论是否存在,开启新的事务。
5.总是非事务执行,挂起任何存在事务。
6.总是非事务执行,如果挂起任何存在的事务,抛出异常
7.如果一个存在事务,则进行其那套,不存在则进行1.
Spring事务什么时候会失效
1.访问权限:访问权限必须设置为public(源码来看,如果值不是public则返回null)
2.方法被final修饰,因为spring要用aop生成代理类,如果方法被修饰就无法被重写
3.对象没有被Spring进行管理,没有在controller,service和component这样的
4.表无法被管理,如果MySQL使用的存储引擎是myisam,这样的话是不支持事务的。因为myisam存储引擎不支持事务
5.方法内部调用(因为发生事务回滚需要),经过spring代理类发起的才会进入到管理中
使用代理对象调用类则可以进入到事务
事务没有发现到异常,而是通过trycatch结束,之前的事务就不会进行一个回滚。
Spring怎么解决循环依赖的问题
非单列对象指的是bean才全局中不是唯一的,有可能是@scope定义的每次请求多出一个的。
三级缓存
构造器注入解决方法
1.使用@Lazy注解@Lazy注解会延迟Bean的初始化,直到第一次使用时才初始化
2.不将bean设置为final要求去尝试注入一个,而是通过传值来进行初始化
非单列
final体现在
解决
Spring的启动过程
1.读取web.xml
2.创建 ServletContext,为 ioc 容器提供宿主环境
3。触发容器初始化事件,contextLoaderListener.contextInitialized()方法,在这个方法会初始化一个应用上下文WebApplicationContext
即ioc容器,ioc容器初始化完成后,会加入到servletcontext中
4.初始化web.xml中配置的servlet,如DispatcherServlet,用于匹配、处理每个servlet请求
Spring 的单例 Bean 是否有并发安全问题
spring的请求会开启一个独立的线程,但这些线程会可能共同的使用同一个bean
Spring Bean如何保证并发安全
1.改变bean的策略,对 web 项目,可以 Controller 类上加注解 @Scope("prototype") 或 @Scope("request"),对非 web 项目,在 Component 类上添加注解 @Scope("prototype")
每次请求处理的都是独立的bean,但是这种方法会导致系统的开销变大
2.尽量避免使用成员变量
使用redis等分布式共享信息
@Async注解的原理