spring的引入
原生jdbc----有什么弊端----程序间的耦合性
DriverManager.registerManager(new com.mysql.jdbc.Driver());
代码---当前程序之间存在耦合
注册驱动的驱动管理类DriverManager直接依赖于new com.mysql.jdbc.Driver()
反射方式:
Class.forName("com.mysql.jdbc.Driver");降低程序之间的耦合性
如何改进:
工厂模式:自定义一个类
spring:
BeanFactory接口
Spring IOC容器对象:管理很多个bean对象
springIOC:控制反转
控制反转/反转控制:松耦合
解决具有依赖关系的组件之间的强耦合,使得项目形态更加稳健
SpringIOC:反转控制
容器
将bean组件全部使用容器进行管理
service业务层
dao层
管理事务
管理bean对象 装配对象
作用:
程序解耦(松耦合),低耦合,高内聚
spring的bean配置文件中,使用反射技术--完成某个类的对象的创建!
工厂模式--
ApplicationContext
ClasspathXmlApplicationContext:第一个--读取bean.xml获取容器对象
容器对象.getBean(String beanName)
FileSystemXmlApplicationContext
AnnotationConfigApplicationContext
IOC优点:
以最小的代价,降低应用层的代码量(松耦合)
整个创建对象的过程:是一种工厂模式(反射的思想)
spring的ApplicationContext三个接口实现的区别
BeanFactory:最顶层的父接口
ApplicationContext:
ClassPathXmlApplicationContext:
读取到resource类路径下的配置文件(一定是类路径下):相对路劲---读取xml文件--解析xml文件--dom4j
FileSystemXmlApplicationContext:
读取任何磁盘下的资源文件(必须有权限访问):绝对路径
AnnotationCofigApplicationContext:
读取注解方式:容器对象(IOC注解方式)
spring的bean对象的管理
三种常见bean方式:
1.默认默认无参构造方式:
弊端:存在潜在问题:建议如果有有参/无参
<bean id="XX" class="全限定名称">
2.普通工厂类或者一些类(在别的jar包)(非静态的)
如果当前我们工程下可到导入一些相关的jar包,jar包中的一些功能创建相关的service层对象
普通工厂类: 里面的成员方法,返回值就是当前service层对象如何在bean.xml文件中配置
factory-bean属性:指定当前工厂类的名称
factory-method属性:工厂方法的方法名
第一个bean对象,创建工厂类实例
<bean id="工厂类名" class="工厂类的全限定名称"></bean>
<bean id="XX" class="全限定名称" factory-bean="工厂类名" factory-method="工厂中的方法">
3.静态工厂类:
某个bean对象创建 需要静态工厂类,工程中有一个静态方法,返回值就是当前需要的类对象
<bean id="xx" class="工厂类的全限定名称 factory-method="工厂中的方法"></bean>
spring的bean对象的依赖范围
bean标签中有一个属性scope:
常用范围:
singletion:默认的依赖访问 单例对象(默认) 读取配置文件就创建
prototype:多例对象 需要用到的时候创建
不常用的;
request:在web程序中一次请求中
session:在web程序中一次会话中
global-session:全局范围
当前采用集群环的时候,如果不是集群环境.使用session依赖范围
集群环境:有很多服务器组成的
bean对象的生命周期
bean对象:从创建(出生),初始化,执行完(死亡)
scop="singleton"
单例对象:生命周期等同于容器对象的生命周期对象
出生:在读取spring核心配置文件:bean.xml创建该bean对象
初始化:(活着):容器对象只要存在,当前bean对象一直存在
死亡:当前容器关闭了,ApplcationContext:接口 ClassPathXmlApplcationContext类里面的close(),bean对象就死亡了
scop="prototype":多例对象
生命周期
1.出生:并不是读取完配置文件就创建,需要用到具体的bean对象的时候.一旦bean对象创建
2.初始化:只要这个对象一直在内存中,就一直存在
3.死亡:当前当前bean对象,没有其他bean对象引用的时候,被垃圾回收器调用,回收掉!
spring的依赖注入
spring管理各个类型之间的依赖关系
注入的方式(三种)
1.构造函数的方式
bean标签中
子标签中constructor-arg
type属性:指定当前有参构造方法中的每一个参数的类型
index属性:指定的当前有参构造方法中的每一个参数的索引值从0开始
name属性:指定有参构造方法中的参数名称(推荐)
value属性:给基本类型和String类型直接赋值
ref属性:关联其他类型的值(bean对象)
2.通过set方法注入(推荐)
property
属性:
name:执行的 当前bean对象中的setxx()set去掉,首字母小写
value:给当前对应的属性直接赋值:基本类型或者String属性
ref:关联其他类型
注入复杂类型
数组
在property标签
子标签:array
集合
list
property
list
Set
property
set
Map
property
map:
子标签:entry
Properties
property
子标签:props
prop
3.注解注入
@AutoWired
@Resource
@Qualifier
@Value
注入数据类型
1.基本类型和String类型
2.配置文件中出现的其他bean对象(构造/set)
3.复杂类型/集合类型
Spring注解方式的基本入门
1.用于bean对象的创建---等同于bean标签
@Component
value属性:
指定的bean的id,如果不指定,默认使用当前类名,首字母小写
@Service:一般用在业务层
@Controller:一般在表现层
@Repository:一般用在持久层
2.用于bean对象注入数据的注解---等同于property标签
@Autowired:自动装载
弊端:只能按照类型进行注入的
@Qualifer:先按照类型匹配,然后在按照名称匹配
value属性:可以指定具体的名称
必须依赖@Autowired存在
@Resource
name属性:直接按照名称进行匹配
这三个注解只能注入bean对象,不能够注入基本数据类型和String类型
复杂类型:数组/集合类型:没有注解---只能xml配置方式注入
基本数据类型和String类型的注入
@Value---使用spring的el表达式${表达式}
3.用于管理bean对象的依赖范围注解
@Scope
value属性
常用两个值
singleton
prototype
4.用于管理bean对象的生命周期相关的注解
@PreDestroy---销毁
@PostConstruct---初始化
使用Spring的IOC注解方式(crud)
spring的新注解
@Configuration:标记当前这个类是一个配置类--等价于bean.xml
细节问题:
如果在使用AnnotationConfigApplicationContext里面的参数使用的当前配置类.class文件
@Configuration可以不写
@ComponentScan:-等同于<context:component-scan base-package>
作用:就是扫描我们service/dao层
value属性和basePackages属性意思一样:扫描对应的包:数组的方式
basePackages=(""):如果指定某一个包,不需要写
@Bean:配置类的方法上使用
必须在配置类中定义成员方法,将成员方法返回值作为bean添加带spring容器中
如果在里面不指定name属性--(等价于bean.xml文件中 bean的id属性),默认使用的方法名作为bean对象去使用
@Import:在当前核心类中导入子配置类
里面的内容指定子配置类的class
@PropertySource:读取外部properties配置文件的:
value属性:classpath:配置文件名称
@Value----+spring的el表达式
Spring整合junit单元测试
jar包---Spring-test
1.导入spring提供的单元测试的jar包
2.需要将执行器(Runner:里面集成main方法)替换成spring自己的子类
3.需要将我们的配置类读取到配置类
@ContextConfigguration
两个属性
locations
类路径下:配置文件 bean.xml
关键字:classpath:文件名称
Class[] class
动态代理
jdk动态代理
前提条件:
代理类必须实现一个接口
提供者:jdk
public static Object newProxyInstance(ClassLoader loader,
//类加载:随用随创建,边用边加载,加载被代理角色的字节码文件
//字节码数组:和被代理角色提供相同的字节码问价
Class<?>[] interface,
//是对业务方法进行增强参数:代理的处理程序
要么提供接口自实现类,要么接口匿名内部类
InvacationHandler h)
弊端:如果没有提供真实角色要实现的接口---无法对真实角色--产生代理
cglib动态代理:没有接口时候用
1. cglib--Enhancer(核心类)
2.里面有方法
create
里面的参数
参数1:当前被代理角色的字节码文件
参数2:CallBack 接口
接口作用:
子接口:MethodInteceptor
将业务方法进行拦截---理解为:jdk动态代理
invocationHander
Spring—AOP(面向切面编程)—里面代理思想
AOP:面向切面编程:aspect
面向切面过程,基于面向对象(OOP)
给业务代码进行增强,但是增强同时又不去改动原有代码:动态代理的思想
作用:
1.将业务层代码:有效分离---和事务 连接事务
2.提高开发效率---降低程序间的耦合性
3.代码课重复度降低了
4.不需要自己使用动态代理来完成 业务方法增强
连接点(Joinpoint):类似于jdk动态代理/cglib动态代理的
invoke/intercept 方法/拦截
切入点(Pointuct):具体的业务方法就是切入点
通知、增强(Advice):可以为切入点添加额外功能:有前置通知,后置通知,异常通知.最终通知,环绕通知
目标对象(Target):代理的目标对象
引介(Introduction):一种特殊的增强,可以再运行期为类动态添加Filed和Method
织入(Weaving):吧通知应用到具体的类,进而创建新的代理类的过程
代理(Proxy):被AOP织入通知后,产生的结果类
切面(Aspect):由切点和通知后.将横切逻辑织入切面所指定的连接点中