一:IOC
1.IOC概述
①含义:Iversion of Control反转控制——反转资源获取的方向
②传统的获取资源的方式
组件向当前所在的环境主动的去要资源
ActionContext.getContext().getSession();
③IOC提倡的方式
由组件所在的环境负责将资源注入到组件中,组件被动接受即可
SessionAware接口→setSession()
④IOC是一种思想,最经典的实现是DI:Dependency Injection依赖注入
2.IOC容器细节
①使用IOC容器创建对象
②使用IOC容器在创建对象的同时,给对象的属性赋值
③在创建对象的过程中,实现组件对象之间的自动装配
3.搭建Spring IOC容器需要的开发环境
①导入IOC容器需要的jar包
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.1.3.jar
②创建Spring配置文件:Spring Bean Configuration File
4.IOC容器创建对象
①IOC容器本身对象创建时,会将配置文件中配置好的bean创建出来
②默认是单实例的,只创建bean的一个对象
③如果设置bean的scope属性为prototype,那么创建bean的对象就是多实例的,在获取的时候创建,每次获取对象都会创建新的
5.从IOC容器中获取对象
①根据bean的id获取
②根据bean的类型获取:要求容器中指定类型的bean是唯一的
6.bean的后置处理器
①在bean的初始化方法调用前后执行操作的专门的对象
②自定义后置处理器:org.springframework.beans.factory.config.BeanPostProcessor
7.属性的装配
①手动装配
②自动装配
8.使用注解配置bean
①声明bean的注解
@Component 将当前类声明为IOC容器中的一个普通的组件
@Controller 将当前类声明为IOC容器中的一个控制器组件
@Service 将当前类声明为IOC容器中的业务逻辑层组件
@Repository 将当前类声明为IOC容器中的一个持久化层组件,Spring根据上述注解其实并不能分辨当前类是否真的是一个控制器或Dao,即使标记的类和注解不对应也没有语法错误。但在实际工作中,肯定要将专门的注解标记在对应的类上面。
②使用基于注解的bean的配置,需要额外导入一个jar包:spring-aop-4.0.0.RELEASE.jar
③需要设置自动扫描的包
<context:component-scanbase-package="com.atguigu.ioc.bean"/>
④使用注解后,默认按照类名首字母小写作为id的值,也可以使用value属性指定id,value属性名也可以省略
⑤使用注解进行自动装配:@Autowired注解
[1]首先检测标记了@Autowired注解的属性的类型
[2]根据类型进行装配
[3]如果指定类型的bean不止一个,那么根据需要被装配的属性的属性名做id的值,查找bean
[4]如果根据id值还是没有找到bean,可以使用@Qualifier注解手动指定要装配的bean的id
[5]如果设置@Autowired注解的required属性为false,则不勉强装配属性,如果能够装配则装配,如果不能装配则不装配。
二:AOP
1.AOP概念:Aspect Oriented Programming 面向切面编程
2.作用:本质上来说是一种简化代码的方式
②提供简单实现
③在简单实现的基础上让每一个计算方法都能够打印日志
④缺陷
[1]手动添加日志繁琐,重复
[2]统一修改不便
[3]对目标方法本来要实现的核心功能有干扰,使程序代码很臃肿,不易于开发维护
⑤使用动态代理实现
[1]创建一个类,让这个类能够提供一个目标对象的代理对象
[2]在代理对象中打印日志
4.在Spring中使用AOP实现日志功能
①Spring中可以使用注解或XML文件配置的方式实现AOP。
②导入jar包
commons-logging-1.1.3. jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE. jar
③开启基于注解的AOP功能:<aop:aspectj-autoproxy/>
④声明一个切面类,并把这个切面类加入到IOC容器中
⑤在切面类中声明通知方法
[1]前置通知:@Before
[2]返回通知:@AfterReturning
[3]异常通知:@AfterThrowing
[4]后置通知:@After
[5]环绕通知:@Around
⑥被代理的对象也需要加入IOC容器
5.切入点表达式:execution(public int com.atguigu.aop.target.EazyImpl.add(int,int))
6.统一声明切入点表达式:
@Pointcut(value="execution(public int com.atguigu.aop.target.EazyImpl.add(int,int))")
public void myPointCut(){}
7.通知方法的细节
①在前置通知中获取目标方法的方法名和参数列表
[1]在通知方法中声明一个JoinPoint类型的形参
[2]调用JoinPoint对象的getSignature()方法获取目标方法的签名
[3]调用JoinPoint对象的getArgs()方法获取目标方法的实际参数列表
②在返回通知中获取方法的返回值
[1]在@AfterReturning注解中添加returning属性:@AfterReturning(value="myPointCut()",returning="result")
[2]在返回通知的通知方法中声明一个形参,形参名和returning属性的值一致:
showReturnLog(JoinPoint joinPoint, Objectresult)
③在异常通知中获取异常对象
[1]在@ AfterThrowing注解中添加throwing属性:
@AfterThrowing(value="myPointCut()",throwing="throwable")
[2]在异常通知的通知方法中声明一个形参,形参名和throwing属性值一致:
showExceptinLog(JoinPoint joinPoint, Throwablethrowable)
8.真正放在IOC容器中的对象是代理对象,而并不是目标对象本身
9.切面的优先级
对于同一个代理对象,可以同时有多个切面共同对它进行代理。
可以通过@Order (value=50)注解来进行设置,值越小优先级越高
SSM-Spring基础
原文:http://www.cnblogs.com/YeShao233/p/7643294.html