面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面
面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。
aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码无关性
话不多说,我们直接来代码,加强理解
我们先看一个简单的例子:Spring AOP实现日志的输出,即后置增强和前置增强
我们看看代码
aop包下
我们要实现AfterReturningAdvice 接口
public class LoggerAfter implements AfterReturningAdvice {
//save()之后执行它
public void afterReturning(Object returnValue, Method method, Object[] arguments ,
Object target) throws Throwable {
System.out.println("===========后置增强代码==========");
}
}
前置,我们要实现MethodBeforeAdvice接口
*/
public class LoggerBefore implements MethodBeforeAdvice {
//获取日志对象
private static final Logger log = Logger.getLogger(LoggerBefore.class);
//save()之前执行它
public void before(Method method, Object[] arguments, Object target)
throws Throwable {
log.info("==========前置增强代码==========");
}
}
实现类:
biz:
public class UserBiz implements IUserBiz {
//实例化所依赖的UserDao对象,植入接口对象
private IDao dao;
public void save2(User user) {
//调用UserDao的方法保存信息
dao.save(user);
}
//dao 属性的setter访问器,会被Spring调用,实现设值注入
public IDao getDao() {
return dao;
}
public void setDao(IDao dao) {
this.dao = dao;
}
dao:
public class UserDao implements IDao {
/**
* 保存用户信息的方法
* @param user
*/
public void save(User user) {
System.out.println("save success!");
}
}
src下的applicationContext.xml
<!--配置实现类 -->
<bean/>
<bean>
<property ref="dao"></property>
</bean>
<!-- 定义前置增强组件 -->
<bean/>
<!-- 定义后置增强组件 -->
<bean/>
<!-- 代理对象 ProxyFactoryBean 代理工厂bean-->
<bean>
<property value="biz"></property>
<property value="loggerBefore,loggerAfter"></property>
</bean>
<!-- 针对AOP的配置
<aop:config>
execution:调用那个方法
<aop:pointcut expression="execution(public void save2(cn.wgy.day01.entity.User))"/>
将增强处理和切入点结合在一起,在切入点处插入增强处理,完成"织入"
<aop:advisor pointcut-ref="pointcut" advice-ref="loggerBefore"/>
<aop:advisor pointcut-ref="pointcut" advice-ref="loggerAfter"/>
</aop:config> -->
test
public static void main(String[] args) {