javascript
Spring Aop 切点表达式
???在Spring AOP?中,通常需要借助AspectJ?的切點(diǎn)表達(dá)式語言來定義切點(diǎn)。重要的是Spring?中僅支持AspectJ切點(diǎn)指示器的一個(gè)子集。
Spring?支持的AspectJ的切點(diǎn)指示器
| AspectJ?指示器 | 描述 |
| args() | 限制連接點(diǎn)匹配參數(shù)為執(zhí)行類型的執(zhí)行方法 |
| @args() | 限制連接點(diǎn)匹配參數(shù)由執(zhí)行注解標(biāo)注的執(zhí)行方法 |
| execution() | 匹配連接點(diǎn)的執(zhí)行方法 |
| this() | 限制連接點(diǎn)匹配AOP代理的Bean引用類型為指定類型的Bean |
| target() | 限制連接點(diǎn)匹配目標(biāo)對(duì)象為指定類型的類 |
| @target() | 限制連接點(diǎn)匹配目標(biāo)對(duì)象被指定的注解標(biāo)注的類 |
| within() | 限制連接點(diǎn)匹配匹配指定的類型 |
| @within() | 限制連接點(diǎn)匹配指定注解標(biāo)注的類型 |
| @annotation | 限制匹配帶有指定注解的連接點(diǎn) |
?
Spring AOP?中常用的是:
Java代碼?
execution(modifiers-pattern??ret-type-pattern?declaring-type-pattern??name-pattern(param-pattern)??
??????????throws-pattern?)??
?匹配所有
???????execution("* *.*(..)")
匹配所有以set開頭的方法
????????execution("* *.set*(..))
匹配指定包下所有的方法
????????execution("*?com.david.biz.service.impl.*(..))
匹配指定包以及其子包下的所有方法
????????execution("* com.david..*(..)")
匹配指定包以及其子包下?參數(shù)類型為String?的方法
????????execution("* com.david..*(java.lang.String))
?
?
Java代碼?
<?xml?version="1.0"?encoding="UTF-8"?>??
<beans?xmlns="http://www.springframework.org/schema/beans"??
????xmlns:p="http://www.springframework.org/schema/p"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
????xmlns:context="http://www.springframework.org/schema/context"?xmlns:tx="http://www.springframework.org/schema/tx"??
????xmlns:aop="http://www.springframework.org/schema/aop"?xmlns:jee="http://www.springframework.org/schema/jee"??
????xmlns:task="http://www.springframework.org/schema/task"??
????xsi:schemaLocation="??
????????http://www.springframework.org/schema/beans??
????????http://www.springframework.org/schema/beans/spring-beans-3.0.xsd??
????????http://www.springframework.org/schema/context??
????????http://www.springframework.org/schema/context/spring-context-3.0.xsd??
????????http://www.springframework.org/schema/aop???
????????http://www.springframework.org/schema/aop/spring-aop-3.0.xsd??
????????http://www.springframework.org/schema/tx??
????????http://www.springframework.org/schema/tx/spring-tx-3.0.xsd??
????????http://www.springframework.org/schema/jee???
????????http://www.springframework.org/schema/jee/spring-jee-3.0.xsd??
????????http://www.springframework.org/schema/task????
????????http://www.springframework.org/schema/task/spring-task-3.1.xsd????
????????">??
????<context:component-scan?base-package="com.david.*"/>??
????<aop:aspectj-autoproxy?/>??
????<context:property-placeholder?location="classpath:META-INF/config.properties"?/>??
????<!--?定義數(shù)據(jù)源?-->??
????<bean?id="dataSource"?class="com.mchange.v2.c3p0.ComboPooledDataSource"??
????????destroy-method="close">??
????????<property?name="driverClass"?value="${jdbc.ams.driver}"?/>??
????????<property?name="jdbcUrl"?value="${jdbc.ams.url}"?/>??
????????<property?name="user"?value="${jdbc.ams.username}"?/>??
????????<property?name="password"?value="${jdbc.ams.password}"?/>??
????????<property?name="initialPoolSize"?value="${initialSize}"?/>??
????????<property?name="minPoolSize"?value="${minPoolSize}"?/>??
????????<property?name="maxPoolSize"?value="${maxActive}"?/>??
????????<property?name="acquireIncrement"?value="${acquireIncrement}"?/>??
????????<property?name="maxIdleTime"?value="${maxIdleTime}"?/>??
????</bean>??
??
????<!--?定義jdbc模板類?-->??
????<bean?id="jdbcTemplate"?class="org.springframework.jdbc.core.JdbcTemplate">??
????????<property?name="dataSource"?ref="dataSource"?/>??
????</bean>??
??
????<bean?id="sqlMapClient"?class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">??
????????<property?name="dataSource"?ref="dataSource"?/>??
????????<property?name="configLocation"?value="classpath:META-INF/sqlmap/sqlmap.xml"?/>??
????</bean>??
??
????<tx:advice?id="txAdvice"?transaction-manager="transactionManager">??
????????<tx:attributes>??
????????????<tx:method?name="addBook"?propagation="REQUIRED"?/>??
????????????<tx:method?name="addUserBook"?propagation="MANDATORY"?/>??
????????????<tx:method?name="deleteBook"?propagation="REQUIRES_NEW"?/>??
????????????<tx:method?name="addNewBook"?propagation="NEVER"?/>??
????????????<tx:method?name="addUser"?propagation="NESTED"?/>??
????????</tx:attributes>??
????</tx:advice>??
????<bean?id="transactionManager"??
????????class="org.springframework.jdbc.datasource.DataSourceTransactionManager">??
????????<property?name="dataSource"?ref="dataSource"?/>??
????</bean>??
??????
</beans>??
?
?
Java代碼?
@Service("bookService")??
public?class?BookServiceImpl?implements?BookService?{??
??
????private?static?final?Logger?logger??????=?LogManager.getLogger(BookServiceImpl.class);??
????public?static?final?String??ADD_BOOK????=?"insert?into?t_book(id,name)?values(1,'duck-j2ee')";??
??
????public?static?final?String??DELETE_BOOK?=?"delete?from??t_book?where?id=1";??
??
????private?JdbcTemplate????????jdbcTemplate;??
????@Autowired??
????private?BookDao?????????????bookDao;??
??
????public?void?addBook()?throws?Exception?{??
????????Book?book?=?new?Book();??
????????book.setName("ibatis");??
????????book.setPrice(11);??
????????bookDao.insert(book);??
????????throw?new?UnRollbackException("受檢查異常,不會(huì)回滾");??
????}??
??
????public?void?deleteBook(int?id)?{??
????????try?{??
????????????bookDao.deleteById(id);??
????????}?catch?(SQLException?e)?{??
????????????logger.error("",?e);??
????????}??
????}??
??
????@LoggingRequired??
????public?void?addNewBook(String?name,?int?price)?{??
????????try?{??
????????????Book?book?=?new?Book();??
????????????book.setName(name);??
????????????book.setPrice(price);??
????????????bookDao.insert(book);??
????????????List<Book>?lists?=?bookDao.selectAll();??
????????????System.out.println(lists);??
????????}?catch?(SQLException?e)?{??
????????????logger.error("",?e);??
????????}??
????}??
??
????public?void?addUserBook()?{??
????????jdbcTemplate.execute("insert?into?t_book(id,name)?values(3,'UserBook')");??
????}??
??
????/**?
?????*?Setter?method?for?property?<tt>jdbcTemplate</tt>.?
?????*?
?????*?@param?jdbcTemplate?value?to?be?assigned?to?property?jdbcTemplate?
?????*/??
????public?void?setJdbcTemplate(JdbcTemplate?jdbcTemplate)?{??
????????this.jdbcTemplate?=?jdbcTemplate;??
????}??
??
????/**?
?????*?@see?com.david.biz.service.BookService#queryAll()?
?????*/??
????public?List<Book>?queryAll()?{??
????????try?{??
????????????return?bookDao.selectAll();??
????????}?catch?(SQLException?e)?{??
????????????logger.error("",?e);??
????????}??
????????return?null;??
????}??
??
}??
?
?
Java代碼?
/**?
?*?execution(modifiers-pattern??ret-type-pattern?declaring-type-pattern??name-pattern(param-pattern)?
??????????throws-pattern?)?
?*arg()??限制連接點(diǎn)匹配參數(shù)為指定類型的執(zhí)行方法?
?*@args()?限制連接點(diǎn)匹配參數(shù)由執(zhí)行注解標(biāo)注的執(zhí)行?
?*execution()?用于匹配連接點(diǎn)的執(zhí)行方法?
?*this()?限制連接點(diǎn)匹配AOP代理的Bean引用為執(zhí)行類型的類?
?*target()?限制連接點(diǎn)匹配目標(biāo)對(duì)象為指定類型的類?
?*@target()?限制連接點(diǎn)匹配特定的執(zhí)行對(duì)象,這些對(duì)象應(yīng)具備指定的注解類型?
?*@annotation()限制匹配帶有指定注解的連接點(diǎn)?
?*?
?*?
?*?
?*?@author?zhangwei_david?
?*?@version?$Id:?LogAspect.java,?v?0.1?2014年11月29日?下午1:10:13?zhangwei_david?Exp?$?
?*/??
@Component??
@Aspect??
public?class?LogAspect?{??
????private?static?final?Logger?logger?=?LogManager.getLogger(LogAspect.class);??
??
????/**?
?????*?匹配參數(shù)是任何類型,任何數(shù)量?且在com,david.biz包或子包下的方法?
?????*/??
????@Pointcut("args(..)&&within(com.david.biz..*)")??
????public?void?arg()?{??
??
????}??
??
????@Pointcut("@args(com.david.aop.LoggingRequired)")??
????public?void?annotationArgs()?{??
??
????}??
??
????@Pointcut("@annotation(com.david.aop.LoggingRequired)")??
????public?void?logRequiredPointcut()?{??
??
????}??
??
????@Pointcut("args(java.lang.String,*)")??
????public?void?argsWithString()?{??
??
????}??
??
????@Pointcut("target(com.david.biz.service.impl.BookServiceImpl)")??
????public?void?targetPointcut()?{??
??
????}??
??
????@Pointcut("@target(org.springframework.stereotype.Service)")??
????public?void?targetAnnotation()?{??
??
????}??
??
????//????@Around("execution(*?org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(..))")??
????//????public?Object?aa(ProceedingJoinPoint?pjp)?throws?Throwable?{??
????//????????try?{??
????//????????????Object?retVal?=?pjp.proceed();??
????//????????????System.out.println(retVal);??
????//????????????return?retVal;??
????//????????}?catch?(Exception?e)?{??
????//????????????System.out.println("異常");??
????//????????????return?null;??
????//????????}??
????//????}??
????@Before(value?=?"logRequiredPointcut()")??
????public?void?before(JoinPoint?joinPoint)?{??
????????LogUtils.info(logger,??
????????????"?連接點(diǎn)表達(dá)式@annotation(com.david.aop.LoggingRequired)?-?method={0}?has?been?visited",??
????????????joinPoint.getSignature().getName());??
????}??
??
????@Before(value?=?"arg()")??
????public?void?beforeArg(JoinPoint?joinPoint)?{??
????????LogUtils.info(logger,??
????????????"連接點(diǎn)表達(dá)式:args(..)&&within(com.david.biz..*)??method?={0},?args?={1},target={2}",??
????????????joinPoint.getSignature().getName(),?ToStringBuilder.reflectionToString(??
????????????????joinPoint.getArgs(),?ToStringStyle.SHORT_PREFIX_STYLE),?joinPoint.getTarget()??
????????????????.getClass().getName());??
????}??
??
????@Before(value?=?"argsWithString()")??
????public?void?beforeArgWithString(JoinPoint?joinPoint)?{??
????????LogUtils.info(logger,?"連接點(diǎn)表達(dá)式:args(java.lang.String,*)??method={0}?,args?={1},target={2}",??
????????????joinPoint.getSignature().getName(),?ToStringBuilder.reflectionToString(??
????????????????joinPoint.getArgs(),?ToStringStyle.SHORT_PREFIX_STYLE),?joinPoint.getTarget()??
????????????????.getClass().getName());??
????}??
??
????@Before(value?=?"annotationArgs()")??
????public?void?beforeAnnotationArgs(JoinPoint?joinPoint)?{??
????????LogUtils??
????????????.info(??
????????????????logger,??
????????????????"連接點(diǎn)表達(dá)式:@args(com.david.annotation.validate.Length,*)??method={0}?,args?={1},target={2}",??
????????????????joinPoint.getSignature().getName(),?ToStringBuilder.reflectionToString(??
????????????????????joinPoint.getArgs(),?ToStringStyle.SHORT_PREFIX_STYLE),?joinPoint.getTarget()??
????????????????????.getClass().getName());??
????}??
??
????@Before(value?=?"targetPointcut()")??
????public?void?beforeTarget(JoinPoint?joinPoint)?{??
????????LogUtils??
????????.info(??
????????????logger,??
????????????"連接點(diǎn)表達(dá)式:target(com.david.biz.service.impl.BookServiceImpl)??method={0}?,args?={1},target={2}",??
????????????joinPoint.getSignature().getName(),?ToStringBuilder.reflectionToString(??
????????????????joinPoint.getArgs(),?ToStringStyle.SHORT_PREFIX_STYLE),?joinPoint.getTarget()??
????????????????.getClass().getName());??
????}??
??
????@Before(value?=?"?targetAnnotation()")??
????public?void?beforeTargetAnnotation(JoinPoint?joinPoint)?{??
????????LogUtils??
????????????.info(??
????????????????logger,??
????????????????"連接點(diǎn)表達(dá)式:@target(org.springframework.stereotype.Service)??method={0}?,args?={1},target={2}",??
????????????????joinPoint.getSignature().getName(),?ToStringBuilder.reflectionToString(??
????????????????????joinPoint.getArgs(),?ToStringStyle.SHORT_PREFIX_STYLE),?joinPoint.getTarget()??
????????????????????.getClass().getName());??
????}??
}??
?
Java代碼?
/**?
?*?
?*?@author?zhangwei_david?
?*?@version?$Id:?T.java,?v?0.1?2014年12月1日?上午9:35:44?zhangwei_david?Exp?$?
?*/??
@RunWith(SpringJUnit4Cla***unner.class)??
@ContextConfiguration(locations?=?"file:H:/workspace4study/WebApp/src/main/webapp/WEB-INF/applicationContext.xml")??
public?class?BookServiceTest?{??
??
????@Autowired??
????private?BookService?bookService;??
??
????@Test??
????public?void?testB()?{??
????????bookService.addNewBook("Junit??Test",?1000);??
????}??
??
}??
?
?
Java代碼?
2014-12-01?11:14:39??[?main:1577?]?-?[?INFO?]???連接點(diǎn)表達(dá)式@annotation(com.david.aop.LoggingRequired)?-?method=addNewBook?has?been?visited??
2014-12-01?11:14:39??[?main:1587?]?-?[?INFO?]??連接點(diǎn)表達(dá)式:args(..)&&within(com.david.biz..*)??method?=addNewBook,?args?=Object[][{Junit??Test,1000}],target=com.david.biz.service.impl.BookServiceImpl??
2014-12-01?11:14:39??[?main:1588?]?-?[?INFO?]??連接點(diǎn)表達(dá)式:args(java.lang.String,*)??method=addNewBook?,args?=Object[][{Junit??Test,1000}],target=com.david.biz.service.impl.BookServiceImpl??
2014-12-01?11:14:39??[?main:1588?]?-?[?INFO?]??連接點(diǎn)表達(dá)式:target(com.david.biz.service.impl.BookServiceImpl)??method=addNewBook?,args?=Object[][{Junit??Test,1000}],target=com.david.biz.service.impl.BookServiceImpl??
2014-12-01?11:14:39??[?main:1589?]?-?[?INFO?]??連接點(diǎn)表達(dá)式:@target(org.springframework.stereotype.Service)??method=addNewBook?,args?=Object[][{Junit??Test,1000}],target=com.david.biz.service.impl.BookServiceImpl??
2014-12-01?11:14:39??[?main:1589?]?-?[?INFO?]??連接點(diǎn)表達(dá)式:args(..)&&within(com.david.biz..*)??method?=insert,?args?=Object[][{Book[id=0,name=Junit??Test,price=1000]}],target=com.david.biz.dao.impl.BookDaoImpl??
2014-12-01?11:14:39??[?main:1590?]?-?[?INFO?]??連接點(diǎn)表達(dá)式:@args(com.david.annotation.validate.Length,*)??method=insert?,args?=Object[][{Book[id=0,name=Junit??Test,price=1000]}],target=com.david.biz.dao.impl.BookDaoImpl??
2014-12-01?11:14:39??[?main:1591?]?-?[?INFO?]??連接點(diǎn)表達(dá)式:args(java.lang.String,*)??method=insert?,args?=Object[][{demo.insert,Book[id=0,name=Junit??Test,price=1000]}],target=com.ibatis.sqlmap.engine.impl.SqlMapClientImpl??
?
?
萌萌的IT人轉(zhuǎn)載于:https://blog.51cto.com/jlins/1585172
總結(jié)
以上是生活随笔為你收集整理的Spring Aop 切点表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【POJ】3255 Roadblocks
- 下一篇: 《python cookbook》cha