spring框架学习笔记(全)
- 格式:docx
- 大小:27.60 KB
- 文档页数:14
spring
1.这个框架并不像hibernate或struts那样为了完成特定的功能(操作数据库、处理Http请求),它只是用来优化我们的工程的结果、提升设计、降低耦合度。
2.核心:
应用上下文ApplicationContext它就是用来管理工程中无数类型的核心,一般通过xml文件或者注解来管理。它在启动时载入xml文件或注解中的类、类之间关系的信息,在使用时通过一些方式将管理的类型或对象取出使用。
3.(下载spring.zip,这里面包含了相应的jar包,以及文档)
第一个spring的应用:
1、导入jar包到工程中
2、在src下创建一个叫applicationContext.xml的配置文件
比如通过上述方式,我们就通过配置文件将,两个类Hello和Bye分别注册管理,其代号分别为hello和bye。通过这两个代号,我们之后就能取出这个两个类的实例,并进行使用。(相应的类要Hello,Bye事先自己定义好)
3、使用ClassPathXmlApplicationContext来加载上一步中的xml文件,以及获取其中的某个bean
ApplicationContextctx = new
ClassPathXmlApplicationContext("applicationContext.xml");加载xml文件中的配置信息,两个类就被spring管理起来了Hello h = (Hello)ctx.getBean("hello");
注意:取出bean时可以用多态
4.开闭原则:
对扩展开放,对修改关闭
需求变更时,尽量扩展一个类,不要去修改原来的类;这样可以避免在原来正确的类上产生新的bug。
5.spring不但可以动态创建类的实例,也可以通过配置文件动态初始化实例的属性值
1、私有属性要有对应的setter方法
2、在bean中定义property属性,对应类中私有属性,*可以通过配置进行属性的自动设置。
在猫的bean中注册name属性,值为TOM
name="name" value="Tom">
注册age属性,值为10,Tom和10两个值会自动注入到猫的实例中去
*也可以通过构造方法来进行动态初始化
1、在类中定义需要自动调用的构造方法
2、在配置文件的bean中定义来使用构造方法进行属性值的初始化
value="p">
value="10">
*可以和xxx.properties格式的配置文件结合使用
1、先要在配置文件中注册,载入一个xxx.properties文件的信息
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
value="classpath:xxx.properties"/>
2、可以在其他的bean中使用这个xxx.properties中定义的信息,比如:
这种spring的xml配置文件读取传统的xxx.properties配置文件的方式,将在以后数据源配置中经常使用,jdbc.properties中全是数据源配置参数,而spring的上下读取这个jdbc.properties,然后将其中的参数值,在bean中使用。这样两者各司其职,jdbc.properties负责jdbc的数据信息,spring的xml文件负责处理bean的注册及bean之间的关系。
5.spring管理的类,属性的类型完全可以是自定义类型。这种情况下就设计到类和类之间的装配。如果是自定义类型的装配,那么property标签不再用value了,而用ref,比如:
class Keyboard{
}
class Computer{
private Keyboard keyboard;
//setter......
}
*自动装配:
这个autowire=bytype表示会自动扫描上下文中的类,如果有符合Tool这个类型的就自动装配
如果一个都不符合或有多个符合就会报异常
class="com.oracleoaec.autowired.Hammer">
如果有多个匹配就会报异常,可以用autowire-candidate=false来将某些bean排除:
class="com.oracleoaec.autowired.Knife"autowire-candidate="false">
1.AOP 面向切面编程
是一种思想,struts有,spring也有
2.如何用spring实现?
1、导入相关的jar包
2、先定义一个目标类(其中有核心的逻辑,但共同的逻辑将会通过切面在切入点切入)
3、再定义一个切面Aspect操作类,在里面写上要重复切入到目标的逻辑
4、写配置文件,关键要配置,
after-returning和after类似,after是在方法逻辑执行完执行,after-returning是在方法返回后执行,核心区别是如果在方法中产生了异常,after是不会执行的,但after-returning会。
after-throwing是在遇到异常时执行method中的方法
定义一个方法,有参数ProceedingJoinPoint,在里面写上前置、后置的逻辑,并在之间调用jp.proceed(),也可以灵活的通过条件判断决定是否要调用jp.proceed(). proceed()的返回值就是方法的返回值
jp.getArgs()返回一个Object数组,就是被代理的方法的参数值(如果根本没有参数,就返回一个长度为0的数组)
注解AOP
*在配置文件中激活自动代理
*在切面类(比如刚才那个例子中就是FileOperation)的类定义上面写上@Aspect注解,然后在这个切面类的方法上定义注解,前置注解@Before,后置注解@After,环绕注解@Around。在这些注解里面还可以定义切入点point-cut,并写上类似execution(* com.oracleoaec.*.*())表达式。
AOP的基石----动态代理模式
代理模式
一、静态代理
被代理类(目标类)
代理类 1、目标类和代理类具有相同的接口
2、代理类中定义有一个属性,类型就是目标类(或者说代理类持有一个目标类对象的引用)
3、代理类的接口方法中会调用目标类的接口方法,并在其基础上添加一定的额外功能
静态代理必须事先知道目标类,才能再定义代理类
二、动态代理
1、JDK自带动态代理功能,InvocationHandler接口、Proxy
a、定义一个类实现InvocationHandler,并实现其抽象方法,并传入被代理的对象(目标对象)
b、Proxy.newProxyInstance(....)创建代理对象
所谓动态代理,就是在定义代理逻辑时,根本不需要知道未来被代理的是什么类,什么方法
而静态代理必须事先知道一些信息
注意:JDK的动态代理的目标类,必须实现接口
2、cglib动态代理,目标类完全可以不实现任何接口
a、定义一个类实现MethodInterceptor接口,实现其抽象方法
b、创建一个Enhancer对象