Spring 概述

来源:互联网 发布:大数据分析就业 编辑:程序博客网 时间:2024/06/01 08:07

Spring
使用: 要想可以通过spring进行IOC操作,必须先将需要用到的bean放置到容器中,不管是通过xml配置(bean)还是通过注解(@Component、@Named等)的方式

1、 spring的Dependency Injection通过构造函数和setter的区别
构造函数是强制性的,即如果不传入完整的函数参数,对象无法创建
setter是可选择的,可以选择创建部分对象,对象可能出现为空的情况
spring team主张一般情况用构造函数,因为不会产生对象为空的情况,而setter则用在可以分配默认值的或者字段值可以重新配置重新注入的情况

2、 复合属性名称注意点 compound property name

3、 depends-on

4、 autowire-candidate=false情况对autowire=”byName”无效,对其他有效

5、lookup-method: 一般是用来做管理类的,管理类一般是抽象类,而且创建对象的方法一般是抽象方法
难点: @Lookup没有调通
replace-method: 替换当前类中的指定方法,需要实现spring的MethodReplacer接口
String: 其中arg-type是用来标示被替换的AA方法的参数,防止出现方法重载的情况,多个参数用多个arg-type标签

6、 自定义Scope: 待理解

7、 注解:
@Required: 加在setter方法上,表明该属性在配置文件中是必须显示配置的
@Autowired: 通过类型检测,可以直接加到属性字段上,不用添加setter方法,也可以直接加在任何名称或(和)多参数的方法上
@Autowired(required=true): 表明当前检测的属性名或属性类型在配置文件中必须显示定义,否则提示错误,反之,可以不用显示定义,默认为false
@Primary: 如果配置中存在多个同类型的bean,则只匹配有此注解的bean
@Qualifier: 限定词,可以指定某个对象指向特定的类型,即别名
@Resource: 作用同Autowired。优先通过名称检测,如果不存在,则通过类型检测。如果指定了名称,则只检测同名称的,不会再检测类型

@Configuration: 相当于一个xml文件
@Bean: 在用此修饰的bean中,不能存在多个返回值类型相同的方法,否则提示错误;或者在其中一个中添加@Primary注解

@PostConstruct: 在构造函数之后运行的函数
@PreDestroy: 在销毁对象之前执行的函数

@Component: spring框架通用的注解 @Repository @Service @Controller是特殊的注解
JSR-330标准注解(Dependency Injection) 所在jar(javax.inject.jar)
从Spring3.0开始,兼容JSR-330标准,即330中的注解也可以使用
@Inject: 等同与 @Autowired
@Named:等同于 @Component 或者 @Qualifier
@Singleton: 等同于 @Scope(“singleton”)
@Qualifier: 等同于 @Qualifier

8、 spring EL: #{} #{aa} #{aa[0]} #{aa.bb} #{1 + 1} #{‘aa’.toUpperCase()}

9、 AOP
概念:
1、 通知(Advice): 通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作
2、 连接点(Joinpoint): 程序能够应用通知的一个”时机”。这些”时机”就是连接点。例如方法被调用时、异常被抛出时等等
3、 切入点(Pointcut): 通知定义了切面要发生的”故事”和时间,那么切入点就定义了”故事”发生的地点,例如某个类或方法的名称,spring中允许方便的用正则表达式来指定
4、 切面(Aspect):通知和切入点共同组成了切面: 时间、地点和要发生的”故事”
5、 引入(Introduction): 引入允许我们向现有的类添加新的方法和属性(Spring提供了一个方法注入的功能)
6、 目标(Target): 即被通知的对象,如果没有AOP,那么他的逻辑将要交叉别的事务逻辑,有了AOP之后,它可以只关注自己要做的事(AOP让他做爱做的事)
7、 代理(Proxy):应用通知的对象,跟代理模式一致
8、 织入(Weaving): 把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:
1. 编译时: 当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如 Aspect的织入编译器
2. 类加载时:使用特殊的classLoader在目标类被加载到程序之前增强类的字节代码
3. 运行时:切面在运行的某个时刻被织入。springAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术

Spring提供了4种实现AOP的方式:
1. 经典的基于代理的AOP
2. @Aspect注解驱动的切面
3. 纯POJO切面
4. 注入式Aspect切面

Spring支持五种类型的通知:

 Before(前)/After-returning(返回后)/After-throwing(抛出后)/Around(周围)/Introduction(引入)