Spring框架——从零开始的码字生活
降低依赖、耦合(高内聚低耦合
- 采用接口实现
- 采用容器实现
- 使用服务定位器
- 优点
- 应用服务器定位将查找逻辑分离
- 降低组件在查找方面的复杂性
- 增加组建的重用性
- JDNI(java命名和目录接口
- 已配置好的datasource连接数据库
- 通过服务定位器找到datasource,访问数据库
- 局限性:必须知道怎么找
- 不需要服务器定位
- 组件(Service)集增加接受资源的方法(setter)
- 由容器将组件注入到另一个组件
- 优点:完全面向接口
概念
- Ioc控制反转
- 目的:设计原则,解耦组件之间的依赖关系。降低耦合度
- 好处:
- 从主动获取资源变成 被动接收
- 查找的被动形式
- DI 依赖注入
- 具体的设计模式,体现Ioc设计原则
- DI是Ioc的最典型的实现,不能混用
依赖注入DI
- 接口注入
- setter注入
- 流行最广(可读性好
- 未注入,存在空指针。代码存在安全问题,依赖被修改
- 构造器注入
- 可避免setter注入的些许缺点
- 没有明确的方法名,对参数位置和数量有要求
Bean 由Spring Ioc容器进行实例化、装配和管理的对象
元数据 通过容器使用配置来反应Beans和他们之间的依赖关系
- 基于Xml的配置
- 基于注解的配置
- 基于java的配置
Spring Ioc容器
- Spring容器体现了IoC原理
- Spring容器通过读取配置元数据负责对Beans实例化、配置、装配
- 配置元数据:XML、Java注解、java代码
BeanFactory
- 提供一个先进配置机制,能够管理任何类型的对象
- 负责对Bean对象实例化、装配、生命周期的管理
- 实现:
- XmlBeanFactory
- 需传入一个Resource实例
-
- ClassPathResource
- FileSystemResource
- BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
-
- 从BeanFactory获取Bean实例
- MyBean bean = (MyBean)factory.getBean("myBean");
ApplicationContext
- BeanFactory的一个子接口⭐
- 添加了更多的企业特定的功能
- 更方便的集成Spring的AOP功能
- 消息资源处理
- 事件的发布
- ApplicationContext实现
- ClassPathXmlApplication
- FileSystemXmlApplication
- XmlWebApplicationContext
- AnnotationConfigApplicationContext
BeanFactory和ApplicationContext区别:
- BeanFactory提供了配置框架和基本功能,ApplicationContext添加了更多的企业特定功能
- ApplicationContext是BeanFactory的一个子接口,也是一个完整的超集
- 两者实例化Bean的载入方式不同
- BeanFactory延迟载入所有Bean,直到getBean()方法调用时才被创建
- ApplicationContext启动后载入所有单例Bean,通过预载入单实例Bean,确保当需要时使用
Bean
- Bean的实例化
- 通过构造方法实例化
- 使用静态工厂方法实例化
- factory-method=“静态方法名”
- class=“类名目录”
- 使用实例工厂实例化
- factory-bean=“包含工厂方法的bean名称”
- factory-method=“”(bean工厂方法
- class属性为空
Bean的生命周期
- 实例化
- 设置属性
- 设置Bean名称、Bean工厂、应用上下文
- 初始化前预处理
- 初始化Bean
- 初始化后预处理
- Bean准备好
- 销毁Bean
Bean的初始化和销毁方法
- 实现InitializingBean接口、DisposableBean接口
- 简单、Bean实现和Spring框架耦合
- 在bean配置文件配置init-method、destroy-method方法
- 注解@PostConstruct、@PreDestory
(singleton)单例作用域是针对一个Spring容器一个实例、是Spring中Bean的默认作用域
Spring不管理原型作用域的完整生命周期,只负责初始化、配置、组装。不调用Bean的销毁方法。
依赖注入
- 对象之间的依赖关系
- 创建Bean并注入他所依赖的Bean对象
- Spring中的注入方式:
- 构造器注入
- 有参的构造方法
- 在配置文件内,<constructor-arg name=" " value=" "></constructor>
- type="String"
- index="0"
- name="num1"
- 引用注入 <constructor-arg ref=" "></constructor>
- Setter方法注入
- 需要有set方法
- 配置文件中 name与类中命名一直
- 基本数据类型注入
- <property name=" " value=" ">
- 字符串、数值型数据、布尔类型
- NULL注入
- <property name=" "> <null /> </property>
- 引用数据类型注入
- 引用
- <property name=" " ref=" "/>
- <property name=" "><ref bean=" "/></property>
- 内部Bean
- <property name=" "> <bean class=" "> </property>
- 内部Bean不能重复使用,只能被注入
- 引用
- List类型和数组类型
- <property name=" ">
- <list>
- <ref bean=" "/>
- <value>A</value>
- </list>
- <list>
- </property>
- <property name=" ">
- Set类型(保证每一个元素都是唯一的)
- Map类型
-
<property name=“xxx”>
-
<map>
-
<entry key=“a” value-ref=“aa” />
-
<entry key=“b” value-ref=“bb” />
-
-
-
- 基本数据类型注入
- 构造器注入
-
-
-
-
-
- </map>
- </property>
-
- Properties
- 键值都是字符串类型<props> <prop key="">abc</prop>
-
-
-
高级Bean注入
- Spring容器可以自动装配互相协作Bean的关联关系
- 在配置文件的beans中 default-autowire="byType"
- 自动装备优点:
- 自动装配可以显著的减少指定属性或者构造器参数的需求
- 当对象发生变化时自动装配可以更新配置而不需要修改配置
- 自动装配局限性:
- Property和constructor-arg显示的依赖设置会覆盖自动装配
- 自动装配没有显示编写明确
- 在容器中可能存在多个bean的定义与自动装配的setter方法或者构造方法参数匹配。若bean定义不唯一,装配时会抛异常
- 模板装配(声明父类Bean和子类Bean)
- 指定<bean> 中abstract=“true”
- bean时抽象的,不能实例化
- 可做模板,抽象共同属性
- 指定parent,parent=“?Bean”
- 可继承父Bean属性,和类
- 覆盖继承的属性
- 外部属性文件
- location属性处理单个文件
- 多个属性文件用location属性指定list
- 使用${xx.xx}来获值
- <context:property-placeholder location="XXX.XXX"/>
数据验证和EL。
数据验证不应该被限定在Web层处理
Validator接口:Spring提供Validator接口来进行对对象的验证
- supports(Class) 判断validator是否能校验提供的class实例
- validate(Obeject,org.springframework.validation.Errors) 晓燕给定的对象,有校验失败信息放入Errors对象
SpringEL:Spring表达式语言⭐
- 支持查询和操作运行时对象导航图功能的强大的表达式语言
- 提供额外功能,函数调用、简单字符串的模板函数
- 不直接依赖于Spring,可独立使用
ExpressionParser接口,解析表达字符串
ExpressionParser parser = new SpelExpressionparser();
Expression e = parser.parserExpression(" '字符串' ");
String message = (String)e.getValue();
EL使用: #{<表达式字符串>}⭐
各种框架
JSF-web框架
EJB--分布式企业级框架⭐(消息驱动bean、会话bean、持久化bean)
SSH
Struts
Spring
webwork----Struts2
Hibernate
Spring、SpringMVC、SpringDataJpa
Mybatis
基于XML的配置元数据
value="#{id.name}"
基于注解的配置元数据
@Value("#{memory}")
EL可以使用的场景
- 方法
- EL可以调用一个对象的属性、方法,并将返回值注入给另一个对象的属性
- @Value("#{'tea'.toUpperCase()}")
- 构造
- EL可以调用new关键字,实现构造方法调用,实例化出对象
- @Value("#{new int[]{1,2,3}}")
- 操作符
- EL支持大多数的算数运算符,@Value("#{3+4}")
- 关系运算符 @Value("#{1^1}")
- 逻辑运算符 @Value("#{5>3}")
- 三元运算符 @Value("#{1> 2? 0:1}")
- 集合
- 支持List @Value("#{A.list}")
- Properties
- Map @Value("#{A.map['1']}")
- 集合的选择
- .?[] 设置筛选条件
- @Value("#{A.list.?[li>1]}")
- @Value("#{A.map.?[key=='1']}")
- .^[] 获取第一个匹配项
- .$[] 获取最后一个匹配项
- .?[] 设置筛选条件
- 集合的投影
- .![] 选择特定属性
- @Value("#{A.students.![name]}")
- .![] 选择特定属性
- 选择和投影可以结合使用
代理模式
- 代理模式创建代理对象,让代理对象控制目标对象的访问,并且可以在不改变目标对象的情况下添加一些额外的功能
- 静态代理:
- 代理对象与被代理对象必须实现同一接口,在代理对象中实现日志
- 动态代理:
- InvocationHandler接口,
- 操作代理对象时会执行invoke()方法,
- 使用Proxy.newProxyInstance()静态方法建立一个代理类对象(必须告知要代理的接口
AOP(Aspect-Oriented Programming 面向切面编程)
- 提供一种新的组织程序结构的思路
- 对OOP补充,可OOP一起使用
- OOP核心单位为类、AOP核心单位为切面
- 典型:日志、验证、事务管理
- 优点:
- 便于开发人员集中关注系统的核心业务逻辑
- 利于创建松散的、可复用的、可扩展的软件系统
- 关注点:特定的问题、概念、或成需要达到的目标。
- 横切关注点:一个关注点被多个类或者方法引用
- 切面:一个切面是对一个横切关注点的模块化
- 连接点:程序执行过程中的某个点,方法调用或者抛出异常
- 通知:在特定连接点应执行动作
- 切入点:什么地方植入通知
- 目标对象:被切面所通知的对象
- 织入:将切面应用到目标对象,从而创建新的代理对象
通知类型
- 前置通知(Before advice): 在某连接点之前执行的通知
- 后置通知(After returning advice): 在某连接点正常完成后执行的通知
- 异常通知(After throwing advice): 在方法抛出异常退出时执行的通知
- 最终通知(After finally advice): 当某连接点退出的时候执行的通知
- 环绕通知(Around advice): 包围一个连接点的通知,这是最强大的一种通知类型
AOP实现
- SpringAPI传统方式
- 纯POJO类(Advice不用实现任何接口)
- 基于Schema的XML配置 <aop>
- 基于注解驱动的切面
- (* 包名 .* .*(..)) 过滤器 包 类 方法 方法参数
- 使用AspectJ切面
SpringMVC
SpringMVC是基于请求驱动,围绕一个核心Servlet 转发请求到对应的Controller而设计的
- 客户端发出请求,交给DispatcherServlet处理
- DispatcherServlet根据请求信息及HandlerMapping的配置找到处理请求的处理器(Handler)
- DispatcherServlet通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler
- 处理器完成业务逻辑,返回一个ModelAndVIew给DispatcherServlet,ModelAndView包含视图逻辑名和模型数据信息
- DispatcherServlet借由ViewResolver完成逻辑视图名到真实视图的解析工作
- 得到View真实视图后,DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行渲染
- 最终客户得到响应
DispatcherServlet前端控制器,负责流程控制。继承自httpServlet
使用专门的Bean处理请求和渲染视图,在WebApplicationContext配置
- HandlerMapping:传入请求映射到处理器⭐
- HanderAdapter:将处理器包装成适配器,支持多种处理器
- ViewResolver:视图解析器,将逻辑视图名解析为具体的View⭐
- LocaleResolver&LocaleContextResolver:本地化和国际化
- ThemeResolver:Web主提
- MultipartResolver:文件上传
⭐客户请求经由前端控制器DispatcherServlet后,分发给后续子控制器Controller
注解:
@Controller 表明被注解的类为控制器,
{@ResponseBody 在方法上,表示返回数据。}
@RestController return "x" 返回的是数据
@RequestMapping("/xx") 用于映射URL,写在类、方法级别上
在类上表该控制器中所有方法都是相对于该路径的,两级、多级路径,
@RequestMapping("/a");
@RequestMapping("b");
若类级别无该注解,则每个方法直接映射方法注解上的路径
@RequestMapping("/b");
限制请求类型
@RequestMapping(value="/b",method=Request.GET);
URI模板模式,获取请求参数的值
@RequestMapping(value="method/{id}")
method(@PathVariable int id){}
路径模式
@RequestMapping
/a/b 精确
/a/*/c 一个模糊
/a/**/d 多个模糊
/a/b? 精确模糊
URI模板+Ant风格
/a/*/{b}
矩阵变量
开启:<mvc:annotation-driven enable-matrix-variables="true"/>
a/b/32;c=1;d=2
@RequestMapping(value="/a/b/{id}",method=RequestMethod.GET)
(@PathVariable String id,@MatrixVariable int c,@MatrixVariable int d)
/a/40,m=1/b/20,m=2
@RequestMapping(value="/a/{id}/b/{pd}",method=RequestMethod.GET)
@MatrixVariable(value="m",pathVar="id") int id1,
@MatrixVariable(value="m",pathVar="pd") int id2
@RequestParam将请求参数绑定到方法参数
method(@RequestParam("id") int id)
1.文本、超链接的字
2.拿到的变量
@RequestParam(value="",required=true defaultValue="1")
required请求参数必须传
defaultValue 默认值
@CookieValue
在方法参数里写 @CookieValue("JSESSIONID")String id
@RequestHead("Accept-Encoding") String ad 头信息
@ResponseBody 用在方法上,表示直接将返回数据写在Http响应体里
@GetMapping 处理Get请求
@PostMapping 处理Post请求
拦截器
Spring的Handler映射机制包含了Handler拦截器
使用handler拦截器,可以在某些请求应用特殊的功能,检查权限、防止表单重复提交
必须实现HandlerInterceptor接口
preHandler 在handler执行前调用
postHandler 在handler执行后调用
afterCompletion(..) 在整个请求完成后调用
文件上传
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
视图解析ViewResolver、视图View是Spring处理视图的两个重要接口
ViewResolver提供视图名称和真实视图之间的映射
View真正进行视图渲染,把结果返回给浏览器
InternalResourceViewResolver
是URLBasedViewResolver子类
定义了前缀、后缀、和控制器返回的视图名称拼接,解析为视图对象
将模型数据存放到对应的HttpServletRequest中,转发到相应的页面视图
<bean class="#">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
ResourceBundleViewResolver
是AbstractCachingViewResolver子类
需要配置文件定义逻辑视图名称和真正View对象的对应关系
<bean class="#">
<property name="basename" value="views"/>
<property name="order" value="1"/>
</bean>
test.(class)=org.springframework.web.servlet.view.InternalResourceView
test.url=/test.jsp
BeanNameViewResolver

浙公网安备 33010602011771号