0.题目汇总
- Spring的IOC和AOP机制?
- Spring中Autowired和Resouree关键字的区别和联系?
- 依赖注入的方式有几种,各是什么?
- 讲一下什么是Spring?
- Spring框架中都用到了哪些设计模式?
- Spring框架中都用到了哪些设计模式?
1.Spring的IOC和AOP机制?
IOC(Inversion of Control):IOC是控制反转的意思,这是一种面向对象编程的设计思想,可以帮我们维护对象与对象之间的依赖关系,降低对象之间的耦合度。简单来说,就是将原本在程序中自己手动创建对象的控制权,交由 Spring 框架来管理,Spring IOC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。 IOC 容器负责创建对象,将对象连接在一起,配置这些对象,并从创建中处理这些对象的整个生命周期,直到它们被完全销毁。在spring中IOC是通过DI(Dependency Injection)/依赖注入实现的。
AOP(Aspect Oriented Programing)是面向切面编程思想,这种思想是对OOP的补充,它可以在OOP的基础上进一步提高编程的效率。简单来说,它可以统一解决一批组件的共性需求(如权限检查、记录日志、事务管理等)。它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
2.Spring中Autowired和Resouree关键字的区别和联系?
联系
- @Autowired和@Resource注解都是作为bean对象注入的时候使用的
两者都可以声明在字段和setter方法上
- 注意:如果声明在字段上,那么就不需要再写setter方法。但是本质上,该对象还是作为set方法的实参,通过执行set方法注入,只是省略了setter方法罢了
区别
- @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
- @Autowired注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
- @Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错
- 讲一下什么是Spring?
3.依赖注入的方式有几种,各是什么?
构造器注入
将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。
<!-- 第一种根据index参数下标设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
<!-- index指构造方法 , 下标从0开始 -->
<constructor-arg index="0" value="kuangshen2"/>
</bean>
<!-- 第二种根据参数名字设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
<!-- name指参数名 -->
<constructor-arg name="name" value="kuangshen2"/>
</bean>
<!-- 第三种根据参数类型设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
<constructor-arg type="java.lang.String" value="kuangshen2"/>
</bean>
setter方法注入
通过调用成员变量提供的setter函数将被依赖对象注入给依赖类。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="address" class="com.hui.pojo.Address">
<property name="address" value="背景"/>
</bean>
<!-- 依赖注入之set注入 -->
<bean id="student" class="com.hui.pojo.Student">
<!--1. 普通值注入,value-->
<property name="name" value="李家辉"/>
<!--2. bean注入,ref-->
<property name="address" ref="address"/>
<!--3. 数组注入,array-value -->
<property name="books">
<array>
<value>李</value>
<value>家</value>
<value>辉</value>
</array>
</property>
<!--list注入,list-value -->
<property name="hobbys">
<list>
<value>语文</value>
<value>数学</value>
<value>英语</value>
</list>
</property>
<!--Map注入,map-entry-key-value -->
<property name="card">
<map>
<entry key="身份证" value="123"/>
<entry key="银行卡" value="456"/>
</map>
</property>
<!--Set注入,set-value -->
<property name="games">
<set>
<value>IOC</value>
<value>DI</value>
</set>
</property>
<!--null注入-->
<property name="wife">
<null/>
</property>
<!---->
<property name="info">
<props>
<prop key="学号">2019</prop>
<prop key="username">男</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
</beans>
c命名空间与p命名空间
p命名空间就是对应setter注入(property);c命名空间就是对应构造方法注入(constructor-arg)。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--p命名空间注入,可以直接注入属性的值:property。p命名空间注入就是对应set注入的属性注入-->
<!--需要导入约束 xmlns:p="http://www.springframework.org/schema/p" -->
<bean id="user" class="com.hui.pojo.User" p:name="李家辉" p:age="22"/>
<!--c命名空间注入,对应所有的构造器注入,constructor-arg -->
<!--需要导入约束 xmlns:c="http://www.springframework.org/schema/c" -->
<bean id="user1" class="com.hui.pojo.User" c:name="李家毅" c:age="22"/>
</beans>
autowire byName (按名称自动装配)
<bean id="user" class="com.kuang.pojo.User" autowire="byName">
<property name="str" value="qinjiang"/>
</bean>
autowire byType (按类型自动装配)
<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User" autowire="byType">
<property name="str" value="qinjiang"/>
</bean>
使用注解实现自动装配
@Autowired+@Qualifier
- @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
- @Qualifier不能单独使用。
@Resource
- @Resource如有指定的name属性,先按该属性进行byName方式查找装配;
- 其次再进行默认的byName方式进行装配;
- 如果以上都不成功,则按byType的方式自动装配。
- 都不成功,则报异常。
4.讲一下什么是Spring?
Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,
目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。简单来说,它是一个容器框架,用来装 javabean(java对象),中间层框架(万能胶)可以起一个连接作用,可以把各种技术粘合在一起运用。
主要由以下几个模块组成:
Spring Core:SpringCore模块是Spring的核心容器,它实现了IOC模式,提供了Spring框架的基础功能。此模块中包含的BeanFactory类是Spring的核心类,负责JavaBean的配置与管理。它采用Factory模式实现了IOC即依赖注入。
Spring AOP:Spring在它的AOP模块中提供了对面向切面编程的丰富支持,Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中,可以自定义拦截器、切点、日志等操作
Spring DAO:提供了一个JDBC的抽象层和异常层次结构,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析, 用于简化JDBC
Spring ORM:对现有的ORM框架的支持;
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
Spring MVC:提供面向Web应用的Model-View-Controller实现。
5.解释Spring支持的几种bean的作用域。
类型 | 说明 |
---|---|
singleton | 在Spring容器中仅存在一个实例,即Bean以单例的形式存在。 |
prototype | 每次调用getBean()时,都会执行new操作,返回一个新的实例。 |
request | 每次HTTP请求都会创建一个新的Bean。 |
session | 同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。 |
globalSession | 同一个全局的Session共享一个Bean,一般用于Portlet环境 |
6.Spring框架中都用到了哪些设计模式?
- 工厂模式:ApplicationContext类使用工厂模式创建Bean对象
- 单例模式:Spring中的Bean的作用域默认就是单例Singleton的
- 原型模式:在 spring 中用到的原型模式有: scope="prototype" ,每次获取的是通过克隆生成的新实例,对其进行修改时对原有实例对象不造成任何影响。
- 代理模式:Spring AOP基于动态代理实现的
- 模板模式:Spring中以Template结尾的类,比如jdbcTemplate、SqlSessionTemplate等,都是使用了模板方法模式
- 装饰器模式(动态地给对象添加一些额外的属性或者行为 和继承相比,装饰器模式更加灵活):Spring中配置DataSource时 ,DataSource可以是不同的数据库和数据源.为了在少修改原有类的代码下动态切换不同的数据源,这时就用到了装饰器模式
- 责任链模式:DispatcherServlet 中的 doDispatch() 方法中获取与请求匹配的处理器
HandlerExecutionChain,this.getHandler() 方法的处理使用到了责任链模式。 - 观察者模式:Spring 中的 Event 和 Listener
7.什么是MVC?
MVC是一种架构模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。Model代表的是数据,View代表的是用户界面,Controller代表的是数据的处理逻辑,它是Model和View这两层的桥梁。将软件分层的好处是,可以将对象之间的耦合度降低,便于代码的维护。
8.谈谈对 Spring MVC 的理解
Spring MVC 是一款很优秀的 MVC 框架。可以让我们的开发更简洁,而且它和 Spring 是无缝集成,是 Spring 的一个子模块,是我们上面提到 Spring 大家族中 Web 模块。
Spring MVC 框架主要由 DispatcherServlet 、处理器映射、处理器(控制器)、视图解析器、视图组成。
Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。
springMVC执行流程
9.SpringMVC怎么样设定重定向和转发的?
Spring MVC 请求方式分为转发、重定向 2 种,分别使用 forward 和 redirect 关键字在 controller 层进行处理。
重定向是将用户从当前处理请求定向到另一个视图(例如 JSP)或处理请求,以前的请求(request)中存放的信息全部失效,并进入一个新的 request 作用域;
转发是将用户对当前处理的请求转发给另一个视图或处理请求,以前的 request 中存放的信息不会失效。
转发是服务器行为,重定向是客户端行为。
1)转发过程
客户浏览器发送 http 请求,Web 服务器接受此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户;在这里转发的路径必须是同一个 Web 容器下的 URL,其不能转向到其他的 Web 路径上,中间传递的是自己的容器内的 request。在客户浏览器的地址栏中显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
2)重定向过程
客户浏览器发送 http 请求,Web 服务器接受后发送 302 状态码响应及对应新的 location 给客户浏览器,客户浏览器发现是 302 响应,则自动再发送一个新的 http 请求,请求 URL 是新的 location 地址,服务器根据此请求寻找资源并发送给客户。在这里 location 可以重定向到任意 URL,既然是浏览器重新发出了请求,那么就没有什么 request 传递的概念了。在客户浏览器的地址栏中显示的是其重定向的路径,客户可以观察到地址的变化。重定向行为是浏览器做了至少两次的访问请求。
在 Spring MVC 框架中,重定向与转发的示例代码如下:
@RequestMapping(“/login”)
public String login() {
//转发到一个请求方法(同一个控制器类可以省略/index/)
return “forward:/index/isLogin”;
}
@RequestMapping(“/isLogin”)
public String isLogin() {
//重定向到一个请求方法
return “redirect:/index/isRegister”;
}
在 Spring MVC 框架中,控制器类中处理方法的 return 语句默认就是转发实现,只不过实现的是转发到视图。
@RequestMapping(“/register”)
public String register() {
return “register”; //转发到register.jsp
}
10.SpringMVC常用的注解有哪些?
组件型注解:
作用:被注解的类将被spring初始话为一个bean,然后统一管理。
- @Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。
- @Repository 对Dao实现类进行注解 (特殊的@Component)
- @Service 用于对业务逻辑层进行注解, (特殊的@Component)
- @Controller 用于控制层注解 , (特殊的@Component)
==待完成==
评论 (0)