Spring
Spring IOC & DI
- spring对象的创建方式
- 通过类的无参构造方式。
- 通过静态工厂。
- 通过实例工厂。
- 通过spring工厂。
- bean创建的对象默认是单例的,可以通过scope=“prototype” 属性修改为多例
- bean在单例模式下的生命周期
- 在加载xml时就会创建对象,并把该对线存入map集合中,容器退出时销毁。
- bean在多例模式下的生命周期
- 在加载xml时并不会直接创建对象,每次getBean时才会创建一个新的对象,对象并不由Spring所持有,什么时候销毁取决于使用该对象的用户自己什么时候销毁该对象。
- 懒加载
- spring默认不是懒加载的
- 在bean上配置lazy-init=“true” 就会开启懒加载。
- 配置全局懒加载只需在beans上配置default-lazy-init="true"
- 多例情况下开启懒加载是没有意义的,因为只有在getBean时才会创建对象
- 配置初始化和销毁的方法
- init-method=“init”
- destroy-method=“destory”
spring配置Bean的方式
- 通过xml的方式
<bean id=“loginUserDao” class=“com.chinalife.dao.impl.LoginUserDaoImpl” lazy-init=“true” init-method=“myInit” destroy-method=“myDestroy” scope=“prototype”> …… </bean>
- 通过注解的方式(推荐)
@Scope(“prototype”) @Lazy(true) @Component(“loginUserDao”) public class LoginUserDao { …… // 用于设置初始化方法 @PostConstruct public void myInit() { } // 用于设置销毁方法 @PreDestroy public void myDestroy() { } }
- 基于Java类方式配置
@Configuration public class Conf { @Scope(“prototype”) @Bean(“loginUserDao”) public LoginUserDao loginUserDao() { return new LoginUserDao(); } }
DI(依赖注入)
1. 接口注入
2. set方法注入 通过**property标签注入**
3. 构造方法注入 通过**constructor-arg标签注入**(必须提供带参构造方法,可以不提供无参构造方法)
- 自动装配 **依赖set方法,用autowire属性注入**
* byName:通过set方法参数名与id匹配进行装配
* byClass:通过set方法参数类型与class匹配进行装配
Spring注解
- 自定义注解
- 开发一个注解类用 @interface 声明
- 使用元注解修饰注解的声明 - 所谓的元注解是用来就是注解的注解
- @Target 用来限制该注解可以用在哪些地方,可以通过ElementType限制
- @Retention 用来被修饰的注解会被保留到什么阶段,可以通过RetentionPolicy限制
Java虚拟机加载类首先只会加载java.lang包中的.class文件,其他的等到第一次使用类加载器才会加载
注解方式属性注入(推荐)
- <context:component-scan base-package=“com.wyq”/> 包扫描注解(告诉JVM该包及其子包中可能有spring注解,请求解析)
- <context:annotation-config /> 开启属性注解,装载类的同时也要解析属性上的注解,给属性赋值
- <context:property-placeholder location=“classpath:xx.properties”/> 通过配置文件方式引入属性配置。
- @Value 注入简单类型值
- @Autowire 先按id找,再按类型找,找不到则报错
- @Resource 先按类型找,再按id找
- @Qualifier(value="") 按id找与@Autowire配合使用
- @Value(${“xx”}) 注入导入的配置文件中的属性
- @Value(#{"@xx"}) 先在applicationContext.xml中配置好属性再以id方式注入(一般注入的是集合、映射等类型的属性)
其他注解
- @Scope(value="prototype) 类注解:标识该类的Bean为单例
- @Lazy 配置修饰的类的bean采用懒加载机制
- @PostConstruct 在bean对应的类中 修饰某个方法 将该方法声明为初始化方法,对象创建之后立即执行。
- @PreDestroy 在bean对应的类中 修饰某个方法 将该方法声明为销毁的方法,对象销毁之前调用的方
法。 - @Controller @Service @Repository @Compone
AOP
- 静态代理模式
- JDK动态代理 Proxy类的getInstance方法可以获取一个代理对象,返回的代理对象只能是接口类型,只能增强被代理对象的接口中的方法。(基于实现的方式)
- CJLIB 通过Enhancer(增强器)对象创建代理对象,返回的对象可以是被代理对象类型,可以增强被代理者所有的方法(基于继承的方式)。
Spring AOP基本概念
- 连接点:连接点( Joinpoint ) :在程序执行过程中某个特定的点,比如某方法调用的时候或者处理 异常的时候。在Spring AOP中,一个连接点 总是 表示一个方法的执行。
- 切入点:切入点( Pointcut ) :匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切 入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点 匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
- 切面( Aspect ):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是 J2EE应用中一个关于横切关注点的很好的例子。
- 通知( Advice ):在切面的某个特定的连接点上执行的动作。其中包括了 “around”、“before”和“after”等不同类型的通知(通知的类型将在后面部分进行讨 论)。许多AOP框架(包括Spring)都是以 拦截器 做通知模型,并维护一个以连接点为中 心的拦截器链。
- 目标对象( Target Object ) : 被一个或者多个切面所通知的对象。也被称做 被通知 (advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代 理(proxied) 对象。
Spring AOP基本用法
开发AOP的基本步骤
- 定义切面类
- 配置切入点语法
- 配置通知方法
基于配置文件方式
- aop:config 配置aop的跟标签
- aop:pointcut 配置切入点语法
- within语法:within(包名.类名) 通过类名进行匹配粗粒度的切入点表达式
- execution语法:execution(返回值类型 包名.类名.方法名(参数类型,参数类型…))
该切入点规则表示,切出指定包下指定类下指定名称指定参数指定返回值的方法。
SpringAOP 的原理
Spring会在用户获取对象时,生成目标对象的代理对象,之后根据切入点规则,匹配用户连 接点,得到切入点,当切入点被调用时,不会直接去找目标对象,而是通过代理对象拦截之 后交由切面类中的指定的通知执行来进行增强。
Spring自动为目标对象生成代理对象,默认情况下,如果目标对象实现过接口,则采用java 的动态代理机制,如果目标对象没有实现过接口,则采用cglib动态代理。开发者可以可以在 spring中进行配置,要求无论目标对象是否实现过接口,都强制使用cglib动态代理。
SpringAOP的原理4.
分区 Spring 的第 46 页
spring中进行配置,要求无论目标对象是否实现过接口,都强制使用cglib动态代理。
Spring的五大通知类型
- 前置通知
- 在目标方法执行之前执行执行的通知
- 方法接受第一个参数必须为JoinPoin
- 环绕通知
- 在目标方法执行之前和之后都可以执行额外代码的通知。
- 在环绕通知中必须显式的调用目标方法,目标方法才会执行,这个显式调用时通过 ProceedingJoinPoint来实现的
- 环绕通知需要返回返回值,否则真正调用者将拿不到返回值,只能得到一个null
- 后置通知
- 在目标方法执行之后执行的通知。 在后置通知中也可以选择性的接收一个JoinPoint来获取连接点的额外信息,但是这个参 数必须处在参数列表的第一个。
- 异常通知
- 在目标方法抛出异常时执行的通知
- 可以配置传入JoinPoint获取目标对象和目标方法相关信息,但必须处在参数列表第一位 另外,还可以配置参数,让异常通知可以接收到目标方法抛出的异常对象
- 最终通知
- 是在目标方法执行之后执行的通知。
- 最终通知也可以额外接收一个JoinPoint参数,来获取目标对象和目标方法相关信息,但 一定要保证必须是第一个参数。
- 通过参数传入接入点对象,通过接入点对象可以操控目标方法。
- 无论是异常通知的异常对象,还是后置通知的返回值对象,在xml配置中的对象名称都要与参数名称相同。这样才能与之匹配
Spring AOP 注解方式
- aop:aspectj-autoproxy/ 表示开启Spring AOP注解方法
- @Aspect 声明为切面类
- @Before 前置通知
- @Around 环绕通知
- @AfterReturning 后置通知
- @AfterThrowing 异常通知
- @After 最终通知
Spring整合Jdbc
- org.springframework.jdbc.core.JdbcTemplate -Jdbc模板类
声明式事务处理
- xml配置方式
- 配事务管理器
- 配置事务切面
- 配置事务通知
- 注解方式
- 开启spring的注解方式配置事务
<tx:annotation-driven/>
- Transactional
- 贴在类上或接口上,所有的方法都开启事务
- 贴在方法上,被贴的方法开启事务
@Transaction(propagation=Propagation.NOT_SUPPORTED)
取消事务@Transactional(rollbackFor=Throwable.class, noRollbackFor=SQLException.class)
为指定的异常开启或者关闭事务,因为默认情况下只有运行时异常才会回滚事务
- 开启spring的注解方式配置事务