Spring基础、IOC、SpringMVC
前言
Spring基础、IOC、SpringMVC
博客地址:芒果橙的个人博客 【http://mangocheng.com】
一、常见问题
1. 基础信息
-
描述:轻量级开发框架,旨在提高开发效率及系统的可维护性。
-
模块:核心容器、数据访问/集成、Web、AOP、工具、消息、测试模块
-
特征
- 核心技术:DI、AOP、events、资源…
- 数据访问
2. RestController vs Controller
-
返回
-
Controller 返回一个页面(不加@ResponseBody)
-
RestController 返回对象:JSON或XML数据,对象数据直接写入HTTP响应,属于RESTful Web服务(前后端分离)
-
3. Spring IoC & AOP
- IoC:Inverse of Control ,控制反转。[依赖倒置原则][https://www.zhihu.com/question/23277575/answer/169698662]
- 一种设计思想,将原本在程序中手动创建对象的控制权交由Spring框架来管理。IoC容器是Spring用来实现IOC的载体,Map结构。
- 类似工厂,当需要创建一个对象时,只需配置好配置文件/注解即可
- 实现方式
- DI
- AOP:Aspect Oriented Programming,面向切面编程。
- 将与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低耦合度,提高可拓展性和可维护性。
- 基于动态代理
- JNDI:Java Naming and Directory Interface,Java命名和目录接口)
- SUN公司提供的一种标准的Java命名系统接口
- JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。
4. Spring单例与线程安全
-
@Component和@Bean
- @Component 作用于类,@Bean作用于方法
-
将一个类声明为Spring的bean的注解
- @Component:通用
- @Repository:持久层,DAO
- @Service:服务层
- @Controller:Spring MVC控制层
-
在类中注入属性对象的注解
- Autowired
- Resource
- Qualifier
5. Spring MVC
- Model1时代:JSP为主体
- Model2时代:Java Bean(Model)+JSP(View)+Servlet(Controller)–JavaWeb MVC
- Spring MVC:对客户端的请求通过后端分层调用方式,将视图数据返回客户端
- 浏览器发送请求到后端DispatcherServlet,由Servlet找到对应的Handler类(控制层)
- Handler类调用处理器处理相应逻辑,返回ModelAndView(模型视图对象)
- ViewResolver(视图解析器)找到View,DisapterServlet将Model传给View,并返回给浏览器进行渲染
二、IOC
获得依赖对象的过程被反转了
1.DI:dependency Injection(依赖注入)
- 描述:由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。即将实例变量传入到一个对象中去。
- 理解
- 找IOC容器==>容器返回对象==>使用对象
- 房屋中介(找中介==>中介介绍房子==>租房入住)
2.Bean配置
-
描述:在Spring中,每一个对象都是一个bean
-
使用方式
-
注解
-
xml配置
<!-- 设值注入 --> <bean id="userService" class="com.mango.service.UserService" > <property name="userDAO" ref="userDAO"></property> </bean> <!-- 构造注入 --> <bean id="userService" class="com.mango.service.UserService" > <constructor-arg name="userDAO" ref="userDAO"></constructor-arg> </bean> <bean id="userDAO" class="com.mango.dao.UserDAO"></bean>
public class UserServiceImpl implements UserService{ private UserDAO userDAO; // 构造注入 public UserServiceImpl(UserDAO userDAO){ this.userDAO = userDAO; } // 设值注入 public void setUserDAO(UserDAO userDAO){ this.userDAO = userDAO; } }
-
-
配置项
- Id
- Class
- scope
- …
-
作用域
-
singleton:单例,指一个Bean容器中只能存在一份,默认
-
prototype:每次请求(每次使用)创建新的实例,destroy方式不生效
-
request:每次http请求创建一个实例且仅在当前request内有效
-
session:同上,每次http请求创建,当前session内有效
-
global session:基于portlet的web中有效,如果在web中,同session
-