Spring基础概念

Spring基础概念

读源码遇到的一些概念记录,常年模糊没去深入理解的。
1. 什么是POJO?
答:简单java对象:内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。
2.什么是IoC?
答:依赖反转模式:

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
BeanFactory 简介

BeanFactory,从名字上也很好理解,生产 bean 的工厂,它负责生产和管理各个 bean 实例。

初学者可别以为我之前说那么多和 BeanFactory 无关,前面说的 ApplicationContext 其实就是一个 BeanFactory。我们来看下和 BeanFactory 接口相关的主要的继承结构:

2

我想,大家看完这个图以后,可能就不是很开心了。ApplicationContext 往下的继承结构前面一张图说过了,这里就不重复了。这张图呢,背下来肯定是不需要的,有几个重点和大家说明下就好。

1.ApplicationContext 继承了 ListableBeanFactory,这个 Listable 的意思就是,通过这个接口,我们可以获取多个 Bean,大家看源码会发现,最顶层 BeanFactory 接口的方法都是获取单个 Bean 的。

2.ApplicationContext 继承了 HierarchicalBeanFactory,Hierarchical 单词本身已经能说明问题了,也就是说我们可以在应用中起多个 BeanFactory,然后可以将各个 BeanFactory 设置为父子关系。

3.AutowireCapableBeanFactory 这个名字中的 Autowire 大家都非常熟悉,它就是用来自动装配 Bean 用的,但是仔细看上图,ApplicationContext 并没有继承它,不过不用担心,不使用继承,不代表不可以使用组合,如果你看到 ApplicationContext 接口定义中的最后一个方法 getAutowireCapableBeanFactory() 就知道了。

4.ConfigurableListableBeanFactory 也是一个特殊的接口,看图,特殊之处在于它继承了第二层所有的三个接口,而 ApplicationContext 没有。这点之后会用到。

5.请先不用花时间在其他的接口和类上,先理解我说的这几点就可以了。

https://javadoop.com/post/spring-ioc
@BeanFactory和ApplicationContext的区别
* BeanFactory – BeanFactory采取延迟加载,第一次getBean时才会初始化Bean
* ApplicationContext – 在加载applicationContext.xml时候就会创建具体的Bean对象的实例,还提供了一些其他的功能
* 事件传递
* Bean自动装配
* 各种不同应用层的Context实现

@技术分析之Spring框架的配置文件分开管理(了解)
例如:在src的目录下又多创建了一个配置文件,现在是两个核心的配置文件,那么加载这两个配置文件的方式有两种!
* 主配置文件中包含其他的配置文件:

  <import resource="applicationContext2.xml"/>

@ServletContextListener:用来监听ServletContext对象的创建和销毁的监听器.
Spring 的 ApplicationContext 提供了支持事件和代码中监听器的功能。
我们可以创建 bean 用来监听在 ApplicationContext 中发布的事件。ApplicationEvent 类和
在 ApplicationContext 接口中处理的事件,如果一个 bean 实现了 ApplicationListener 接口,
当一个 ApplicationEvent 被发布以后,bean 会自动被通知。

 <!-- 配置Spring的核心监听器: -->
         <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
         </listener>
         <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
         </context-param>

@Component[kəm’pəʊnənt]:组件.(作用在pojo类上)
Spring中提供@Component的三个衍生注解:(功能目前来讲是一致的)
* @Controller – 作用在WEB层
* @Service – 作用在业务层
* @Repository – 作用在持久层

@如果注入的是对象类型(自动装配模式),使用如下注解:
* @Autowired – 默认按类型进行自动装配(去IOC容器去找他注解的对象实现的类,自动装配注入)
* 如果想按名称注入: @Qualifier – 强制使用名称注入

必须一块使用:

                    @Autowired
                    @Qualifier("dao")

*@Resource – 相当于@Autowired和@Qualifier一起使用
推荐使用@Resource。@Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。

