spring

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):由切点和通知后.将横切逻辑织入切面所指定的连接点中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值