Spring相关

  • 1. Spring中用到了哪些设计模式
  • 2. Spring声明事务
  • 1. 事务传播行为(Transaction Behavior)
  • 2. Spring事务的基本原理
  • 3. Spring bean的作用域
  • 4.1. Spring bean的创建流程
  • 4.2. Spring bean的生命周期
  • 5. 将一个类声明为Spring的 bean 的注解有哪些
  • 6. 什么是Spring装配
  • 7. Spring MVC的流程
  • 8. 返回 JSON 格式使用什么注解?
  • 9.Spring mvc中post、get方法获取参数的几种方式
  • 10. mybaits相关
  • 1. mybits是什么
  • 2. ${}和#{}的区别
  • 3. mybaits工作原理


1. Spring中用到了哪些设计模式

  1. ⼯⼚设计模式 : Spring使⽤⼯⼚模式通过 BeanFactory 、 ApplicationContext 创建bean 对象
  2. 代理设计模式 : Spring AOP 功能的实现
  3. 单例设计模式 : Spring 中的 Bean 默认都是单例的
  4. 适配器模式 :Spring AOP 模块对 BeforeAdvice、 AfterAdvice、 ThrowsAdvice 三种通知类型的支持实际上是借助适配器模式来实现的、spring MVC 中也是⽤到了适配器模式适配 Controller
  5. 装饰器模式:
  6. 观察者模式:

适配器模式实现:
原有接口,目标接口
声明一个适配器类实现原有接口,持有目标接口,根据需求调用目标接口的方法

装饰器模式实现:
原有接口,抽象类。
定义一个装饰器类,持有原有接口的引用,调用原有接口的方法,并定义新的方法声明

2. Spring声明事务

  1. 基于xml配置的声明式事务
  2. 基于@Transactional注解的声明式事务

1. 事务传播行为(Transaction Behavior)

传播行为级别,定义的是事务的控制范围。通俗点说,执行到某段代码时,对已存在事务的不同处理方式。

  1. PROPAGATION_REQUIRED,需要事务处理。有则使用,无则新建。
  2. PROPAGATION_SUPPORTS,支持事务处理。该级别的特性是,如果 Context 存在事务,则将代码加入到 Context 的事务中执行,如果 Context 中没有事务,则使用 非事务 的方式执行。
    3.PROPAGATION_MANDATORY,强制性要求事务。
  3. PROPAGATION_REQUIRES_NEW,每次都新建一个事务。.
  4. PROPAGATION_NOT_SUPPORTED,不支持事务。
  5. PROPAGATION_NEVER,对事务要求更严格,不能出现事务
  6. PROPAGATION_NESTED,嵌套事务。

2. Spring事务的基本原理

核心:数据库对事务的支持 + AOP环绕Advice
Spring事务的本质其实就是数据库对事务的支持,声明式事务的实现就是通过环绕增强的方式,在目标方法执行之前开启事务,在目标方法执行之后提交或者回滚事务,

3. Spring bean的作用域

singleon:单例
prototype:每使用每新建
request:每HTTP每新建
session:一个session一个bean
globalSession:所有的session共享一个bean实例。

<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">

4.1. Spring bean的创建流程

  1. BeanDefinition:Spring加载配置文件,或者根据注解创建一个BeanDefinition对象

BeanDefinition对象的属性

  1. beanClass:表示bean的类型,创建Bean的过程中会根据属性来实例的得到对象
  2. scope:表示一个bean的作用域,scope等于singleton,该Bnean就是一个单例Bean
  3. primary:表示一个bean是主bean,在Spring中一个类型可以有多个bean对象,在进行依赖注入时,如果根据类型找到了多个bean,此时会判断这些bean中是否存在一个主bean,如果存在,则直接将这个bean注入给属性
  4. initMethodName:表示一个bean的初始化方法
  5. 。。。。。
  1. BeanFactory:BeanFactory利用BeanDefinition来生成Bean对象,BeanDefinition相当于BeanFactory得原材料,Bean就相当于BeanFactory所生产出来得产品。
  2. BeanFactoryt:利用BeanDefinition来生成Bean对象,进入bean的生命周期,
  3. 实例化:doCreateBean方法创建实例,用反射技术创建
  4. 依赖注入,属性赋值:
  5. 初始化:如果Bean配置了init-method方法,则会执行init-method配置的方法
  6. 销毁:如果Bean配置了destory-method方法,则会执行destory-method配置的方法

