一、组件扫描
1.在classpath中扫描组件
(1)组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件
(2)特定组件包括:
@Component:基本注解,标识了一个受Spring管理的组件
@Respository:标识持久层组件
@Service:标识服务层(业务层)组件
@Controller:标识表现层组件
(3)对于扫描到的组件,Spring有默认的命名策略:使用非限定类名,第一个字母小写。也可以在注解中通过value属性值标识组件的名称
2.配置组件扫描
当在组件类上使用了特定的注解之后,还需要在Spring的配置文件中声明<context:component-scan>:
(1)base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包里及其子包中的所有类
(2)当需要扫描多个包时,可以使用逗号分隔
(3)如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,示例:

(4)<context:include-filter>子节点表示要包含的目标类
(5)<context:exclude-filter>子节点表示要排除在外的目标类
(6)<context:component-scan>下可以拥有若干个<context:include-filter>和<context:exclude-filter>子节点
3.使用注解创建bean
(1)定义UserService类,在类上加@Service注解

(2)在测试类中通过getBean方法来获取UserService的bean
4.spring执行解析注解的流程:
(1)加载配置文件
(2)读取配置文件中的扫包路径
(3)扫描该包下的所有类
(4)如果类上标注了spring的注解,则spring会给该类创建对象,存入容器
(5)对象的名字是采用该类的类名,且首字母小写
5.注解属性注入
(1)@Autowired注解自动装配具有兼容类型的单个Bean属性
构造器,普通字段(即使是非public),一切具有参数的方法都可以应用@Autowired注解
默认情况下,所有使用@Authwired注解的属性都需要被设置。当Spring找不到匹配的Bean装配属性时,会抛出异常,若某一属性允许不被设置,可以设置@Authwired注解的required属性为false
默认情况下,当IOC容器里存在多个类型兼容的Bean时,通过类型的自动装配将无法工作。此时可以在@Qualifiter注解里提供Bean的名称。Spring允许对方法的入参标注@Qualifiter已指定注入Bean的名称
(2)@Resourse注解要求提供一个Bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为Bean的名称
Resourse注解和Autowired注解区别:

6.事务管理
在方法上增加@Transactional注解,可以让spring帮我们处理事务的问题

二、AOP面向切面编程
1.AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统OOP(Object-Oriented Programming,面向对象编程)的补充
2.AOP的主要编程对象是切面(aspect),而切面模块化横切关注点
3.在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能在哪里,以什么方式应用,并且不必修改受影响的类。这样一来横切关注点就被模块化到特殊的对象(切面)里
4.AOP的好处:
(1)每个事物逻辑位于一个位置,代码不分散,便于维护和升级
(2)业务模块更简洁,只包含核心业务代码
5.问题分析


6.代码实现

7.这样实现的问题
(1)代码混乱:越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀。每个方法在处理核心逻辑的同时还必须兼顾其它多个关注点
(2)代码分散:以日志需求为例,只是为了满足这个单一需求,就不得不在多个模块(方法)里多次重复相同的日志代码。如果日志需求发生变化,必须修改所有模块

三、AOP术语
1.通知(Advice)
切面的工作被称为通知。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题
2.连接点(Join point)
连接点是在应用执行过程中能够插入切面的一个点
3.切点(Pointcut)
一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。如果说通知定义了切面的"什么"和"何时"的话,那么切点就定义了"何处"。因此,切点其实就是定义了需要执行在哪些连接点上执行通知
4.切面(Aspect)
切面是通知和切点的结合。通过和切点共同定义了切面的全部内容------它是什么,在何时和在何处完成其功能
5.引入(Introduction)
引入允许我们向现有的类添加新方法或属性
6.织入(Weaving)
织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有很多个点可以进行织入
四、配置AOP
1.引入aop需要的jar包
配置pom.xml文件

2.在applicationContext.xml文件中配置aop
<aop:aspect j-autoproxy/>
3.了解通知机制
- 前置通知(Before):在目标方法被调用之前调用通知功能
- 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么
- 返回通知(After-returning):在目标方法成功执行之后调用通知
- 异常通知(After-throwing):在目标方法抛出异常后调用通知
- 环绕通知(Around):通知包裹了被通知的方法
4.编写切面类:AspectTest1
参数JoinPoint可以用来获取方法名、方法参数等

5.在applicationContext.xml中增加aop配置

使用表达式来匹配需要被关联的方法
五、使用注解配置AOP
1.注解配置AOP

2.AOP执行顺序

对于多个切面类想要自己定义每个切面的执行顺序可以给类加上@Order注解
Order注解有value属性,该属性默认值是2147483647,值越小优先级越高