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>

💡 关键要点

  1. IoC:控制反转,容器管理对象生命周期

  2. AOP:面向切面编程,分离横切关注点

  3. 注解驱动:简化配置,提高开发效率

  4. 事务管理:确保数据一致性和完整性

更多推荐