Spring 二次核心容器
·
Beans, Core, Context
控制反转(IoC)
-
定义:将对象的创建和依赖关系的控制权从程序代码"反转"到容器(如 Spring 容器)
-
作用:由容器负责对象的生命周期管理和依赖注入
面向切面编程(AOP)
-
定义:将横切关注点(如日志、事务)模块化为"切面"
-
过程:在需要时,容器将切面代码"织入"到指定的业务方法中
注解说明
组件注解
| 注解 | 用途 | 说明 |
|---|---|---|
@Component |
通用组件 | 定义Bean组件 |
@Repository |
DAO层 | 标记数据访问类 |
@Service |
业务层 | 标记业务逻辑类 |
@Controller |
控制层 | 标记控制器类 |
依赖注入注解
-
@Autowired+@Qualifier('name')≡@Resource(name = 'name')
XML配置命名空间
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
AOP核心概念
切入点(Pointcut)
-
作用:定义在哪些类、哪些方法上织入增强
-
位置:Where(在哪里)
增强(Advice)
-
作用:定义在方法执行的什么时机执行什么操作
-
时机:When(什么时间)
-
内容:What(做什么)
切面(Aspect)
-
公式:切面 = 切入点 + 增强
-
织入(Weaving):把切面应用到目标对象的过程(由Spring实现)
增强类型
| 增强类型 | 说明 | 执行时机 |
|---|---|---|
| 前置增强 | 在方法执行之前执行 | before |
| 后置增强 | 方法成功完成后执行 | after-returning |
| 最终增强 | 方法执行后,无论结果如何都执行 | after |
| 异常增强 | 方法抛出异常时执行 | after-throwing |
| 环绕增强 | 在方法执行前后都执行 | around |
AOP配置命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
AOP配置示例
XML配置方式
<!-- 定义切入点 -->
<aop:config>
<aop:pointcut id="pointcut" expression="execution(public void show())"/>
<!-- 定义切面 -->
<aop:aspect ref="serviceLogger">
<!-- 前置增强 -->
<aop:before method="before" pointcut-ref="pointcut"/>
<!-- 后置增强 -->
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result"/>
</aop:aspect>
</aop:config>
切入点表达式示例
-
execution(public * entity.User.*(..)):User类的所有public方法 -
execution(* addNewUser(..)):addNewUser方法 -
execution(* com.service.*.*(..)):service包下所有类的所有方法 -
execution(* com.service..*.*(..)):service包及其子包下所有类的所有方法
🎯 注解方式定义切面
@Aspect
@Component
public class UserServiceLogger {
private static final Logger log = Logger.getLogger(UserServiceLogger.class);
@Pointcut("execution(* com.service.UserService.*(..))")
public void pointcut() {}
@Before("pointcut()")
public void before(JoinPoint jp) {
log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
+ " 方法,方法参数:" + Arrays.toString(jp.getArgs()));
}
@AfterReturning(pointcut = "pointcut()", returning = "returnValue")
public void afterReturning(JoinPoint jp, Object returnValue) {
log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
+ " 方法,方法返回值:" + returnValue);
}
}
启用注解驱动
<aop:aspectj-autoproxy/>
事务管理
事务管理器配置
<!-- 定义事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
事务切面配置
<aop:config>
<aop:pointcut id="serviceMethod"
expression="execution(* com.lrs.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
💡 关键要点
-
IoC:控制反转,容器管理对象生命周期
-
AOP:面向切面编程,分离横切关注点
-
注解驱动:简化配置,提高开发效率
-
事务管理:确保数据一致性和完整性
更多推荐
所有评论(0)