温馨提示:距离2024年结束还剩18天,剩余约为4.92%...

转载

Java的基础框架常见的问题及其解答

1.Spring MVC怎么处理异常?

  • 可以直接使用Spring MVC中的全局异常处理器对异常进行统一处理,此时Contoller方法只需要编写业务逻辑代码,不用考虑异常处理代码。
  • 开发一个全局异常处理器需要使用到两个注解:@Controlleradvice 、@ ExceptionHandler。

2.Spring MVC中的拦截器和Servlet中的filter有什么区别?

  • 过滤器:依赖于servlet容器,在实现上基于函数回调,可以对几乎所有请求进行过滤。
  • 拦截器:依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架,属于面向切面编程(AOP)的一种运用。

3.你用过哪些重要的Spring注解?

  • @Component- 用于服务类。
  • @Service
  • @Repository
  • @Controller
  • @Autowired - 用于在 spring bean 中自动装配依赖项。通过类型来实现自动注入bean。和@Qualifier注解配合使用可以实现根据name注入bean。
  • @Qualifier - 和@Autowired一块使用,在同一类型的bean有多个的情况下可以实现根据name注入的需求。
  • @Scope - 用于配置 spring bean 的范围。
  • @Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。
  • @Aspect,@Before,@After,@Around,@Pointcut - 用于切面编程(AOP)。

4.spring用到的设计模式?

  1. 工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
  2. 代理设计模式 : Spring AOP 功能的实现。
  3. 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  4. 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  5. 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  6. 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  7. 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

5.Spring依赖注入有哪些方式?

  • 有4种依赖注入方式:
    • Set方法注入:注入是最简单、最常用的注入方式,支持注解+xml。
    • 构造器注入:是指带有参数的构造函数注入,支持注解+xml。
    • 静态工厂的方法注入:通过调用静态工厂的方法来获取自己需要的对象,只支持xml。
    • 实例工厂的方法注入:获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法,只支持xml。
  • 有2 种实现方式:
    • 注解(如Autowired,Resource,Required)
    • 配置文件(如xml)

6.SpringMvc常见注解?

  1. @Controller:用于定义控制器类
  2. @ResponseBody:表示方法的返回结果直接写入HTTP response body中
  3. @PathVariable:获取路径参数
  4. @RequestParam:用在方法的参数前面
  5. @RequestBody:请求的json转化为bean去接收
  6. @RestController:是@Controller和@ResponseBody的合集
  7. @RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射
  8. @GetMapping:是@RequestMapping(method = RequestMethod.GET)的缩写。不支持
  9. @RequestMapping的自定义属性。
  10. @PostMapping:是@RequestMapping(method = RequestMethod.POST)的缩写。不支持
  11. @RequestMapping的自定义属性。
  12. @ControllerAdvice:统一处理异常。
  13. @ExceptionHandler:用在方法上表示遇到这个异常就执行以下方法。

7.ssm-#{}和${}的区别是什么?

  • -#{}是预编译处理,可以有效的防止SQL注入。底层实现依靠PreparedStatement,预编译的时候会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值的时候都会加上2个单引号。
  • ${}是直接字符串替换,所以有sql注入的风险。like ,order by ,where
  • 两者都可以使用的时候优先用#{},比如where查询,like查询选择用#{}。
  • order by 字段,from 表名称,只能用${}。
  • -#{}可以对数据类型进行自动转换,而${}将所有数据都当做字符串处理。

简单回答:

  • -#{}可以防止sql注入
  • 能用#{}不用${}
  • order by 字段,from 表名称,只能用${}

辅助理解:

#where情况
 参数 = "itheima or 1=1"
 1.用#{}
 select * from foo where bar = #{xxxx}
 select * from foo where bar = ?
 select * from foo where bar = 'itheima or 1=1' --sql注入失败
 ##用${}
 select * from foo where bar = ${xxxx}
 select * from foo where bar = itheima or 1=1; --sql注入成功
 
 #like情况
 参数 = "' or '1=1"
 ##用#{}
 select * from foo where bar like '%#{xx}%’
 select * from foo where bar like '%?%’
 select * from foo where bar like '%'' or '1=1'%' --语法错误,sql注入失败
 ##用${}
 select * from foo where bar like '%${xx}%’
 select * from foo where bar like '%' or '1=1%’ --sql注入成功
 
 
 #order情况
 参数 = "name"
 ##用#{}
 select * from foo order by #{xxxx}
 select * from foo order by ?
 select * from foo order by 'name' --没法排序,没有结果
 ##用${}
 select * from foo order by ${xxxx}
 select * from foo order by name --ok
 ##用${} 可能引起sql注入
 比如
 [SQL]select * from aaa order by id and(updatexml(1,concat(0x7e,(select system_user())),0));
 [Err] 1105 - XPATH syntax error: '~root@localhost'
 
 #from情况 不能使用#{}
 参数 = "foo"
 ##用#{}
 select * from #{xxx};  
 select * from ?;  
 select * from 'foo'; --语法错误
 ##用${}
 select * from ${xxx};  
 select * from foo; --ok

8.ssm-mybatis模糊查询like语句该怎么写?

  1. java中用%,sql使用#{}。建议。
  2. java中用%,sql使用${}。不建议,会sql注入。
  3. sql中使用%,sql使用 ${}。不建议,会sql注入。
  4. sql中使用%,sql使用 #{}。可以,但是需要注意选择合适的引号。
  5. sql中使用%,sql使用 #{}。配合concat函数,建议。

