关于BeanFactory和FactoryBean,下列说法正确的是( )
官方解析:BeanFactory是所有Spring Bean的容器根接口,其给IoC容器提供了一套完整的规范。FactoryBean是 一种创建Bean的方式,是对Bean的一种扩展。
ApplicationContext是BeanFactory的子接口;BeanFactory是Spring容器的接口;FactoryBean是Spring用于“工厂Bean”的接口
———————————————————————————————————————————
官方解析:在Spring MVC中,Model、ModelMap、ModelAndView都可以作为数据模型对象,以上述类型作为控制器的方法参数时,Spring MVC会自动实例化这些类型。ModelAttribute是注解,用于定义控制器方法执行之前,对数据模型的操作。
———————————————————————————————————————————
下列关于Spring MVC注解的说法中,正确的是( )
A
@ControllerAdvice用于定义控制器的通知类,它可以对指定的控制器进行增强。
B
@InitBinder用于定义控制器参数绑定规则,如转换规则,它会在参数转换之前执行。
C
@ExceptionHandler用于定义控制器发生异常后的操作。
D
@ModelAttribute用于定义控制器方法执行之前,对数据模型的操作。
答案:ABCD
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为
/** 支持当前事务;如果不存在,则创建一个新的。(默认的事务传播行为)*/
int PROPAGATION_REQUIRED = 0;
/**
* 支持当前事务;如果不存在,则以非事务方式执行。
* 注意: 它和没有事务执行是有区别的。需要谨慎使用!
*/
int PROPAGATION_SUPPORTS = 1;
/** 支持当前事务;如果当前不存在事务,则抛出异常。 */
int PROPAGATION_MANDATORY = 2;
/**
* 创建一个新事务,并且挂起当前事务(如果当前事务存在的话)。
* @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager
*/
int PROPAGATION_REQUIRES_NEW = 3;
/**
* 不支持当前事务,始终以非事务方式执行。
* @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager
*/
int PROPAGATION_NOT_SUPPORTED = 4;
/** 不支持当前事务;如果当前事务存在,则抛出异常。 */
int PROPAGATION_NEVER = 5;
/**
* 如果存在当前事务,则在嵌套事务中执行,否则,其行为与 PROPAGATION_REQUIRED 的行为类似。
* 注意:嵌套事务的实际创建只适用于特定的事务管理器,比如 DataSourceTransactionManager 在使用 JDBC 3.0 driver 时。
* @see org.springframework.jdbc.datasource.DataSourceTransactionManager
*/
int PROPAGATION_NESTED = 6;
/** 使用默认的事务隔离级别 */
int ISOLATION_DEFAULT = -1;
/** 读未提交。等同于: java.sql.Connection#TRANSACTION_READ_UNCOMMITTED */
int ISOLATION_READ_UNCOMMITTED = 1;
/** 读已提交。等同于: java.sql.Connection#TRANSACTION_READ_COMMITTED */
int ISOLATION_READ_COMMITTED = 2;
/** 可重复读。等同于: java.sql.Connection.TRANSACTION_REPEATABLE_READ */
int ISOLATION_REPEATABLE_READ = 4;
/** 等同于: java.sql.Connection#TRANSACTION_SERIALIZABLE */
int ISOLATION_SERIALIZABLE = 8;
/** 默认的事务超时时间 */
int TIMEOUT_DEFAULT = -1;
官方解析:Spring AOP支持的通知类型包括前置通知、后置通知、环绕通知、返回通知、异常通知。
Spring AOP的实现方式:JDK动态代理,是Java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP默认采用这种方式,在接口的代理实例中织入代码。CGLib动态代理,采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。
官方解析:Spring容器创建Bean对象的方法有三种方式,分别是:用构造器来实例化,使用静态工厂方法实例化和使用实例工厂方法实例化。
bean的注入有3种方式:1.属性注入、2.构造器注入、3.接口注入。
bean的创建方式:1.构造器创建、2.实例工厂创建、3.静态工厂创建。
Spring MVC拦截器包含三个方法:preHandle()、postHandle()、afterCompletion()
在Spring MVC中实现上传功能,主要依赖MultipartHttpServletRequest从读取请求中的文件,然后对读取到的MultipartFile类型进行处理。
1.
下列关于@Bean注解的说法中,错误的是( )
A
@Bean注解作用在方法上,表示该方法的返回值将被装配到容器中。
B
@Bean注解包含name属性,可以通过该属性指定装配的Bean的名称。
C
@Bean注解依赖于@Configuration注解,即它所在的类必须带有@Configuration注解。
D
@Bean注解可以装配任意的Bean,尤其适合装配那些初始化过程十分复杂的Bean。
正确答案:C;@Bean注解通常出现在带有@Configuration注解的类中,但这不是必要的条件,它也可以出现在带有@Component注解的类中,甚至是普通的类中。
官方解析:MVC的处理过程,首先控制器接受用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
Spring容器中Bean包含五种作用域:singleton、prototype、request、session、globalSession。
SpringApplication调用的run方法执行流程如下:
1. 初始化监听器,以及添加到SpringApplication的自定义监听器。
2. 发布ApplicationStartedEvent事件,如果想监听ApplicationStartedEvent事件,你可以这样定义:public class ApplicationStartedListener implements ApplicationListener,然后通过SpringApplication.addListener(..)添加进去即可。
3. 装配参数和环境,确定是web环境还是非web环境。
4. 装配完环境后,就触发ApplicationEnvironmentPreparedEvent事件。
5. 如果SpringApplication的showBanner属性被设置为true,则打印启动的Banner。
6. 创建ApplicationContext,会根据是否是web环境,来决定创建什么类型的ApplicationContext。
7. 装配Context的环境变量,注册Initializers、beanNameGenerator等。
8. 发布ApplicationPreparedEvent事件。
9. 注册springApplicationArguments、springBootBanner,加载资源等
10. 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。
11. 调用ApplicationContext的refresh()方法,装配context beanfactory等非常重要的核心组件。
12. 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。
13. 发布ApplicationReadyEvent事件,启动完毕,表示服务已经可以开始正常提供服务了。
通常我们这里会监听这个事件来打印一些监控性质的日志,表示应用正常启动了