Spring的优点
1.Spring是一个轻量级的,非侵入式的框架
2.两个核心内容:控制反转(IOC)和面向切面(AOP)
3.支持事务的处理,对框架整合的支持
Spring总结:Spring就是一个轻量级的控制反转和面向切面的框架,是一个开源的轻量级的一站式框架
IOC本质:
控制反转是一种设计思想,DI(依赖注入)是实现IOC的一种方法,就是将对象的创建权交给spring容器去做,其实现的方法是依赖注入。
IOC创建对象的方式:
1.构造方法的注入
2.Set方式注入【重点】
- 依赖注入:Set注入
- 依赖:bean对象的创建依赖于容器!
- 注入:bean对象中的所有属性,由容器来注入!
3.p名称空间的注入
注入对象类型的属性:
private Car2 car2;
注入数组类型:
总结:在配置文件加载的时候 ,容器中管理的对象就已经初始化了!
Spring的配置:
Bean的配置:
import的使用:
这个import。一般用于团队开发使用,它可以将多个配置文件,导入合并为一个。
假设,现在项目中有多个人开发,这三个人负责不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的!
使用的时候直接使用总配置就可以了
Bean的作用域
Bean的自动装配
1.自动装配是Spring满足bean依赖的一种方式
2.Spring会在上下文中自动寻找,并自动给bean装配属性
在Spring中有三种装配的方式:
1.在xml中显示的配置
2.在Java中显示配置
3.隐式的自动装配bean
使用注解开发
<!--spring的ioc的注解入门-->
<!--使用IOc的注解开发,配置扫描(那些包下的类要使用Ioc的注解)-->
<!--开启了Ioc的注解--> <!--扫描是为了扫描类上的注解@component-->
<!-- <context:component-scan base-package="com.qy.springdemo1"/>
<context:component-scan base-package="com.qy.springdemo2"/>-->
<!--<context:component-scan base-package="com.qy"/>-->
<!--在没有扫描的情况下,使用属性注入的注解-->
<context:annotation-config/>
spring配置注解context:annotation-config和context:component-scan区别
假如我们要使用如@Component、@Controller、@Service等这些注解,使用能否激活这些注解呢?
答案:单纯使用< context:annotation-config/>对上面这些注解无效,不能激活!
(1)< context:annotation-config />:仅能够在已经在已经注册过的bean上面起作用。对于没有在spring容器中注册的bean,它并不能执行任何操作。
(2)< context:component-scan base-package="XX.XX"/> :除了具有上面的功能之外,还具有自动将带有@component,@service,@Repository等注解的对象注册到spring容器中的功能。
思考2:如果同时使用这两个配置会不会出现重复注入的情况呢?
答案:因为< context:annotation-config />和 < context:component-scan>同时存在的时候,前者会被忽略。如@autowire,@resource等注入注解只会被注入一次!
@component有几个衍生注解:
1、@controller: controller控制器层(注入服务)
2、@service : service服务层(注入dao)
3、@repository : dao持久层(实现dao访问)
自动装配
小结:
@Resource和@Autowired的区别:
都是用来自动装配的,都可以放在属性字段上
@Autowired通过byType的方式实现,而且必须要求这个对象存在!【常用】
@Resource默认通过byName的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错!【常用】
执行顺序不同:@Autowired通过byType的方式实现。
xml与注解最佳实践:
xml用来管理bean;
注解只负责完成属性的注入;
我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持
代理模式
代理模式的分类:
1.静态代理
2.动态代理AOP
- 动态代理和静态代理角色一样
- 动态代理的代理类是动态生成的,不是我们直接写好的!
- 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
- 基于接口 — JDK动态代理【我们在这里使用】
- 基于类:cglib
什么是AOP
Aop即面向切面,使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP在Spring中的作用
提供声明式事务;允许用户自定义切面
横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志,安全,缓存,事务等等…
切面(ASPECT):横切关注点被模块化的特殊对象。即,它是一个类。
通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。
目标(Target):被通知对象。
代理(Proxy):向目标对象应用通知之后创建的对象。
切入点(PointCut):切面通知执行的“地点”的定义。
连接点(JointPoint):与切入点匹配的执行点。
SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:
前置通知: 方法之前
环绕通知 方法前后
异常抛出通知 方法抛出异常
后置通知: 方法之后
最终通知 方法最后
即AOP在不改变原有代码的情况下,去增加新的功能。
XMl的方法去实现
Dao接口
实现类
切面类
xml配置:
测试:
注解的方法去实现
xml方法
声明式事务
13.1 回顾事务
把一组业务当成一个业务来做;要么都成功,要么都失败!
事务在项目开发中,十分的重要,涉及到数据的一致性问题,不能马虎!
确保完整性和一致性。
事务ACID原则:
原子性(atomicity)
事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(consistency)
一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中。
隔离性(isolation)
可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(durability)
事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中