1、oop是java在面向?qū)ο缶幊?br>
aop是面向切面編程,AOP主要應(yīng)用于日志記錄陆馁,性能統(tǒng)計(jì)找颓,安全控制,事務(wù)處理等方面,它是為程序員解耦而生.
Spring五種類型的通知
1、前置通知[Before advice]:在連接點(diǎn)前面執(zhí)行叮贩,前置通知不會(huì)影響連接點(diǎn)的執(zhí)行击狮,除非此處拋出異常。
3益老、正常返回通知[After returning advice]:在連接點(diǎn)正常執(zhí)行完成后執(zhí)行彪蓬,如果連接點(diǎn)拋出異常,則不會(huì)執(zhí)行杨箭。
3寞焙、異常返回通知[After throwing advice]:在連接點(diǎn)拋出異常后執(zhí)行。
4互婿、返回通知[After (finally) advice]:在連接點(diǎn)執(zhí)行完成后執(zhí)行,不管是正常執(zhí)行完成辽狈,還是拋出異常慈参,都會(huì)執(zhí)行返回通知中的內(nèi)容。
5刮萌、環(huán)繞通知[Around advice]:環(huán)繞通知圍繞在連接點(diǎn)前后驮配,比如一個(gè)方法調(diào)用的前后。這是最強(qiáng)大的通知類型着茸,能在方法調(diào)用前后自定義一些操作壮锻。環(huán)繞通知還需要負(fù)責(zé)決定是繼續(xù)處理join point(調(diào)用ProceedingJoinPoint的proceed方法)還是中斷執(zhí)行。
aop全注解開發(fā)
注解名 說明
@Controller 注解控制層組件涮阔,(如struts中的action)
@Service 注解業(yè)務(wù)層組件,service層組件
(@Service("service")
public class StudentServiceImpl implements StudentService {)
@Repository 注解數(shù)據(jù)訪問層組件猜绣,DAO層組件
(@Repository("dao")
public class StudentDaoImpl implements StudentDao {)
@Component 泛指組件,當(dāng)組件不好歸類的時(shí)候敬特,我們可以使用這個(gè)注解進(jìn)行標(biāo)注
@Autowired 默認(rèn)是按照類型裝配注入
@Resource 默認(rèn)是按照名稱來裝配注入
(@Resource //或@Autowired
private StudentDaoImpl db;)
@Scope 注解用于指定scope作用域的(用在類上)
@Transactional 添加事務(wù)
service下面
注解配置AOP
1)使用注解@Aspect來定義一個(gè)切面掰邢,在切面中定義切入點(diǎn)(@Pointcut),通知類型(@Before牺陶、 @After 、@AfterReturning 辣之、@AfterThrowing 掰伸、@Around )
2)開發(fā)需要被攔截的類
http://blog.csdn.net/sunlihuo/article/details/52701548
@Aspect
@Component("aop")// 泛指組件當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注(可以不寫名字@Component)
public class AspInterceptor {
@Before("execution(* com.hw.service..*.add*(com.hw.entity.Student))")
public void before() {/*前置通知*/System.out.println("before....使用本程序先交9美金!!!");}
@After("execution(* com.hw.service.impl.*.add*(String))")
public void after() {/*正常返回通知*/System.out.println("after....程序使用正常9美金很值!!!");}
@AfterThrowing("execution(* com.hw.service.impl.*.*(..))")
public void afterthrowing() {/*異常返回通知*/System.out.println("throwing....程序使用有異常9美金上當(dāng)了!!!");}
@AfterReturning("execution(* com.hw.service.impl.*.add*(..))")
public void afterfinally() {/*返回最終通知*/System.out.println("afterfinally....別想著程序了怀估,9美金已交了!!!");}
@Around("execution(* com.hw.service.impl.*.update*(..))")
public void around(ProceedingJoinPoint pj) throws Throwable {// 環(huán)繞通知
System.out.println("環(huán)繞通知,要工作了");
pj.proceed();
System.out.println("環(huán)繞通知,要發(fā)工資了");
/*環(huán)繞通知:能在方法調(diào)用前后自定義一些操作狮鸭。環(huán)繞通知還需要負(fù) 責(zé)決定是繼續(xù)處理joinpoint(調(diào)用ProceedingJoinPoint的proceed方法)還是中斷執(zhí)行*/}}
3)將切面配置到xml中,也可以使用自動(dòng)掃描bean方式
service dao:<context:component-scan base-package="com.hw" />
aspect :<aop:aspectj-autoproxy proxy-target-class="true"/>(面向切面自動(dòng)代理)