spring小结
一、spring IOC
IOC:控制反转,将对象的创建交给spring容器来完成。
DI:依赖注入,对象依赖的属性由spring容器来注入。
1、依赖包:beans、context、core、expression、commons-logging
2、配置文件applicationContext.xml:
<bean id="helloWord" class="包名" scope=""> <property name="" value=""></property>
</bean>
//默认singleton:单例模式,IOC容器创建时创建bean实例,在整个IOC容器的生命周期中只有一个。 //prototype:原型模式。IOC容器初始化时不创建bean 的实例,在每次获取bean实例时创建。 //request:一个request创建一个实例。 //session:一个session创建一个实例。
3、创建spring的IOC容器对象
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
4、从IOC容器中获取bean实例
HelloWorld helloWord=(HelloWorld)ctx.getBean("helloWord");
5、导入外部属性文件
<context:property-placeholder location="classpath:db.properties"/>
//使用:${name}
6、配置注解:指定IOC容器扫描的包。然后才可以在包名下的类使用注解。
<context:component-scan base-package="包名"></context:component-scan>
二、spring AOP
AOP:面向切面编程
1、IOC配置、扫描注解配置、如上。
2、基于注解的AOP配置:
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
3、切面是一个IOC的bean,需要@Component、@Aspect注解。
4、切面类中声明方法,需要@Before、@After、@AfterReturning、@AfterThrowing、@Around
5、如:
@Before("execution(包名.类名.方法名)")//可用*作为通配符 public void beforeMethod(JoinPoint joinPoint){ String methodName = joinPoint.getSignature().getName();//获取目标方法的方法名 List<Object> args = Arrays.asList(joinPoint.getArgs());//获取目标方法的方法参数 System.out.println("the method " + methodName + " begins with " + args ); }
6、 前置通知:在目标方法执行前,执行的通知
后置通知:在目标方法执行后(无论是否发生异常),执行的通知,不能访问目标方法的结果。
返回通知:在目标方法正常结束后(发生异常后不执行),执行的通知,可以访问目标的结果。public void beforeMethod(JoinPoint joinPoint,Object result){}
异常通知:在目标方法出现异常时才执行,可以访问到异常对象,且可以指定在出现特定异常时执行通知。public void beforeMethod(JoinPoint joinPoint,Exception ex){}
环绕通知:需要携带ProceedingJoinPoint类型的参数,该参数可以决定目标方法是否执行。执行:pjp.proceed();环绕通知必须有返回值,返回值即为目标方法的返回值。
7、切面类,可以用@Order(i)指定优先级,数值越小优先级越高。
8、 定义一个方法,用于声明切入点表达式。一般的,该方法中不添加其他代码。
使用@Pointcut来声明切入点表达式。
后面的通知直接使用方法名来引用当前的切入点表达式即可。
@Poincut("execution(包名.类名.方法名)") public void declareJointPoint(){}
//使用:@Before("declareJointPoint()")
三、声明式事务
1、配置事务管理器
<bean id="transactionManager" class="对应持久层的事务管理器类名"> <property name="dataSource" ref="dataSource"></property> </bean>
2、启用事务注解
<tx:annotation-driven transaction-manager="transactionManager"/>
3、在方法上使用@Transactional即可实现事务。
4、事务的传播行为:当一个(主)事务调用多个(子)事务时。使用propagation指定事务的传播行为。
1)、@Transactional(propagation=propagation.REQUIRED)(默认):使用主事务,子事务一旦失败,全部回滚。
2)、@Transactional(propagation=propagation.REQUIRES_NEW):主事务挂起,子事务失败只回滚该子事务。
5、@Transactional其他属性:
isolation:指定事务的隔离级别,默认使用数据库的隔离级别。常用Isolation.READ_COMMITTED(读已提交)。
readOnly: 指定事务是否为只读。数据库不加锁,可以优化事务。
timeout:设置超时回滚,单位秒。