简单介绍下Spring?
Spring是一个java开发框架,简化java开发,有三个核心组件,IOC(控制反转),DI(依赖注入),AOP(切面编程)
1.IOC
概念:控制反转,反转的是对象的创建权,让Spring帮我们创建对象,我们使用的时候直接从容器中获取即可.
IOC容器有哪些:
ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,AnnotationConfigApplicationContext,BeanFactory.
ApplicationContext和BeanFactory的区别:
ApplicationContext和BeanFactory都是Spring容器,
区别是BeanFactory是底层接口,ApplicationContext是派生接口,功能更强大,BeanFactory是懒加载,使用的时候才会创建Bean,内存不足时,可以使用BeanFactory,ApplicationContext默认在容器初始化的时候加载所有的Bean,好处是使用的时候拿来即用,无需等待,缺点是起始阶段比较耗费内存.
BeanFactory和FactoryBean的区别:
BeanFactory是Spring容器,FactoryBean是一个特殊的Bean,用于创建Bean,创建出来的bean会放到容器中.
bean标签中的属性:
<bean id ="" class="" scope="" init-method="" desctory-method="" lazy-init="" autowire="">
Spring中的单例Bean是线程安全的吗?
不安全,但是Spring中的Bean是无状态的,也就是不存储数据,所以某种程度上来说是线程安全的,
怎么解决线程安全问题?
(1)把bean的作用域改为非单例,prototype
(2)把共享变量放到ThreadLocal中,ThreadLocal是线程私有变量,线程隔离,也可以解决线程安全问题,
简单描述下Spring容器中Bean的生命周期:
BeanDefinition->实例化->依赖注入->初始化->放到容器中使用->销毁
(1)先通过配置文件或者注解拿到所有的BeanDefinition,并放到BeanDefinitionMap中
(2)从BeanDefinitionMap中拿到bean定义并进行实例化new
(3)依赖注入,给容器中bean中的属性复制
(4)初始化,给属性赋值
(5)初始化完成后,bean真正创建完成,就可以把bean放到Spring容器中,ConcurrentHashMap,我们使用的时候就可以通过getBean来获取Bean
(6)容器销毁的时候,bean也会跟着销毁
BeanDefinition是bean定义,描述的是这个bean的类型,即这个bean的名字,有哪些属性,有哪些构造函数,有哪些方法.
2.DI
概念:依赖注入,给容器中的Bean的属性赋值就叫依赖注入.
依赖注入的方式有:
构造器注入 ,setter注入
3.AOP
概念:
面向切面编程,把公共代码抽取出来,并在不改变原始代码的基础上对方进行功能增幅.
连接点:所有可以被功能增幅的方法都是连接点
切入点:进行功能增幅的方法就是切入点.
通知:共性功能.
通知类:通知所在的类就是通知类.
切面:切入点+通知就是切面,描述的是在那些方法上进行什么功能增幅,
AOP底层原理:动态代理,在程序运行期间动态生成的一个代理对象,当调用到原始方法时,真正执行的是代理对象的代理方法.动态代理实现方式有两种,基于JDK的动态代理(反射)和基于CGLib的动态代理(继承)
五种通知类型:
前置通知:@Before
后置通知:@After
环绕通知:@Around
异常后通知:@AfterThrowing
返回后通知:@AfterReturning
4.注解
Spring中用过哪些注解:
定义Bean:@Component @Contorller @Service @Repository
依赖注入:@Autowired @Qualifier @Resource @Value
定义第三方Bean: @Bean
配置类注解: @Configuration @Import @PropertySource @ComponentScan
bean的作用范围和生命周期:@Scope @PostConstruct @PreDestroy
5.事务
Spring事务的作用:
保证业务层方法同成功同失败.
如何添加事务:
(1)@Transactional
(2)在主配置类上添加@EnableTransactionManager
(3)把事务管理器交给Spring管理PlateformTransactionManagement
事务传播行为的作用:
用于解决业务层方法相互调用产生的事务问题,描述的是事务协调员是否要和业务管理员同成功同失败
事务传播行为有哪些:
默认,新建,支持,不支持