Spring AOP与IoC
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容器对象的创建和处理依赖对象关系 。
IoC
概述
IOC(Inversion of Control),就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,即“控制反转”,是指new实例工作不由程序员来做而是交给Spring容器来做。。在Spring中BeanFactory是IOC容器的实际代表者。另外一种说法叫DI(Dependency Injection),即依赖注入。在容器创建对象后,处理对象的依赖关系。它并不是一种技术实现,而是一种设计思想。在任何一个有实际开发意义的程序项目中,我们会使用很多类来描述它们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑。这个时候,每个类都需要负责管理与自己有交互的类的引用和依赖,代码将会变的异常难以维护和极度的高耦合。而IOC的出现正是用来解决这个问题,我们通过IOC将这些相互依赖对象的创建、协调工作交给Spring容器去处理,每个对象只需要关注其自身的业务逻辑关系就可以了。在这样的角度上来看,获得依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其他对象和文件资料等等)。
IoC思想
在传统实现中,我们都是通过应用程序自己来管理依赖的创建,例如下代码.
public class Person {
// 由Person自己管理Food类的创建
public void eat() {
Food food = new Chicken();
System.out.println("I am eating " + food.getName() + "...");
}
}
而
IoC
则是通过一个第三方容器来管理并维护这些被依赖对象,应用程序只需要接收并使用IoC容器注入的对象而不需要关注其他事情.
public class Person {
private Food food;
// 通过set注入
public void setFood(Food food) {
this.food = food;
}
// Person不需要关注Food,只管使用即可
public void eat() {
System.out.println("I am eating " + this.food.getName() + "...");
}
}
控制反转其实就是对象控制权的转移,应用程序将对象的控制权转移给了第三方容器并通过它来管理这些被依赖对象,完成了应用程序与被依赖对象的解耦.
注入方式
- set注入方式:实现特定属性的public set()方法,来让
IoC
容器调用注入所依赖类型的对象.- 静态工厂注入方式: 实现特定接口以供
IoC
容器注入所依赖类型的对象.- 构造方法注入方式 : 实现特定参数的构造函数,在创建对象时来让
IoC
容器注入所依赖类型的对象.- 基于注解的方式: 通过
Java
的注解机制来让IoC
容器注入所依赖类型的对象,例如Spring
框架中的@Autowired
.
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>
构造器注入方式
控制层
private OrderServiceImp orderService;
public OrderAction(OrderServiceImp orderService) {
this.orderService = orderService;
}
XML
<bean name="orderAction" class="com.pec.action.OrderAction">
<constructor-arg ref="orderService"></constructor-arg>
</bean>
<bean name="orderService" class="com.pec.service.imp.OrderServiceImp"></bean>
基于注解的方式(推荐)
控制层
@Autowired //@Resource
private OrderServiceImp orderService;
服务层
@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
@Repository("javaOrderMDao")
public class JavaOrderMDaoImp extends BaseHibernateDAO<JavaOrderM, Serializable> implements IJavaOrderMDao {
...}
@Repository("javaOrderDDao")
public class JavaOrderDDaoImp extendsBaseHibernateDAO<JavaOrderD, Ser