最全面解析Spring框架IOC容器和AOP面向切面

本文详细介绍了Spring框架的核心特性,包括IOC容器的三种注入方式(set、构造器、注解),以及面向切面编程AOP的概念和应用场景。文中详细解释了AOP的切面、通知、连接点等概念,并展示了事务管理的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Spring开源框架的简介

  • Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。【参考文献】
  • 它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
  • 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架
  • spring的基本框架主要包含六大模块:DAO、ORM、AOP、JEE、WEB、CORE

  • Spring DAO:Spring提供了对JDBC的操作支持:JdbcTemplate模板工具类 。

  • Spring ORM:Spring可以与ORM框架整合。例如Spring整合Hibernate框架,其中Spring还提供HibernateDaoSupport工具类,简化了Hibernate的操作 。

  • Spring WEB:Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案 。

  • Spring AOP:Spring提供面向切面的编程,可以给某一层提供事务管理,例如在Service层添加事物控制 。

  • Spring JEE:J2EE开发规范的支持,例如EJB 。

  • Spring Core:提供IOC容器对象的创建和处理依赖对象关系 。

二、Spring下IOC容器和DI(依赖注入Dependency injection)

  • IOC容器:就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring容器来做。。在Spring中BeanFactory是IOC容器的实际代表者。【参考文献】

  • DI(依赖注入Dependency injection) :在容器创建对象后,处理对象的依赖关系。

  • 依赖注入spring的注入方式:

    • set注入方式
    • 静态工厂注入方式
    • 构造方法注入方式
    • 基于注解的方式

1、set注入方式:

  • 控制层代码


private OrderServiceImp orderService;
    
public void setOrderService(OrderServiceImp orderService) {
   
   
       this.orderService = orderService;
}


  • Spring配置XML文件:其中配置声明OrderAction类存在属性orderService。程式运行时候,会将已经实例化的orderService对象调用setOrderService方式注入。
<bean name="orderAction" class="com.pec.action.OrderAction">
        <property name="orderService" ref="orderService"></property>
</bean>
<bean name="orderService" class="com.pec.service.imp.OrderServiceImp"></bean>

2、构造器注入方式:

控制层代码:



private OrderServiceImp orderService;
    
public OrderAction(OrderServiceImp orderService) {
   
   
        this.orderService = orderService;
    }


  • Spring配置XML文件:

3、基于注解的方式(推荐使用,比较便捷少配置)

控制层代码

@Autowired   //@Resource
private OrderServiceImp orderService;

服务层代码:

//欢迎大家进Java学习交流君样:665845932 一起交流 一起吹水~
@Service("orderService")
public class OrderServiceImp implements IOrderService {
   
   

    @Autowired
    private JavaOrderMDaoImp javaOrderMDao;

    @Autowired
    private JavaOrderDDaoImp javaOrderDDao;

    @Override
    public List<JavaOrderMList> findOrderM(OrderSearch search) {
   
   
        return javaOrderMDao.findJavaOrderM(search);
    }

    @Override
    public List<JavaOrderDList> findOrderD(OrderSearch search) {
   
   
        return javaOrderDDao.findJavaOrderD(search);
    }

}

DAO层代码:

//欢迎大家进Java学习交流君样:665845932 一起交流 一起吹水~
@Repository("javaOrderMDao")
public class JavaOrderMDaoImp extends BaseHibernateDAO<JavaOrderM, Serializable> implements IJavaOrderMDao {
   
   ...}

@Repository("javaOrderDDao")
public class JavaOrderDDaoImp extendsBaseHibernateDAO<JavaOrderD, Serializable> implements IJavaOrderDDao {
   
   ...}
  • 注意点:

  • ⑴ 持久层DAO层注解Repository中规定了名称,在Service层中声明名称必须一致。

  • ⑵ 服务层Service层注解Service中规定了名称,在控制层中声明的名称必须一致。

  • ⑶ 注解方式注入依赖注解:

//欢迎大家进Java学习交流君样:665845932 一起交流 一起吹水~
@Component         把对象加入ioc容器,对象引用名称是类名,第一个字母小写
@Component(“name”) 把指定名称的对象,加入ioc容器
@Repository        主要用于标识加入容器的对象是一个持久层的组件()
@Service           主要用于标识加入容器的对象是一个业务逻辑层的组件
@Controller        主要用于标识加入容器的对象是一个控制层的组件
@Resource          注入属性(DI), 会从容器中找对象注入到@Resource修饰的对象上
@Autowired         注入属性(DI), 会从容器中找对象注入到@Autowired修饰的对象上

三、Spring下面向切面编程(AOP)和事务管理配置

  • AOP就是纵向的编程,如业务1和业务2都需要一个共同的操作,与其往每个业务中都添加同样的代码,不如写一遍代码,让两个业务共同使用这段代码。在日常有订单管理、商品管理、资金管理、库存管理等业务,都会需要到类似日志记录、事务控制、权限控制、性能统计、异常处理及事务处理等。
  • AOP把所有共有代码全部抽取出来,放置到某个地方集中管理,然后在具体运行时,再由容器动态织入这些共有代码。

](https://jq.qq.com/?_wv=1027&k=xbEmPwvE)

  • AOP涉及名称:

  • 切面(Aspect):其实就是共有功能的实现。如日志切面、权限切面、事务切面等。在实际应用中通常是一个存放共有功能实现的普通Java类,之所以能被AOP容器识别成切面,是在配置中指定的。

  • 通知(Advice):是切面的具体实现。以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种。在实际应用中通常是切面类中的一个方法,具体属于哪类通知,同样是在配置中指定的。

  • 连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出或字段修改等,但Spring只支持方法级的连接点。

  • 切入点(Pointcut):用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。

  • 目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码了,所有的共有功能代码等待AOP容器的切入。

  • 代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。

  • 织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现。

  • Spring使用AOP配置事务管理由三个部分组成,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
    - spring事务配置的五种方式:每个Bean都有一个代理、所有Bean共享一个代理基类、使用拦截器、使用tx标签配置的拦截器、全注解

1、使用tx标签配置的拦截器

<!--4、配置hibernate属性 -->
    <!--引入db.properties属性文件 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:db.properties"></property>
    </bean>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值