1、设值注入
2、构造注入
Id | 标识符 |
Class | 指定类 |
Scope | 作用域 |
Constructor arguments | 构造器参数 |
Properties | 自身属性 |
Aotowiring mode | 自动装配模式 |
Lazy-initialization mode | 懒加载模式 |
Initialization/destruction method | 初始化/销毁方法 |
配置有全局配置,bean中配置。当三种方法都存在时,全局配置不起作用。其他两种都会执行,且实现接口方法先于bean中配置执行
可以先通过BeanNameAware接口得到beanName,再通过ApplicationContextAware接口的getbean获取该bean
自动装配意义在于不需要在手动注入了 ,使配置更加简洁方便。在xml的【beans】中配置。
参考资料:spring常用注解
元注解:注解的注解,可以将多条注解自定义为一个注解
参考资料:Spring4.0系列4-Meta Annotation(元注解)
bean的自动检和注册:
Spring可以将上面四个注解的bean自动注册到容器(ApplicationContext)中,都有个name属性可以显示的设值bean的id,在xml中需要配置自动注册路径
bean的名称是由BeanNameGenerrator生成的,要自定义命名策略可以实现该接口并一定要包含一个无参构造器,并在
参考资料:Spring
Spring 开启Annotation
注意使用context配置时需要加上相应的命名空间。
自动注册可以通过
自动注册的bean作用域默认是:singleton,可以@Scope指定,也可以使用自定义的scope策略,要实现ScopeMetadataResolver接口,并类似上面自定义命名规则的当时注册
可以使用scoped-proxy属性指定代理。三个可选值:no,interfaces,targetClass
@Required注解:适用于bean方法的setter方法,表示当被注解的属性在bean被装配时必须被设置,否则会抛出BeanInitializationException异常
@Autowired注解:可用于构造器、方法或成员变量,可以用此注解替代上面提到的Autowiring自动装配不用再写太多配置也不用再写set方法,方便快捷;如果找不到合适的bean将会抛出异常,可以通过required=false来避免。
@inject等效@AutoWiried @Named 等效Component @Named还可根据name注入字段
常见使用:
@AutoWired经常用来注解哪些众所周知的接口,来直接获取这些接口
@Autowired也可以通过添加注解给一些数组的字段或方法,来获取applicationContext中所有特定类型的bean
注意:@Autowired由Spring的BeanPostProcessor处理的,不能在 自己的BeanPostProcessor或BeanFactoryPosrProcessor类型应用这些注解,这些类型必须通过XML或者Spring的@Bean注解来实现;
参考资料:Spring@Autowired注解与自动装配
@Order注解可以实现类的有序加载,其value越小越先被加载,针对list数组有效,对map数组无效。
@Qualifier当用@Autowiried自动装配时,是根据属性类型来装配的,可能有多个bean实例,可以用此注释来指定是哪一个bean实例。否则会报错。
参考资料:Spring @Qualifier 注释
@Resouce相当于@Autowiried加上@Qualifier的功能,某属性有多个bean时大多使用此注解,有两个参数name、type。有name时会按照byName进行装配
有type时会按照byType进行装配,两者都有时按照name和type查找。两者都没有时按照属性名利用反射机制装配。
@Bean常与@Configuration配合使用,@Congfiguration相当于
使用bean时也要加上
参考资料:Spring中基于Java的配置@Configuration和@Bean用法
在xml中
用注解的实现方式为@ImportResource("路径")@Value引用。
使用properties文件的方法:
在properties文件中写好键值对,如:name=tom
在xml中配置引入properties文件。
在java类上引入资源:@ImportSource("xml路径"),在字段上注解@Value("${name}")便可让字段获取tom值了
切面(Aspect):一个关注点的切面化,这个关注点可能会横切多个对象
连接点(Joinpoint):程序执行过程中的某个特定的点
通知(Advice):在切面某个连接点上执行的动作
切入点(Pointcut):匹配连接点的点,在AOP中通知和一个切入点关联
引入(Introduction):在不修改类代码的前提下,为类添加新的方法和属性
目标对象(Target Object):被一个或多个切面所通知的对象
AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)
织入(weaving):把切面链接到其他的应用或者对象上,并创建一个被通知的对象,分为:编译时织、类加载时织入、执行时织入
前置通知(Before advice):在某连接点(join point)之前执行的通知,但不能阻止连接点的执行(除非抛出异常)
返回后通知(After returning advice):在某连接点(join point)正常完成后执行的通知
抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知
后通知(After (final)advice)当某连接点退出时执行的通知(不论是正常返回还是异常退出)
环绕通知(Around Advice):包围一个连接点的通知,环绕通知(Around advice)的方法第一个参数必须是ProceedingJoinPoint,调用他的proceed()方法;
Spring所有切面和通知器都必须放在一个
*:匹配任何数量字符;
..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。
+:匹配指定类型的子类型;仅能作为后缀放在类型模式后边。
参考资料:切入点表达式的配置
充当Advice和Pointcut的适配器,将pointcut和advice结合起来
简介允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象。简单点说就是将原有的一个bean伪装成一个我们自己的类,调用该bean时会调用我们伪装的类。
Pointcut通过API实现之一:NameMatchMethodPoint,根据方法名称进行匹配,成员变量:mappedNames里,有匹配的方法名集合
before advice:实现接口。MethodBeforeAdvice
Throw Advice :类似,找接口
After Returning advice :实现org.springframework.aop.AfterReturningAdvice接口
around advice:实现MethodInterceptor接口
1、@AspectJ切面使用@Aspect注解配置。拥有@Aspect的任何bean将被spring自动识别并应用
2、用@Aspect注解的类可以有方法和字段,他们也可能包括切入点、通知和引入声明
3、@Aspect注解是不能够通过类路径自动检测和发现的,所以需要配合@Conponent注释或者在xml中配置bean
4、一个类中的@Aspect注解标志它为一个切面,并且将自己从自动代理中排除
5、一个切点通过一个普通的方法定义来提供,并且切入点表达式使用@Pointcut注解,方法返回类型必须为void
spring为不同的持久化框架实现了不同的PlatformTransactionManage接口
脏读:一个事务读到了另一个事务还没有提交的数据。如果数据被回滚,则独到的数据是无效的
不可重复读:在同一事物中,多次读取统一数据返回的结果有所不同
幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中第一个事务就会发现有些原来没有的数据。
隔离级别:
DEFAULT:使用后端数据库默认的隔离级别
READ_UNCOMMITED :允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读
READ_COMMITTED :允许并发事务已经提交后读取。可防止脏读、但幻读和不可重复读仍可发生
REPEATABLE_READ :对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生。
SERIALIZABLE:完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这是所有的隔离级别中最慢的,他是典型的通过完全锁定在事务中涉及的数据来完成的
事务传播行为:
PROPERGATION_REQUIRED:支持当前事务,如果不存在则创建一个
PROPERGATON_SUPPORTS:支持当前事务,如果不存在,就不使用事务
PROPERGATION_MANDATORY:支持当前事务,如果不存在,抛出异常
PROPERGATION_REQUIRES_NEW:如果有事务存在,挂起当前事务,创建一个新的事务
PROPERGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务
PROPERGATION_NEVER:以非事务方式运行,如果存在事务,抛出异常
PROPERGATION_NESTED:如果当前事务存在,嵌套当前事务执行
---编程式事务管理
---使用XML配置声明式事务
也需要配置事务管理器
pom.xml中配置
4.0.0
imooc-arthur
spring-mvc-study
1.0.0-SNAPSHOT
2.6
1.7.6
4.1.3.RELEASE
2.5.4
org.springframework
spring-framework-bom
${spring.version}
pom
import
org.springframework
spring-webmvc
commons-lang
commons-lang
${commons-lang.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
slf4j-api
org.slf4j
org.slf4j
slf4j-api
${slf4j.version}
javax.servlet
servlet-api
2.5
org.eclipse.jetty
jetty-maven-plugin
9.2.2.v20140723
web.xml中:
Spring MVC Study
contextConfigLocation
/WEB-INF/configs/spring/applicationContext*.xml
org.springframework.web.context.ContextLoaderListener
mvc-dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml
1
mvc-dispatcher
/
dispatcher-servlet.xml配置
applicationContext.xml配置:
需要在dispatcher-servlet.xml中配置:
pom.xml中配置
commons-fileupload
commons-fileupload
1.3.1
需要在dispatcher-servlet.xml中配置:
com.fasterxml.jackson.core
jackson-databind
2.5.4
//两者都可以返回json数据
@RequestMapping(value="/{courseId}",method=RequestMethod.GET)
public @ResponseBody Course getCourseInJson(@PathVariable Integer courseId){
return courseService.getCoursebyId(courseId);
}
@RequestMapping(value="/jsontype/{courseId}",method=RequestMethod.GET)
public ResponseEntity getCourseInJson2(@PathVariable Integer courseId){
Course course = courseService.getCoursebyId(courseId);
return new ResponseEntity(course, HttpStatus.OK);
}