4.2. Spring bean的生命周期

Spring 容器可管理 singleton 作用域 Bean 的生命周期,知道创建,初始化完成,销毁时间。

1.实例化 Instantiation
2.属性赋值 Populate
3.初始化 Initialization
4.销毁 Destruction

prototype 作用域 Bean,Spring 只负责创建,实例就交给客户端代码管理

普通java应用中对象的生命周期,new创建,回收交给gc

5. 将一个类声明为Spring的 bean 的注解有哪些

标注:@Component @Service @ Controller
装配: @Autowired @Resource(name = “a2”)

@Autowired @Resource区别
@Autowired注解是按照类型(byType)装配依赖对象,想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用
@Resource有两个重要的属性:name和type

6. 什么是Spring装配

Spring装配:Spring容器完成依赖注入的过程

转配方式:

  1. 1.xml配置注入
    < property>
    < constructor-arg>
  2. 注解注入
    @Component,@Autowired / @Resource

7. Spring MVC的流程

  1. 用户发送请求到DispatcherServlet
  2. DispatcherServlet收到请求调用处理器映射HandlerMapping
  3. HandlerMapping根据url找到对应的Handler,返回给DispatcherServlet
  4. DispatcherServlet,调用HandlerAdapter执行Handler得到执行结果
  5. 结果是ModelAndView,DispatcherServlet请求视图解析器(ViewResolver)去进行视图解析,返回一个view
  6. 结果是json

handler的种类:
org.springframework.web.servlet.bind.annotation.@RequestMapping
org.springframework.web.servlet.bind.annotation.@GetMapping
org.springframework.web.servlet.bind.annotation.@PostMapping
org.springframework.web.servlet.bind.annotation.@PutMapping
org.springframework.web.servlet.bind.annotation.@DeleteMapping
org.springframework.web.servlet.bind.annotation.@PatchMapping
所以需要HandlerAdapter去处理

8. 返回 JSON 格式使用什么注解?

@ResponseBody

9.Spring mvc中post、get方法获取参数的几种方式

get请求方式参数是在url后,而post请求方式的参数是在request body中

  1. 使用注解
@GetMapping("/get")
   public User getUserById(@RequestParam(name = "id", required = true) Integer id) {
        if (id.intValue() == 0) {
            return null;
        }
        return list.get(id);
    }

   @PostMapping("/save")
     public User saveUser(@RequestBody Map<String, Object> map) {
     Integer id = (Integer) map.get("id");
     String name = (String) map.get("name");
     Integer age = (Integer) map.get("age");
     List<String> hobby=(List<String>) map.get("hobby");
     User user = new User(id, name, age, hobby);
     list.add(user);
     return user;
     }
  1. 使用HttpServletRequest
@GetMapping("/get")
    public User getUserById(HttpServletRequest request) {
        Integer id = Integer.parseInt(request.getParameter("id"));
        if (id.intValue() == 0) {
            return null;
        }
        return list.get(id);
    }

     @PostMapping("/save")
     public User save(HttpServletRequest request) {
     Integer id = Integer.parseInt(request.getParameter("id"));
     String name = request.getParameter("name");
     Integer age = Integer.parseInt(request.getParameter("age"));
     String parameter = request.getParameter("hobby");
     User user = new User(id, name, age, null);
     list.add(user);
     return user;
     }

10. mybaits相关

1. mybits是什么

mybatis是一个优秀的基于java的持久层框架,它对JDBC操作数据库的过程进行封装。以前写dao层时,需要加载sql驱动,建立连接,然后preparestatement,执行sql语句,最后封装执行结果返回。有了mybaits,只用在xml中写对应接口的sql就行了。

2. ${}和#{}的区别

自定义spring序列化 spring序列化有几种_spring{}是字符串替换
#{}:#{}是预处理

3. mybaits工作原理

Mapper 接口的工作原理是JDK动态代理
Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,根据类的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的sql,然后将sql执行结果返回。