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中用到了哪些设计模式
- ⼯⼚设计模式 : Spring使⽤⼯⼚模式通过 BeanFactory 、 ApplicationContext 创建bean 对象
- 代理设计模式 : Spring AOP 功能的实现
- 单例设计模式 : Spring 中的 Bean 默认都是单例的
- 适配器模式 :Spring AOP 模块对 BeforeAdvice、 AfterAdvice、 ThrowsAdvice 三种通知类型的支持实际上是借助适配器模式来实现的、spring MVC 中也是⽤到了适配器模式适配 Controller
- 装饰器模式:
- 观察者模式:
适配器模式实现:
原有接口,目标接口
声明一个适配器类实现原有接口,持有目标接口,根据需求调用目标接口的方法装饰器模式实现:
原有接口,抽象类。
定义一个装饰器类,持有原有接口的引用,调用原有接口的方法,并定义新的方法声明
2. Spring声明事务
- 基于xml配置的声明式事务
- 基于@Transactional注解的声明式事务
1. 事务传播行为(Transaction Behavior)
传播行为级别,定义的是事务的控制范围。通俗点说,执行到某段代码时,对已存在事务的不同处理方式。
- PROPAGATION_REQUIRED,需要事务处理。有则使用,无则新建。
- PROPAGATION_SUPPORTS,支持事务处理。该级别的特性是,如果 Context 存在事务,则将代码加入到 Context 的事务中执行,如果 Context 中没有事务,则使用 非事务 的方式执行。
3.PROPAGATION_MANDATORY,强制性要求事务。- PROPAGATION_REQUIRES_NEW,每次都新建一个事务。.
- PROPAGATION_NOT_SUPPORTED,不支持事务。
- PROPAGATION_NEVER,对事务要求更严格,不能出现事务
- 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的创建流程
- BeanDefinition:Spring加载配置文件,或者根据注解创建一个BeanDefinition对象
BeanDefinition对象的属性
- beanClass:表示bean的类型,创建Bean的过程中会根据属性来实例的得到对象
- scope:表示一个bean的作用域,scope等于singleton,该Bnean就是一个单例Bean
- primary:表示一个bean是主bean,在Spring中一个类型可以有多个bean对象,在进行依赖注入时,如果根据类型找到了多个bean,此时会判断这些bean中是否存在一个主bean,如果存在,则直接将这个bean注入给属性
- initMethodName:表示一个bean的初始化方法
- 。。。。。
- BeanFactory:BeanFactory利用BeanDefinition来生成Bean对象,BeanDefinition相当于BeanFactory得原材料,Bean就相当于BeanFactory所生产出来得产品。
- BeanFactoryt:利用BeanDefinition来生成Bean对象,进入bean的生命周期,
- 实例化:doCreateBean方法创建实例,用反射技术创建
- 依赖注入,属性赋值:
- 初始化:如果Bean配置了init-method方法,则会执行init-method配置的方法
- 销毁:如果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.xml配置注入
< property>
< constructor-arg>- 注解注入
@Component,@Autowired / @Resource
7. Spring MVC的流程
- 用户发送请求到DispatcherServlet
- DispatcherServlet收到请求调用处理器映射HandlerMapping
- HandlerMapping根据url找到对应的Handler,返回给DispatcherServlet
- DispatcherServlet,调用HandlerAdapter执行Handler得到执行结果
- 结果是ModelAndView,DispatcherServlet请求视图解析器(ViewResolver)去进行视图解析,返回一个view
- 结果是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中
- 使用注解
@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;
}
- 使用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. ${}和#{}的区别
{}是字符串替换
#{}:#{}是预处理
3. mybaits工作原理
Mapper 接口的工作原理是JDK动态代理
Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,根据类的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的sql,然后将sql执行结果返回。