通过 setter 方法 注入
通过 构造方法 注入
通过 接口 注入
二、简述Spring中如何基于注解配置Bean和装配Bean?(1). 首先要在Spring中配置开启基于注解的组件扫描
ExcludeInclude(2). 在具体的类上加上具体的注解.@Controller、@Service、@Repository、@Component
(3). Spring 中通常使用@Autowired 或者是@Resource 等注解进行bean的装配.
三、说出Spring 或者 Springmvc中常用的5个注解,并解释含义?[1]. @Component 基本注解,标识一个受Spring管理的组件
[2]. @Controller 标识为一个表示层的组件
[3]. @Service 标识为一个业务层的组件
[4]. @Repository 标识为一个持久层的组件
[5]. @Autowired 自动装配
[6]. @Qualifier(“”) 具体指定要装配的组件的id值
[7]. @RequestMapping() 完成请求映射
[8]. @PathVariable 映射请求URL中占位符到请求处理方法的形参
@CookieValue , @RequestParm , @ResponseBody , @RequestBody , @RestController
@Transactional @Before , @AfterReturning , @After , @AfterThrowing , @PointCut…
四、请解释Spring Bean的生命周期?1. 默认情况下,IOC容器中bean的生命周期分为五个阶段:
调用构造器 或者是通过工厂的方式创建Bean对象给bean对象的属性注入值 调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.使用IOC容器关闭时, 销毁Bean对象. Destroy-method2. 当加入了Bean的后置处理器后,IOC容器中bean的生命周期分为七个阶段:
① 调用构造器 或者是通过工厂的方式创建Bean对象
② 给bean对象的属性注入值
③ 执行Bean后置处理器中的 postProcessBeforeInitialization
调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的. 执行Bean的后置处理器中 postProcessAfterInitialization 使用 IOC容器关闭时, 销毁Bean对象另外,bean默认是单例的。在IOC容器启动时,单例的这些实例会被创建。
我们可以使用scope=prototype来设置对象是多例的。多例的实例不会随着容器的创建而实例化。仅仅是在需要的时候才会创建。
五、Springmvc中如何解决POST请求中文乱码问题?Springmvc中通过CharacterEncodingFilter解决中文乱码问题. 需要注意的是这个过滤器一定要放在所有过滤器之前。这样保证request.setCharacterEncoding()先执行。
在web.xml中加入:
CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 CharacterEncodingFilter /* 六、MyBatis中 #{}和${}的区别是什么?#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
在某些情况下,我们只能使用${},例如: select * from ${tablename} , selet…from t_book order by ${columnName}
七、Mybatis 结果集的映射方式有几种,并分别解释每种映射方式如何使用?① 自动映射:通过resultType来指定要映射的类型即可。
② 自定义映射:通过resultMap来完成具体的映射规则,指定将结果集中的哪个列映射到对象的哪个属性。
八、简述MyBatis的单个参数、多个参数如何传递及如何取值?MyBatis传递单个参数,如果是普通类型(String+8个基本)的,取值时在#{}中可以任意指定,如果是对象类型的,则在#{}中使用对象的属性名来取值
MyBatis传递多个参数,默认情况下,MyBatis会对多个参数进行封装Map. 取值时在#{}可以使用arg0 arg1 arg2 .. 或者是param1 param2..
MyBatis传递多个参数,建议使用命名参数,在Mapper接口的方法的形参前面使用@Param() 来指定封装Map时用的key. 取值时在#{}中使用@Param指定的key
九、简述Mybatis的动态SQL,列出常用的6个标签及作用?动态SQL是MyBatis的强大特性之一 基于功能强大的OGNL表达式。
动态SQL主要是来解决查询条件不确定的情况,在程序运行期间,根据提交的条件动态的完成查询
常用的标签:
: 进行条件的判断
:在判断后的SQL语句前面添加WHERE关键字,并处理SQL语句开始位置的AND 或者OR的问题
:可以在SQL语句前后进行添加指定字符 或者去掉指定字符.
: 主要用于修改操作时出现的逗号问题
:类似于java中的switch语句.在所有的条件中选择其一
:迭代操作
十、简述Spring中自动装配常用的两种装配模式?byName: 根据bean对象的属性名 进行装配
byType: 根据bean对象的属性的类型进行装配,需要注意匹配到多个兼容类型的bean对象时,会抛出异常.
十一、 简述动态代理的原理, 常用的动态代理的实现方式动态代理的原理: 使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。通过多态,父类类型指向子类对象,通过父类类型调用目标方法,实际上调用的是代理对象中的代理方法。从而达到增强原始目标方法功能的目的。
动态代理的方式:
基于接口实现动态代理: JDK动态代理
基于字节码编辑技术实现动态代理: Cglib、Javassist动态代理
CGLIB和JDK代理的比较:
性能上的比较:CGLIB创建代理对象的性能较差,调用代理方法的性能较高。JDK正好相反。因此,两者的适用场合不同:CGLIB适合于反复调用代理方法的场景。JDK适用于频繁创建代理对象的场景。只不过,目前JDK版本的发展,创建和调用代理方法的性能都得到了大幅度提升。因此,目前框架中也会优先考虑JDK代理(早期默认就是采取CGLIB代理)语法上的比较:CGLIB代理要求目标类不能被final修饰,也就意味着可被继承。因此CGLIB产生的代理对象是目标对象的子类。而JDK要求目标类必须要有父接口,因为JDK产生的代理对象是接口的实现类,是目标类的兄弟,这两者之间是没有继承关系的。在spring中AOP的底层就是使用的动态代理技术。换句话说,spring的AOP是对两种代理技术的封装,这样的话,程序员没有必要去接触原生的代理API代码。在spring的AOP中,目标对象称之为Target、目标对象中有目标方法。增强称之为Advice。增强又分为前置、后置返回、后置抛异常、后置和环绕。将增强操作追加到目标方法上的这个动作我们称之为织入(weave)。那么在哪些类的哪些方法上织入增强呢?我们称之为切入点(pointcut)。在一个方法的某一个连接点(joinpoint)上织入,这样的连接点会形成一个面,我们称之为切面(Aspect)。在springAOP中,底层使用哪一种代理技术,我们也有一个标签属性或者注解属性:proxy-target- class用来决策使用何种代理技术。十二、请解释@Autowired注解的工作机制及required属性的作用 首先会使用byType的方式进行自动装配,如果能找到并唯一,则装配成功。如果匹配到多个兼容类型的bean, 还会尝试使用byName的方式进行唯一确定.如果能唯一确定,则装配成功,如果不能唯一确定,则装配失败,抛出异常.
当根据类型自动装配失败。根据名字又没有找到符合的。此时我们可以通过@qualifier来寻找指定名称的bean实例进行装配。如果@autowire注解中的required=false,表示能装就装。一般不设置,必须要装配。 十三、简述Springmvc中ContextLoaderListener的作用以及实现原理 语法:ContextLoaderListener实现了ServletContextListener接口。那么这个接口有两个方法,分别用于监听上下文对象的初始化和销毁的过程。那么此处我们关心的是初始化的过程。在tomcat启动时,servlet上下文对象被创建,那么ServletContextListener能够监听到上下文对象初始化的过程,此时contextInitialized方法被执行。那么我们会在这个方法中创建IOC容器(bean实例的创建,bean之间依赖关系的注入)当IOC容器准备好之后,ContextLoaderListener会将IOC容器保存在application作用域,从而方便后面的获取。
从分工上:SSM整合中,IOC容器有两个,一个是spring的IOC,一个是springmvc的IOC。前者是父容器,后者是子容器。子容器只维护springmvc相关的组件:控制器、异常映射器、视图解析器、国际化解析器。父容器维护除了springmvc中这些组件之外的所有的bean实例。包含数据访问层组件、业务逻辑层组件、消息(MQ)中间件等ContextLoaderListener只负责加载springIOC容器。而springmvc的IOC容器是由中央控制器中去处理的。我们知道在javaee规范中,listener是先执行的,servlet默认是访问时才会去执行的。因此中央控制器DispatcherServlet中配置了从而提前它的创建过程。但是再怎么提前,也在listener之后。因此,先创建spring的IOC容器,然后才会去创建springmvc的IOC容器。在DispatcherServlet中,首先寻找根容器(其实就是spring的IOC容器),如果能够找到,则通过setParent进行设置他们之间的父子关系。 十四、简述Mybatis提供的两级缓存,以及缓存的查找顺序 MyBatis中分为一级缓存(SqlSession级别)和二级缓存(SqlSessionFactory级别)。一级缓存默认是开启的。一级缓存在何种情况下失效:两次查询条件不同;两次查询之间有增删改操作二级缓存默认是不开启的,我们通过开启二级缓存。开启的是mybatis自带的二级缓存。实际开发时,也会使用第三方缓存中间件,例如Ehcache。查询出的对象何时存入二级缓存呢?必须是sqlSession关闭之后,那么查询出的对象才会存入二级缓存。(第一个sqlSession关闭之后,第二个sqlSession去查询就不会发出SQL语句了)缓存的查找顺序:先查找二级缓存,如果没有命中,查找一级缓存,如果还没有命中,则查询数据库。 十五、简述Spring与Springmvc整合时,如何解决bean被创建两次的问题两种解决方法:
配置扫描的包路径不同:Springmvc扫描:com.atguigu.book.controller .
spring扫描: com.atguigu.book.service,com.atguigu.book.mapper,….可以同时添加多个扫描的包路径
2. 配合使用exclude-filter和include-filter
十六、简述Spring