一.spring
1.spring AOP与IOC
AOP:面向切面编程。
IOC:控制反转:我们不必关心对象组件的创建细节,仅仅需要告诉IOC我需要哪些组件,IOC容器就会帮我们把组件组装出来。
控制正转:由我们持有对对象的控制权(创建和管理),最常见的就是我们自己new一个对象,这就是控制正转;
控制反转:把对对象的控制权(创建和管理)交给IOC容器,有IOC来为我们创建与管理对象;这就是控制反转。
有了控制反转这个后,我们就可以随时随地让IOC容器为我们创建需要的对象;IOC容器会把创建好的对象Bean发送到需要使用的地方,这就是依赖注入DI。
2.spring的注入方式
- 构造方法注入
- set方法注入
- 注解方式注入
3.spring提供了哪些依赖注入(DI)的方式
依赖注入:
依赖:当前程序依赖于IOC容器,因为现在IOC具有对象的控制权,我们需要它来为我们创建对象或者引入外部资源;
注入:IOC往需要使用的地方注入Bean
- 自动注入(隐式)
@Component:声明组件(声明将此类交给IOC容器管理)
@ComponentScan:组件扫描(把指定路径扫描到的类交给IOC管理)
@Autowired:自动装配
- java注解注入(显式)
自动注入简单易用,但是当我们引入到第三方库时就无法在第三方代码中自动装配,此时可以在建一个相关类的配置 类,并在类前加入@configuration声明这是一个spring的配置类,并在相关方法体中生成需要的bean对象返回,比如我 需要一个ToolClass类对象,这个对象时第三方库的,无法再第三方库插入代码;此时可以建一个toolConfig.java
@Configuration
public class toolConfig{
@Bean
public ToolClass getToolClassBean(){
ToolClass toolClassBean=new ToolClass();
return toolClassBean;
}
}
这样把ToolClass这样的第三方的类对象交由IOC管理;
- xml文件配置(显式)
直接声明Bean:<bean id="", class=""/>
以上三种就是把Bean交由IOC管理方法
4./*与/**的区别
/*匹配某一级所有目录,/**匹配某一级所有目录及其所有子目录
5.spring中未被IOC容器管理的对象怎么获取到IOC中的对象
- 通过applicationContext.getBean("bean名")获取。分析:需要创建一个ApplicationContext应用上下文对象,但是由于不知道容器中的对象有多少个,如果很多,那么构造一个ApplicationContext是非常消耗资源的,因此,此方法一般不推荐。
- 通过WebApplicationContext.getBean()获取,流程是向WebApplicationUtis这个工具类的getWebApplicationContext(ServletContext sc)静态方法传入一个servletContext后返回得到WebApplicationContex。
6.spring中bean的生命周期
7.注解@Param,@RequestParam,@PathParam,@PathVariable的作用
@Param:用在DAO层,用于处理接口到xml的参数传递问题
@RequestParam:同于Controller层,从request里取值,用于处理前端到controller的参数传递问题
@PathParam:从url字符串取值,只能取到url模板字符串里的参数值,不能取到后缀的参数值,是jboss包的一个实现
@PathVariable:功能与@PathParam一样,但是其是spring的一个实现
二.springMVC
1.springMVC工作流程
2.springMVC拦截器与过滤器的区别
- 拦截器是基于反射的,过滤器基于函数回调
- 拦截器不依赖servlet容器;过滤器依赖servlet容器
- 拦截器只能拦截action请求,过滤器可以拦截几乎所有请求(包括静态资源请求)
- 拦截器可以访问action请求的上下文和值栈里的对象,过滤器不能
- 拦截器可以获取IOC容器的各个bean,如在拦截器注入service就可以调用业务;过滤器不行
- 拦截器是被包裹在过滤器之中的
3.
三.mybatis
1.mybatis在xml的查询语句中${}与#{}的区别
${}是值替换,发生在动态sql解析阶段,解析完成就已经是一条完整的sql语句了,相当于使用Statement,有sql注入风险;
#{}变量占位符,传入后形成编译的sql语句,传入的变量在sql语句中形成一个占位符,相当于使用PreparedStatement;
2.mybatis中怎么样获取刚插入数据的自增主键值?
通过JDBC3.0提供的GeneratedKeys方式,实现主键回填
如果是在xml中配置,只需配置useGeneratedKeys="true" keyProperty="对应类的id属性"
<insert id="addRole" keyproperty="roleId" parametertype="Role" usegeneratedkeys="true">
insert into role(role_name) values(#{roleName})
</insert>如果是直接在java代码中,则需要在执行sql时指明
stmt.executeUpdate(
"INSERT INTO autoIncTutorial (dataField) "
+ "values ('Can I Get the Auto Increment Field?')",
Statement.RETURN_GENERATED_KEYS);// 向驱动指明需要自动获取generatedKeys!
四.springBoot
1.springboot相关概念
spring boot是spring开源组织下的后端框架,是spring组件一站式解决方案,主要是简化了使用spring的难度。具体表现为简化了繁重的配置,提供各种启动器,开发者能快速上手,让开发者从繁琐的配置工作中解放出来,让精力更多的集中在业务开发上。
2.springBoot的自动化配置原理
springBoot自动化配置原理在于其核心注解@SpringBootApplication,这是一个组合注解,主要包含了3个注解:@Configuration;@EnableAutoConfiguration;@ComponentScan
- @Configuration:实现配置文件的功能
- @EnableAutoConfiguration:实现自动(打开/关闭)配置的功能
- @ComponentScan:实现spring组件扫描的功能
自动化配置重点是@EnableAutoConfiguration,我们点进去能看到它也是一个组合注解,其重点在于@Import注解,其导入了一个AutoConfigurationImportSelector类对象,具体配置原理我们继续点击这个类进去。
从图上我们可以发现AutoConfigurationImportSelector类提供了一个名为getCandidateConfigurations(译:获取候选配置)的方法,方法里通过SpringFactoriesLoader.loadFactoryNames扫描所有META-INF/spring.factories结构文件的jar包。下面我们看看具有这样结构的包是咋样的。
在这里我们发现具有这种结构的jar包中spring.factories中的内容是其jar包中所包含的类的全限定路径名,总的来看,大部分是一些自动配置类,自动配置类再去加载一些组件。至此我们明白了springBoot的自动化配置原理。
自动化配置原理总结:SpringBoot项目启动时,通过@SpringBootApplication注解下的@EnableAutoConfiguration注解下的@Inport注解,导入一个AutoConfigurationImportSelector类,通过调用该类的getCandidateConfigurations方法,方法内使用SpringFactoriesLoader.loadFactoryNames扫描所有具有META-INF/spring.factories文件结构的jar包,找到这些jar包内spring.factories文件所指出的所有类,并将这些类加载进springIOC容器中,由于文件内大部分是自动配置类xxxAutoConfiguration,所以加载进这些自动配置类后再由这些自动配置类加载相应组件到IOC容器。
3.starter的认识
starter是对依赖的合成封装。将使用某种功能所要用到的依赖jar包封装成一个对应模块的starter jar包,最终目的还是为了简化依赖配置。可以根据自定义starter。
4.在springboot中怎么配置才会使过滤器,监听器生效?
springboot将所有的实例交给Spring IOC容器管理,filter和listener自然也是,如果像写servlet写filter和listene,那么它们是不会生效的,因为不归IOC容器管理,那么我们有以下办法来解决。
- 使用@Component注解把过滤器或者拦截器的类交给IOC管理,@WebFilter(urlPatterns = "/*")表示拦截所有请求
@Component @Order(1) // 执行顺序,多个拦截器指定顺序时使用 @WebFilter(urlPatterns = "/*") public class CodeFilter implements Filter {
- 首先在启动类中,注解@ServletComponentScan指定过滤器或拦截器的路径,完成filter和listener注册,@WebFilter表示拦截的请求
@ServletComponentScan("com.elife.springboot.filter") public class SpringbootApplication { } @WebFilter(urlPatterns = "/*") public class CodeFilter implements Filter { }