@Bean的作用范围(作用域)注解
* 注解为@Scope[skəʊp] (value=“prototype”),作用在类上。值如下:
* singleton['sɪŋg(ə)lt(ə)n] – 单例,默认值
* prototype['prəʊtətaɪp] – 多例

@Bean的生命周期的配置(了解)
* 注解如下(作用在方法上):
* @PostConstruct – 相当于init-method(当bean被载入到容器的时候调用)
* @PreDestroy – 相当于destroy-method

@配置properties文件配置

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
    <property name="locations"> <!-- PropertyPlaceholderConfigurer类中有个locations属性,接收的是一个数组,即我们可以在下面配好多个properties文件 -->  
        <array>  
            <value>classpath:conn.properties</value>  
        </array>  
    </property>  
</bean> 

<!-- 第二种方式是使用注解的方式注入,主要用在java代码中使用注解注入properties文件中相应的value值 -->  
<bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
    <property name="locations"><!-- 这里是PropertiesFactoryBean类,它也有个locations属性,也是接收一个数组,跟上面一样  
        <array>  
            <value>classpath:public.properties</value>  
            <value>classpath:db.properties</value>  
        </array>  
    </property>  
</bean> 

13、Spring 框架中的单例 Beans 是线程安全的么?
Spring 框架并没有对单例 bean 进行任何多线程的封装处理。关于单例 bean 的线程安全和并
发问题需要开发者自行去搞定。但实际上,大部分的 Spring bean 并没有可变的状态(比如
Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean
有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。
最浅显的解决办法就是将多态 bean 的作用域由“singleton”变更为“prototype”。
https://www.cnblogs.com/wangzhongqiu/p/6636066.html

20、在 Spring 中可以注入 null 或空字符串吗?
完全可以。

27、Spring 框架中都用到了哪些设计模式?
Spring 框架中使用到了大量的设计模式,下面列举了比较有代表性的:
1、代理模式—在 AOP 和 remoting 中被用的比较多。
2、单例模式:在 spring 配置文件中定义的 bean 默认为单例模式。
3、模板模式:用来解决代码重复的问题。
比如. RestTemplate, JmsTemplate, JpaTemplate。
4、委派模式:Spring 提供了 DispatcherServlet 来对请求进行分发。
5、工厂模式:BeanFactory 用来创建对象的实例,贯穿于 BeanFactory / ApplicationContext
接口的核心理念。
6、代理模式:AOP 思想的底层实现技术,Spring 中采用 JDK Proxy 和 CgLib 类库。

28、ofo面试题:aop机制,实现,具体怎样使用,具体到标签?

答: AOP,面向切面编程,是对OOP(面向对象编程)的补充和完善,简单来讲就是将纵向重复的代码,横向抽取出来。最明显的体现就是过滤器和拦截器的使用。

Spring实现AOP的本质是动态代理,Spring采用两种动态代理的方式,分别是JDK动态代理和cglib动态代理。JDK动态代理的被代理对象必须实现接口,而cglib动态代理的被代理对象原则上可以是任何类,cglib实现动态代理的原理是对被代理对象进行继承,重写被代理对象中所有的方法,所以被代理对象不能被final修饰。

Spring操作AOP,具体可分为4步。1.导包;2,准备目标对象;3.准备通知;4,将通知织入目标对象。其中2(准备目标对象)和3(准备通知)由java代码实现,4(将通知织入目标对象)有两种实现方式,一种是xml配置,一种是注解配置。其中,xml配置用的标签有aop:config、aop:pointcut、aop:aspect、aop:before、aop:after-returning、aop:around、aop:after-throwing、aop:after。注解配置用到的注解有:@Aspect、@Pointcut、@Before、@AfterReturning、@Around、@AfterThrowing、@After。

29、ofo面试题:Spring切面可以应用5种类型的通知,哪5种?

答:前置通知(Before)、后置通知(After-returning,在方法成功执行之后调用通知)、环绕通知(Around,在目标方法之前之后都调用)、异常通知(After-throwing,在方法抛出异常后调用通知)、后置通知(After,在方法完成之后调用通知,无论方法执行是否成功)。

2.Spring的配置有哪些?简单说一下。(ofo面试)

答:
Spring整合Dao,要配置数据库启动,配置SqlSessionFactory,配置Mapper动态代理。

Spring整合Service,要配置包扫描器(开启注解驱动),要配置事务管理(事务管理器,事务通知,事务切面)。

Spring整合Web,要配置包扫描器(扫描Controller),配置处理器映射器和处理器适配器(采用注解驱动的方法),配置视图解析器。

在web.xml,要加载Spring容器,并且要配置一个springMVC的前端控制器。

1.简单的谈一下SpringMVC的工作流程?
流程

1、用户发送请求至前端控制器DispatcherServlet 
2、DispatcherServlet收到请求后调用HandlerMapping处理器映射器。 
3、处理器映射器根据请求URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 
4、DispatcherServlet调用HandlerAdapter处理器适配器 
5、通过HandlerAdapter处理器适配器调用具体的处理器(Controller,也叫后端控制器)。 
6、Controller执行完成返回ModelAndView 
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet 
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器 
9、ViewReslover解析后返回具体View给DispatcherServlet。
10、DispatcherServlet使用Model模型数据对View进行视图渲染(即将模型数据填充至视图中)。 
11、DispatcherServlet响应用户

IOC
https://mp.weixin.qq.com/s?__biz=MzAxNjk4ODE4OQ==&mid=2247485011&idx=1&sn=e4c1c094ddb952d81141e396f7ff1bfe&chksm=9bed2721ac9aae37e293b1f44d3de7bd75974f1e489729b5d41274c1515bad9b93d2201717a8&scene=0#rd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值