三大框架 之 Spring(IOC控制反转、DI依赖注入)
常用词汇
ORM(Object Relational Mapping)对象到关系的映射
AOP(Aspect Oriented Programming)面向切面编程
aspect
[ˈæspekt]
n.
方面;方向;
oriented
['ɔ:rɪəntɪd]
adj.
面向;定向的;以…为方向的;定方向
Proxy
代理服务器;即Proxy服务器;
cascade
级联;
interceptor
[ˌɪntəˈseptə(r)]
n.
拦截器
template
[ˈtempleɪt]
n.
样板;模板;型板;模框;标准
xmlns
命名空间;名字空间;名称空间
schema
[ˈskiːmə]
n.
提纲
left join与left outer join的区别
那就是没有区别
对,就是没有区别
left join 是left outer join的简写,left join默认是outer属性的。
https://zhidao.baidu.com/question/72568852.html
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。在某些数据库中, LEFT JOIN 也称为 LEFT OUTER JOIN。
Struts2的标签库导入
(1)在JSP页面中使用如下代码来导入Struts2标签库:
pStruts 2的所有标签库都放在/struts-tags这个Uri下面。因此可用如下代码导入:
<%@ taglib prefix=“s” uri=“/struts-tags”%>
(2)使用指定标签:
<s:abc .../>
IOC和DI的概念
- IOC -- Inverse of Control,控制反转,将对象的创建权反转给Spring!!
- DI -- Dependency Injection,依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件中!!
DI和IOC的关系: DI不能单独存在,DI需要在IOC的基础上来完成.
这样做得好处:做到了单一职责,并且提高了复用性,解耦了之后,任你如何实现,使用接口的引用调用的方法,永远不需要改变
Spring
Spring概述
什么是Spring
- Spring是一个开放源代码的设计层面框架
- 他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。
- Spring是于2003 年兴起的一个轻量级的Java 开发框架
- 简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架
spring特点
1.方便解耦,简化开发
- 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。
- 有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2.AOP编程的支持
- 通过Spring提供的AOP功能,方便进行面向切面的编程,
- 许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
3.声明式事务的支持
- 在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来
- 通过声明式方式灵活地进行事务的管理,提高开发效率和质量
4.方便程序的测试
- 可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。
- 例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5.方便集成各种优秀框架
- Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.降低Java EE API的使用难度
- Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等),提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
7.Java 源码是经典学习范例
- Spring的源码设计精妙、结构清晰、匠心独运,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。
- Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
下载
下载地址
IOC
什么IOC
- IOC: Inversion of Control(控制反转)
- 控制反转:将对象的创建权反转给(交给)Spring
传统开发模式
业务和实现类过于紧密,底层业务要修改源代码
通过工厂可以实现,接口与实现业务的分离
在工厂内部使用配置文件加载
使用spring-IOC(需新建applicationContext.xml)
1.添加jar包
2.创建配置文件
通常名称起为applicationContext.xml
<?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">
</beans>
3.添加配置文件
4.测试使用
DI
依赖注入
- 前提必须有IOC的环境
- Spring管理这个类的时候才能将类的依赖的属性值注入(设置)进来
- 依赖注入:给spring管理类当中依赖的属性,通过配置文件进行赋值的过程
传统方式
DI方式
1.实现类当中的属性要提供set方法
2.在配置文件当中配置依赖注入
3.测试
Spring的工厂类
BeanFactory
- 老版本使用方式
- 当调用getBean的时候才会创建实例对象
ApplicationContext
- 新版本使用方式
- 当加载配置文件时候就会创建实例对象
ApplicationContext实现类
ClassPathXmlApplicationContext加载类路径下的配置文件
FileSystemXmlApplicationContext加载文件系统下的配置文件
Bean相关配置
名称与标识
id
使用了约束中的唯一约束。里面不能出现特殊字符的
name
没有使用约束中的唯一约束。里面可以出现特殊字符
设置对象的生命周期方法
init-method
Bean被初始化的时候执行的方法
destroy-method
Bean被销毁的时候执行的方法(Bean是单例创建,工厂关闭)
示例
Bean的作用范围的配置(即scope属性值)
singleton
默认的,Spring会采用单例模式创建这个对象。
使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
prototype
多例模式。
使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
request
应用在web项目中,Spring创建这个类以后,将这个对象存入到request范围中。
该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
session
应用在web项目中,Spring创建这个类以后,将这个对象存入到session范围中
该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
globalsession
应用在web项目中,必须在porlet(基于Java的Web组件,子域名)环境下使用。但是如果没有这种环境,相对于session。
该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。
示例
工厂实例化的方式
无参构造-默认
静态工厂实例化
实例工厂实例化
分模块配置
在加载时,添加多个配置文件名称
在一个配置文件当中引入另一个配置文件
Spring属性注入
构造方法的方式的属性注入
Set方法的属性注入
Set方法设置对象类型的属性
P名称空间的属性注入
使用p名称空间,就不需要写那那么多的property
使用时,要添加名称空间
xmlns:p="http://www.springframework.org/schema/p"
spEL表达式的属性注入
集合类型属性注入
数组
List集合
Set集合
Map集合
IOC注解方式快速入门
在spring4之后,想要使用注解形式,必须得要引入aop的包
在配置文件当中,还得要引入一个context约束
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
配置组件扫描
哪个包下的类型使用组合扫描
在类开始位置上添加注解
使用注解注入属性
- 可以不用提供set方法,直接在直接名上添加@value("值")
- 如果提供了set方法,在set方法上添加@value("值");
IOC注解详解
@Component
修改一个类,将这个类交给Spring管理 相当于在配置文件当中配置
<bean id="" class="">
@Component三个衍生注解
为了更好的进行分层,Spring可以使用其它三个注解,功能类似
目前使用哪一个功能都一样, 后期可能会添加一些属于各自的属性
@Controller
web层
@Service
service层
@Repository
dao层
属性注入
@Value
设置普通属性值
@Autowired
-
设置对象类型的属性值
-
直接使用这种方式,是按照类型完全属性注入
-
不需要在注解上使用id名称
-
习惯是按照名称完成属性注入
必须让@Autowired注解与@Qualifier一起使用
单独使用@Resource
@PostConstruct
初始化方法
@PreDestroy
销毁方法
@scope
作用范围
XML与注解比较
- XML可以适用任何场景 ,结构清晰,维护方便
- 注解不是自己提供的类使用不了,开发简单方便
XML与注解整合开发
- XML管理Bean
- 注解完成属性注入
- 使用过程中, 可以不用扫描,扫描是为了类上的注解
- 在没有扫描的情况下, 使用属性注解@Resource @Value @Autowired @Qulifier
<context:annotation-config/>