Spring----初识
《在了解Spring前的一些知识》
《Spring的基本框架Spring Framework的了解》
IOC:说简单一点就是我们本来一切对象都是通过new出来的,现在变成了由程序提供我们对象,要提供的对象写在.xml文件中;
这些特点学完后记得回顾:
《IOC》
《思想》
《IOC容器在Spring中的实现》
1.说明使用了工厂模式,对对象的制造进行了隐藏,同时提供对象,面向spring本身
2.我们使用的类
上面的FileSystem...这个实现类我们是不常用的,因为使用他有点使用绝对路径的感觉
而下面的ClassPath...这个实现类是用相对路径的感觉,比较常用
《Spring对组件(Bean)的管理》
《通过XML文件来管理,获取Bean》
《注意点》
1.在Bean对象中一定要有无参构造器,否则反射无法实现new
2.
而 (实现接口的类 instanceof 接口)这个是为true的,还有(子类 instanceof 父类)也是为true的
《通过XML来进行依赖注入》
所谓依赖注入其实就是为Bean对象赋值
《通过Setting来注入》
《通过Construct(构造器)来注入》
如果想要将name赋值为null,则如下操作,在setting注入中也是如此操作
《对于特殊字符的注入》
如图:在我加了特殊字符后立马报错:
为了解决这个问题:
《为Bean中的类变量进行注入》
<关于ref的理解>
这个ref其实是对ioc所管理的对象的引用,下面会大量用到ref,表示对ioc管理的对象的引用
比如在Student中有Clazz(班级)这个类,在xml文件中配置时,就要调用IOC容器了,即使用xml中对应的bean去注入
《为类中的数组注入数值》
如:我在类中有一个hobby的数组
《对集合类(list,map)进行注入》
《list》
被注释的是第二种方式:
《map》
《p命名空间》
<Spring管理数据源和引入外部属性结构>
在原来我们都是通过properties文件的形式去设置jdbc的连接配置
同样我们可以通过ioc容器去管理:
1.引入jar包:
2.写xml:
3.调用:
当然还可以先配置properties文件,然后引入到xml文件配置中:
《bean的作用域》
单例即:
通过ioc通过类.class得到的,永远是同一个对象
《bean的生命周期》
在javabean中:
《在xml中给bean设置property和singleton对bean的生命周期的区别》
《后置处理器对bean对象初始化之前和之后操作》
在xml文件中配置:
然后用即可
《FactoryBean》
我通过FactoryBean管理了Studnet这个类,然后在xml文件中配置FactoryBean,在可以直接使用student
《XML自动装配bean对象》
我们可以把原来写在代码中的UserController userController=new UserController();这种硬编码方式改变,用XML来配置:
我需要将useService交给xml来配置
最初始的方法是:
我可以用自动装配的方式来autowire="byType",其是通过bean对象中
实现了get,set的属性的类型(本类,子类)来到xml中找可以符合这个类型的bean进行装配
而byName是通过其在类中名字来与xml中的id进行匹配进行自动装配
如在UseService中的这个属性
然后我在xml中也配置了
名字与id 匹配上了
《基于注解来管理Bean》
《前置知识》
《开始配置》
这个扫描线的base-package中的写法是:扫描我们写的包的下面的全部类与组件
以上就相当于以前在xml中配置各种bean的效果
《扫描线注意点》
《配置自动装配》
在需要装配的属性上写上@AutoWire
这个效果与以前在xml中写
<bean><property name="...." ref='......"/></bean>效果是一样的
《注意点》
这里指定id为userServiceImpl的bean为userServerce来赋值
《id》
自定义id:
《报错》
《AOP》
《前置知识----代理模式》
来看如下一个例子:
我想要一个类:其可以实现计算功能而且还带有日志功能
.................
然后你可以看到,这样写日志方式十分不好:有大量重复的代码,基本框架一致,重复度高,不易维护
我想要像以前一样将重复的代码放到父类上,然后调用父类上的方法实现解决,但是日志的代码并不是像以前的代码是连续的
日志的代码是分散的,这样我们就难以做到上面的目的:
《概念提出》
代理模式即使再写个proxy类(代理类),其中的方法中实现对核心功能方法的调用,这样我们就可以在核心类中专心写核心类
从而把辅助内容写在proxy类的方法中
以上面的案例为例子:
《静态代理》
首先代理类也要对核心类的接口进行实现,因为最后在代理类中还是要调用核心类中的核心方法,不如直接实现核心类的接口
《动态代理》
其中获得代理类的方法:
因为为了最好如果出现异常可以有异常记录,可以有如下改进:
《测试》
在动态代理的情况下,即使我不知道我的代理类的类是什么,但是我知道其要调用的核心方法实现的是什么接口,而接口也可以看做父类使用,所以我在测试的时候可以将Object类的proxy向下转型为接口类Calculator
《AOP的提出》
OOP:面向对象,其实也有纵向继承机制的特点
AOP:面向切面,其实也有横向抽取机制的特点
AOP即是代理模式核心思想的实现:
《前置术语和概念》
《配置》
在xml配置注解方式的ioc管理:
《工作方式》
《获取连接点(代理方法)上的信息》
上面这个地方还有许多要改进的
1.比如还有好多方法要前置通知,但是上面execution中我这样写只能作用于add方法
改进:
类名中也可以用*比如com.atguigu.aop.*
代表在com.atguigu.aop下的任意类的任意返回类型,任意方法名,任意参数都可以用这个前置函数
2.还有好多的通知,不仅仅只有前置通知,则可能会有重复的这个写法
改进:
《通知方法》
环绕通知一般一写就可以不用上面的通知写法了:
《切面的优先级》
《AOP----事务》
<jdbcTemplate>
spring中的操作jdbc的类
依赖配置:
因为jdbcTemplate是spring给我们进行数据库处理的类,所以其也可以在ioc容器中受到管理
《操作》
《进行事务操作》