Spring的基本配置及概念
spring
概念:开源的框架 一站式的 贯穿表现层业务层持久层 可以无缝的结合他们
核心思想 控制反转(ioc) 面向切面(aop)
是一个超级大工厂 (帮助我们实例化类的 不需要我们自己new 只需要声明实例然后配置即可 )
体系:结构
优点 :
1.方便解耦简化开发 2.支持aop思想编程 3.事务的支持
4.给测试类提供了方便 5.可以无缝的连接其他优秀的框架 整合
具体实现 ioc 控制反转将创建对象的权利交给第三方容器来管理
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
基本配置(xml)
1.首先导入相关的包
2.创建接口以及实现类
3.进行xml 配置
class--需要初始化的类的全类名
id ---初始化后的唯一标识
4.初始化spring容器调研该类的方法
1.初始化spring容器
2.获取相应的bean
1.根据id获取
2.根据类型获取
3.根据类型加id 获取
这样一个简单的 spring 的环境就配好了
依赖注入 di --创建的bean里面有什么属性以及参数可以这样注入然后可以进行调用 比如说 现在一个创建好的bean 是一个接口 里面有一个实现类实现了他的接口我们需要通过调用这样就需要把 该实现类注入到初始化的这个bean 里面 通过 property 标签进行注入
具体实现
xml配置
申明需要注入的类型:
注意这里这样注入的话都需要写 set get方法
-------------------------------------------------------------------------------------------------------------------------------------------------
bean 的实例化方式 (三种 )
1.通过默认的构造器实例化
2.静态工厂
1)<bean>
a)class:静态工厂的全类名
b)factory-method:静态工厂中的方法
c)id:调用工厂方法创建bean的id
3.非静态工厂
1)先要实例化非静态工厂
a)<bean>
1)id:非静态工厂实例的唯一标识
2)class:非静态工厂的全类名
2)在调用工厂的方法
1)<bean>
1)factory-bean:非静态工厂实例
2)factory-method:非静态工厂中的方法
2)id:调用工厂方法创建bean的id
-----------------------------------------------------------------------------------------------------------------------------------------------
scope 作用域
1)singleton:单列(默认值)
2)prototype:多列(原生)
== 下面这两个在web环境中才有效
3)request:每次请求创建一个bean
4)session:都个session都创建一个bean
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自动注入 autowire
1)no:关闭自动注入(默认值)
2)byname:根据名称注入
a)根据被注入的属性名称为参考,去容器中,如果有注入,没有就不注入
3)bytype:根据类型注入
a)根据被注入的属性的类型,去容器中
1)如果找到了
a)只找到了一个就注入
b)找到了多个就抛出异常
2)如果没找到就不注入
4)constructor:通过构造器注入
a)定义一个构造器来接受
5)default:按照父节点中的自动注入机制
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
通过注解实现
1.首先开启包扫描
2.在指定的类上添加注解
注解不需要写set get 方法了
具体注解的功能;
@component--指定该类可以被spring管理
默认生成的bean的id为类名首字母小写 方便调用
当然可以修改通过里面的value属性进行重新赋值
@autowired --自动注入的对象 先按照类型注入如果存在多个类型就按照名称注入 如果名称不存在就报错
@qualifier 与上面的连用 指定多个类型时指定自动注入的名称
@resource 也是自动注入 和上面的 @autowired 一样只不过这边如果存在多个类型的话指定名字时不用注解直接用里面的name 属性指定注入的名字即可
@scope 作用域 放在类的前面
其中每个层都有每个层的声明
持久层:声明注解 @repository
业务层:@service
控制层:@controller
这三个和 @component一个作业写上面的增强了可读性
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
aop --一种思想
术语 :
连接点 可以进入的点 执行(方法之前,方法之后,方法抛出异常 )
切点 真正进入的点
目标对象 真实的业务主体
增强 系统服务
织入 将增强添加到目标对象的过程
代理类 将增强添加到目标对象的过程产生的代理类
切面:一个范围
aop 的实现:
静态代理就是一种aop 的实现
简单来说 aop 首先就是解决了代码重复的问题我们一般只关心真实的一个方法而这个方法之前之后我们并不关心 所以我们就可以引入aop思想把方法之前和之后需要执行的方法 抽取出去用户只需要调用代理类就可以完成全部操作了 这样就简化了代码
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
jdk实现动态代理:
a)写一个类实现invocationhandler复写里面的方法
b)通过proxy.newproxyinstance()
a)目标对象的类加载
b)目标对象的父类接口
c)invocationhandler子类
调用:
优点 :解决的代理类过多的问题
实现了aop思想
缺点:给所有目标对象的所有方法都增强了 需要采用硬编码的方式进行判断
目标对象必须要有接口
-------------------------------------------------------------------------------------------------------------------------------------------------
1.cglib实现动态代理
a)写一个类实现methodinterceptor接口
b)通过enhancer创建代理类
1)设置目标对象
2)设置methodinterceptor实例
3)创建代理类(子类)
2)原理
a)动态给目标对象创建一个子类(setsupercalss())
b)在子类中复写父类中的方法
c)在子类的基础之上进行拦截
3)优点
a)目标对象不需要接口
4)缺点
a)给目标对象中的所有的方法都加了增强,如果要解决通过硬编码的方式。
b)目的对象不能用final修饰
调用------
----------------------------------------------------------------------------------------------------------------------------
aop里面的增强
1)前置通知 . methodbeforeadvice
2)后置通知 afterreturningadvice
3)环绕通知 methodinterceptor
4)抛出异常通知 throwsadvice
调用
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
注解实现增强
a)注解
1)@aspect:代表是一个切面
2)@before:前置通知
1)value:表达式
2)execution(public * add(..))
1)public 代表的方法的修饰符,默认public
2)*:代表任意返回类型
3)add:方法名称
4)..:任意参数
3)@after:后置通知,抛出异常后也执行
4)@around:环绕通知
1)需要往下调用
2)proceedingjoinpoint
5)@afterthrowing:抛出异常通知
6)@afterreturning:后置通知,出现异常后不执行
7)@pointcut:表达式
调用-----
---------------------------------------------------------------------------------------------------------------------------------------------------------
通过xml方式实现
切面基于xml实现
1)配置
a)目标对象
b)增强
c)切面
1)注入增强
d)<aop:config>:aop的配置
1)<aop:aspect>
a)ref:执行切面
b)<aop:pointcut>
1)id:表达式唯一标识
2)expression:表达式
c)<aop:after>
1)method:方法名称
2)pointcut:表达式
3)pointcut-ref:表达式的id
2)调用
1)初始化spring容器
2)获取目标对象(代理对象jdk)
调用-----
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
spring 里面实现了对数据库的操作
jdbctemplate 父
jdbcdaosupport 子
先要注入数据源
-------------------------------------------------------------------------------------------------------------
具体配置实现
获得数据源
实例化dao 层 把数据源注入到 里面
测试类
-------------------------------------------------------------------------------------------------------------------------------------------------
xml读取属性文件 key取值
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
事务 :
1)定义接口
a)platformtransactionmanager:里面提供了事务提交和回顾操作
1)datasourcetransactionmanager:spring和jdbc操作提供的一个事务管理
2)hibernatetransactionmanager:spring整合hiberate提供的一个事务管理器
3)jpatransactionmanager:jpa事务管理器
b)transactiondefinition:事务属性(事务隔离级别,是否只读,超时时间等)
c)transactionstatus:事务保存点
xml配置事务的模板
先配置事务管理器--传入数据源 然后配置事务模板对象--传入事务管理器
半自动化的方式
xml全自动方式
注解方式:
1)用注解实现
a)事务管理器
b)开启注解驱动
1)transaction-manager:事务管理器
c)@@transactional
1)可以加到方法也可以加到类上
spring对事务的支持
a)编程式事务管理
1)事务模板
b)声明式的事务管理
1)通过代理的方式来管理事务
2)利用aop思想
a)基于xml实现(多)
b)基于注解实现
----------------------------------------------------------至于整合下次再说