初見スプリング(十)
9574 ワード
spring代理のAOP代理
aop代理はspringの重いもので、ある時は面に向かってプログラミングすると言います.
aopプロキシは注釈構成とxml構成を使ってもいいです.まず注釈で構成します.
IUserDao.java
class cn.itcast.e_aop_anno.UserDao–コア業務:保存!!
第二のtest:
class cn.itcast.e_aop_anno.OrderDao
Enhancer ByCGLOIB
2235 e 357
前を折り返します
開始トランザクション/異常
—コア業務:保存!!――
折り返し後…
提出事務/クローズ
afterReturning()
第三のtest:これはだめです.
第四のtest:
[email protected]_aop_anno.OrderDao@1263db
aop代理はspringの重いもので、ある時は面に向かってプログラミングすると言います.
aopプロキシは注釈構成とxml構成を使ってもいいです.まず注釈で構成します.
IUserDao.java
package cn.itcast.e_aop_anno;
//
public interface IUserDao {
void save();
}
UserDao.javapackage cn.itcast.e_aop_anno;
import org.springframework.stereotype.Component;
/**
*
* @author Jie.Yuan
*
*/
@Component //
public class UserDao implements IUserDao{
@Override
public void save() {
System.out.println("----- : !!!------");
}
}
Order Dao.javapackage cn.itcast.e_aop_anno;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/**
*
* @author Jie.Yuan
*
*/
@Component("orderDao") //
@Scope("prototype")
public class OrderDao{
public void save() {
System.out.println("----- : !!!------");
}
}
AOPエージェントの作成package cn.itcast.e_aop_anno;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect //
public class Aop {
// : ;
@Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")
public void pointCut_(){
}
// :
@Before("pointCut_()")
public void begin(){
System.out.println(" / ");
}
// / : 【 】
@After("pointCut_()")
public void after(){
System.out.println(" / ");
}
// : 【 】
@AfterReturning("pointCut_()")
public void afterReturning() {
System.out.println("afterReturning()");
}
// :
@AfterThrowing("pointCut_()")
public void afterThrowing(){
System.out.println("afterThrowing()");
}
// :
@Around("pointCut_()")
public void around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println(" ....");
pjp.proceed(); //
System.out.println(" ....");
}
}
アプリ.javapackage cn.itcast.e_aop_anno;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
ApplicationContext ac =
new ClassPathXmlApplicationContext("cn/itcast/e_aop_anno/bean.xml");
// ,spring “JDK ”
@Test
public void testApp() {
IUserDao userDao = (IUserDao) ac.getBean("userDao");
System.out.println(userDao.getClass());//$Proxy001
userDao.save();
}
// , spring “cglib ”
@Test
public void testCglib() {
OrderDao orderDao = (OrderDao) ac.getBean("orderDao");
System.out.println(orderDao.getClass());
orderDao.save();
}
@Deprecated
// : , , 。
public void testApp2() {
// :
UserDao userDao = (UserDao) ac.getBean("userDao");
System.out.println(userDao.getClass());//$Proxy001
userDao.save();
}
@Test
public void testGetObj() throws Exception {
OrderDao orderDao1 = (OrderDao) ac.getBean("orderDao");
OrderDao orderDao2 = (OrderDao) ac.getBean("orderDao");
System.out.println(orderDao1);
System.out.println(orderDao2);
}
}
bean.xml
<context:component-scan base-package="cn.itcast.e_aop_anno">context:component-scan>
<aop:aspectj-autoproxy>aop:aspectj-autoproxy>
最初のtest:class cn.itcast.e_aop_anno.UserDao–コア業務:保存!!
第二のtest:
class cn.itcast.e_aop_anno.OrderDao
Enhancer ByCGLOIB
2235 e 357
前を折り返します
開始トランザクション/異常
—コア業務:保存!!――
折り返し後…
提出事務/クローズ
afterReturning()
第三のtest:これはだめです.
第四のtest:
[email protected]_aop_anno.OrderDao@1263db