Spring 是一个开源轻量级框架, 用于替代 EJB。核心的主要部分:
(1) IOC: 控制反转,让 spring 来创建和管理对象而不需要new
(2) AOP: 面向切面,扩展功能不用修改源代码实现
Spring 框架为 j2ee 全家桶提供一站式解决方案:
在 web 层中有: spring MVC
在 service 层中有: spring 的 IOC
在 dao 层中有: spring 的 jdbc Template
IOC 作用: 把对象的创建交给spring管理。
IOC 和 DI 的区别:
IOC:控制反转,把对象创建交给 Spring 进行配置(创建对象)
DI: 依赖注入向类里面的属性设置值 ( 操作对象的属性)
关系:依赖注入不能单独存在,需要在 IOC 基础之上完成操作
dom4j 解析 xml
工厂设计模式
反射
IOC 的配置文件方式
IOC 的注解方式
核心四个 jar 包
支持日志输出的 jar 包
3.2 创建创建 Spring 配置文件,配置创建类:
Spring 核心配置文件的名称和位置可随意,建议放到 src 下面,官方建议名称:applicationContext.xml;
引入schema 约束;
配置对象的创建;
写代码测试对象的创建:
加载 Spring 配置文件, 根据创建对象:
ApplicationContext context = new ClassPathXmlApplicationContext("xdx.xml");得到配置创建的对象:
context.getBean("xdx");
Spring 整合 web 项目原理:
在合适的地方加载 Spring 核心配置文件;
实现思想:在服务器启动时完成加载 文件和创建对象的过程;
实现原理(Spring 已封装好):
1、在服务器启动的时候,为每个项目创建一个ServletContext 对象;
2、在ServletContext 对象创建的时候 ,使用监听器可以具体 到ServletContext 对象有什么时候创建;
3、当监听器监听 到 ServletContext 对象创建的时候 ,加载 Spring 配置文件并根据配置文件创建对象,再把创建出来的对象放进 ServletContext 域中;
4、到 ServletContext 获取相关对象;
Bean 实例化的三种方式:
1、使用类的无参构造创建【重点】
2、使用静态工厂方法创建
3、使用实例工厂创建
Bean 标签常用属性:
1、id 属性:起名称, 根据id值得到配置对象, 不可包含特殊符号
2、class 属性: 创建对象所在类的全路径
3、name 属性: 根据 id 是一样的,现在少用, 可包含特殊符号
4、scope 属性: bean作用范围, 单例 singleton、多例 prototype、请求 request、会话 session、全局会话
Bean 属性注入方式 (Spring支持前两种)1、使用 set 方法注入【重点】: 标签
2、构造方法: 标签
3、使用接口注入
4、注入复杂类型:数组、list 集合、map 集合、properties 类型
什么是注解:代码里的特殊标记
怎么写注解: @注解名称(属性名称=属性值)
哪里可以用注解: 类、方法、属性
Spring 注解开发的步骤:
1、导入相关 jar 包
2、创建类和方法
3、创建 Spring 配置文件,引入约束
4、加入开启注解扫描标签
1、在创建对象的类上面加个注解 @Component(value = "xdx") value 可省略。
2、创建对象有四个注解:
@Component
@Controller 建议在 Web 层使用
@Service 建议在业务层使用
@Repository 建议在 Dao 层使用
目前这四个注解的功能是一样,随便用,后续版本可能会对其增强。在开发时为了清晰,建议在相应的层选择对应的注解名称。创建对象时控制是单例还是多例的注解 @Scope
3、注解注入属性举例:
使用注解注入属性不需要 set 方法,非常方便。
创建 service 类,创建 dao 类,并加上相应注解。
service 类里加上@Autowired,也可以用@Resource(name = "xdx")注解来代替@Autowired, 用@Resoure 要指定 name 属性。
4、注解和配置文件混合使用:
创建对象使用配置文件方式,而不是加@Component这些注解了。
注入属性操作时用注解实现 ,用@Resoure(name = "")
AOP 即面向切面(方面)编程,扩展功能不通过修改源代码来实现,它使用了横向的抽取机制,取代了传统通过纵向继承来扩展功能时产生的重复性代码,AOP 本身对性能有一定影响。
2 底层原理动态代理方式:
有接口的情况: 使用动态代理方式,创建接口实现代理对象 jdk 动态代理。
无接口的情况: 创建某个类的子类的代码对象 cglib 动态代理。
AOP 的常用操作和相关术语:
1、Joinpoint (连接点) : 指我们要对哪些连接点进行拦截定义,比如: 类里的哪些方法可以被增强,这些方法就叫做连接点。
2、Pointcut (切入点): 在类里面可以有很多方法被增强,但实际中只增强了部分方法,这些被增强了的方法就叫切入点。
3、Advice (通知/增强): 增强的那些逻辑就称为增强,比如扩展日志功能,这个日志功能就称为增强。
通知/增强类型有:
a. 前置通知: 在方法之前执行
c. 后置通知: 在方法之后执行
d. 环绕通知: 在方法之前和之后执行
e. 异常通知: 方法出现异常时执行
f. 最终通知: 在后置通知之后执行
4、AspectJ (切面): 把增强应用到具体的方法上面, 这个过程就叫做切面。
总结: 概念坑人,切面是一个动词并不是名词; Advice 指增强的逻辑,注意是逻辑; 切入点就是增强后的方法(连接点)。
4 AOP 操作在 Spring 里面进行aop操作,使用 AspectJ 实现:
a. AspectJ 是一个面向切面的框架, 它扩展了 java 语言。AspectJ 定义了 Aop 语法,所以它有一个编译器来生成字节码规范的 class 文件。
b. AspectJ 不是 Spring 的一部分,和 Spring 一起进行 Aop 操作。
c. Spring从2.0以后增加了对 AspectJ 的支持。
d. 使用 AspectJ 实例 AOP 有两种实现方式:基于 AspectJ 的xml配置文件方式;基于AspectJ 的注解方式。
基于 AspectJ 的xml配置文件方式步骤:
Aop 操作准备: 基本 Jar 包,和 Aop 相关 Jar 包
创建 Spring 核心配置文件, 导入 Aop 约束
创建 Bean
配置 Aop aop:config 先配置切入点,再配置切面
使用表达式配置切入点,实际增强的方法:
execution (?)
举例: execution(* 全限定类名.方法名()) 方法名可以用通配符,全部或者通配部分方法都可以。
使用注解实现 AOP 操作(简单):
创建 Bean
开启 Aop
增强类上面使用注解来完成,Aop操作方法上加注解, 如:
注意如果只用包名, 最后必须有两点。
五、Spring 核心之 AOPSpring 配置连接池使用 Jdbc Template:
"jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">"dataSource" ref="dataSource" />
"dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">"driverClassName" value="com.mysql.jdbc.Driver" />"url" value="jdbc:mysql://localhost:3306/test" />"username" value="root" />"password" value="root" />
Dao 使用 Jdbc Template:
@Resource
private JdbcTemplate jdbcTemplate
六、Spring 事务管理 1 事务什么是事务:###
事务特性:原子性、一致性、隔离性、持久性
不考虑隔离性产生读问题: 脏读、不可重复读、幻读
解决读问题:设置隔离级别
Spring 事务管理两种方式:
1、编程式事务管理(不用)
2、声明式事务管理
基于 xml 配置文件实现:
1、首先配置事务管理器
2、配置事务增强
3、配置切面
基于注解方式实现:
1、首先配置事务管理器, 不同的 ORM 框架用的事务不同
"transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> name="dataSource" ref="dataSource" />
2、配置事务注解
transaction-manager="transactionManager"/>
3、在要使用事务的方法所在的类上面添加注解,以下是示例,出现异常时回滚
@Transactional(rollbackForClassName = "Exception")
3
Spring 事务的隔离级别
![fd15f8f782bbb2d1a309727cb882c70e.gif](https://i-blog.csdnimg.cn/blog_migrate/96523d6635dea0636f1289d9bb445394.gif)
![fd15f8f782bbb2d1a309727cb882c70e.gif](https://i-blog.csdnimg.cn/blog_migrate/96523d6635dea0636f1289d9bb445394.gif)
极光(Aurora Mobile,纳斯达克股票代码:JG)成立于2011年,是中国领先的开发者服务提供商。极光专注于为移动应用开发者提供稳定高效的消息推送、即时通讯、统计分析、极光分享、短信、一键认证、深度链接等开发者服务。截止到2019年12月份,极光已经为超过50万移动开发者和145.2万款移动应用提供服务,其开发工具包(SDK)安装量累计336亿,月度独立活跃设备13.6亿部。同时,极光持续赋能开发者和传统行业客户,推出精准营销、金融风控、市场洞察、商业地理服务产品,致力于为社会和各行各业提高运营效率,优化决策制定。