简要回答:

  1. 不用${},有sql注入风险
  2. 用 #{},%号在java中或者sql中都可以。sql中使用%,需要配合concat函数。
1、java中用%,sql使用#{}。建议。
 string wildcardname = “%itheima%”;
 list<name> names = mapper.selectlike(wildcardname);
 
 <select id=”selectlike”>
  select * from foo where bar like #{wildcardname}
 </select>

 #会预编译为 select * from foo where bar like ?
 #假如传递【%itheima%】,sql就是select * from foo where bar like '%itheima%'
 #假如传递【%itheima% or 1=1】,sql就是select * from foo where bar like '%itheima% or 1=1',也是没有sql注入的。
2、java中用%,sql使用${}。不建议,会sql注入。需要做额外的处理
 string wildcardname = “%itheima% or 1=1”;
 list<name> names = mapper.selectlike(wildcardname);

 <select id=”selectlike”>
  select * from foo where bar like ${wildcardname}
 </select>


 #假如传递【%itheima% or 1=1】,sql为select * from foo where bar like %itheima% or 1=1;查询了所有
3、sql中使用%,sql使用 ${}。不建议,会sql注入。需要做额外的处理
 string wildcardname = “' or '1=1”;
 list<name> names = mapper.selectlike(wildcardname);
 
 <select id=”selectlike”>
      select * from foo where bar like '%${value}%'
 </select>
 
 
 #假如传递【' or '1=1】,sql就是select * from foo where bar like '%' or '1=1%',能查出所有的数据。
 
4、sql中使用%,sql使用 #{}。可以,但是需要注意选择合适的引号
 string wildcardname = “itheima”;
 list<name> names = mapper.selectlike(wildcardname);
 
 <select id=”selectlike”>
      select * from foo where bar like '%#{value}%'
 </select>
 
 
 #预编译为select * from foo where bar like '%?%'
 #假如传递【itheima】,sql就是select * from foo where bar like '%'itheima'%',会出现sql语法错误。
 
 #但是如下写法没问题
 <select id=”selectlike”>
      select * from foo where bar like "%"#{value}"%"
 </select>
 #预编译为select * from foo where bar like "%"?"%"
 #假如传递【itheima】,sql就是select * from foo where bar like "%"'itheima'"%",不会出现语法错误。
 
5、sql中使用%,sql使用 #{}。配合concat函数,可以。
 string wildcardname = “itheima”;
 list<name> names = mapper.selectlike(wildcardname);
 
 <select id=”selectlike”>
      select * from foo where bar like concat('%',#{wildcardname,jdbcType=VARCHAR},'%')
 </select>
 
 #会预编译为 select * from foo where bar like concat('%',?,'%')
 #赋值之后,sql为select * from foo where bar like concat('%','itheima','%')

9.ssm-说一下spring的AOP?

  1. AOP,也就是面向切面编程;其次还有面向过程和面向对象编程。
  2. Spring AOP实现主要是通过代理类的方式实现,有jdk动态代理和CGLIB代理两种方式。
  3. Java动态代理只能够对接口进行代理,不能对普通的类进行代理(因为所有生成的代理类的父类为Proxy,Java类继承机制不允许多重继承);CGLIB能够代理普通类;
  4. Spring内部,发现如果目标对象没有实现接口,则默认会采用CGLIB代理; 如果目标对象实现了接口,默认会采用Java动态代理;
  5. AOP用到的动态代理是对方法增强的方式之一。
  6. AOP的典型应用就是事务管理 。

简要回答:

  1. Spring AOP有jdk动态代理方式和CGLIB方式。
  2. Spring内部,发现目标对象没有实现接口,则用CGLIB。有接口则用Java动态代理。
  3. AOP的典型应用就是事务管理。

10.使用Spring框架的好处是什么?

  1. 轻量:Spring 是轻量级,无侵入。
  2. 控制反转(IOC):Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
  3. 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
  4. 容器:Spring 包含并管理应用中对象的生命周期和配置。
  5. MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
  6. 事务管理:Spring 提供一个持续的事务管理接口,可以通过配置文件或者注解轻松实现。
  7. 异常处理:Spring提供了全局异常处理功能,只需要声明一个全局异常处理器就可以捕获所有异常信息。

简化记忆:

  1. 轻量
  2. 控制反转 ioc
  3. 面向切面编程 aop
  4. 容器
  5. mvc框架
  6. 事务管理
  7. 异常处理

11.谈谈spring的IOC和DI?

  1. Ioc,控制反转;DI,依赖注入。
  2. Ioc意味着将你设计好的对象交给容器控制(创建,销毁,调用)。
  3. Di是组件之间依赖关系由容器在运行期决定
  4. Ioc和DI其实是一种思想,并不是具体的技术。
  5. IoC 和 DI 有什么关系呢?其实它们是同一个概念的不同角度描述。由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”。相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
  6. 最直接看到的效果就是,少New了几个类,基本看不到New关键字了。
  7. 比如,创建数据库连接上,整个项目创建连接时并不是当需要连接时new一个连接,而是项目在配置的时候创建好连接,当要用的时候,DI会给程序去用,而程序在什么时候用和怎么用时开发者不知道的,但最后还是实现了功能。

简要回答:

  1. Ioc,控制反转;DI,依赖注入。
  2. 基本看不到New关键字了,对象的创建,销毁,调用都交给了Spring容器。
  3. Ioc和Di可以理解为同一个概念,都是一种编程思想。
  • 作者:CZC(关于作者)
  • 发表时间:2024-07-17 12:17
  • 版权声明
  • 评论区:

    留言