Spring 注解方式配置app:
2016-04-23 14:30
375 查看
注解配置AOP(使用 AspectJ 类库实现的),大致分为三步:
1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around).
2. 开发需要被拦截的类。
3. 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式。这样的话,那就交由Spring AoP容器管理。
另外需要引用 aspectJ 的 jar 包: aspectjweaver.jar aspectjrt.jar
1 实体类:
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2 dao 接口类:
package com.bjsxt.dao;
import com.bjsxt.model.User;
public interface UserDAO {
public void save(User user);
}
3 dao 实现类
@Component("u")
public class UserDAOImpl implements UserDAO {
public void save(User user) {
System.out.println("user save11d!");
/*throw new RuntimeException("exception");*/ //抛异常
}
}
4 service 服务类
@Component("userService")
public class UserService {
private UserDAO userDAO;
public void init() {
System.out.println("init");
}
public void add(User user) {
userDAO.save(user);
}
public UserDAO getUserDAO() {
return userDAO;
}
@Resource(name="u")
public void setUserDAO( UserDAO userDAO) {
this.userDAO = userDAO;
}
public void destroy() {
System.out.println("destroy");
}
}
现在要对service 进行 aop 操作。
5 切面类:
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(public * com.bjsxt.service..*.add(..))")
public void myMethod(){};
@Before("myMethod()")
public void before() {
System.out.println("method staet");
}
@After("myMethod()")
public void after() {
System.out.println("method after");
}
@AfterReturning("execution(public * com.bjsxt.dao..*.*(..))")
public void AfterReturning() {
System.out.println("method AfterReturning");
}
@AfterThrowing("execution(public * com.bjsxt.dao..*.*(..))")
public void AfterThrowing() {
System.out.println("method AfterThrowing");
}
}
解释类:
1 : 定义一个 切点,名字是myMethod.
@Pointcut("execution(public * com.bjsxt.service..*.add(..))")
public void myMethod(){};
对应xml 配置: <aop:pointcut id="myMethod" expression="execution(public * com.bjsxt.service..*.add(..))" />
2 在myMethod切点执行之后,调用after 方法。
@After("myMethod()")
public void after() {
System.out.println("method after");
}
对应XML 配置:
<aop:after pointcut-ref="myMethod" method="after"/>
3 在切点 execution(public * com.bjsxt.dao..*.*(..)) 返回后,执行AfterReturning 方法。
@AfterReturning("execution(public * com.bjsxt.dao..*.*(..))")
public void AfterReturning() {
System.out.println("method AfterReturning");
}
对应 XML :
<aop:after-returning pointcut="execution(public * com.bjsxt.dao..*.*(..)) " method="afterReturning"/>
spring 配置文件。
<context:annotation-config />
<context:component-scan base-package="com.bjsxt"/> <!-- 自动扫描 -->
<aop:aspectj-autoproxy/> <!-- 要添加本行 -->
1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around).
2. 开发需要被拦截的类。
3. 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式。这样的话,那就交由Spring AoP容器管理。
另外需要引用 aspectJ 的 jar 包: aspectjweaver.jar aspectjrt.jar
1 实体类:
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2 dao 接口类:
package com.bjsxt.dao;
import com.bjsxt.model.User;
public interface UserDAO {
public void save(User user);
}
3 dao 实现类
@Component("u")
public class UserDAOImpl implements UserDAO {
public void save(User user) {
System.out.println("user save11d!");
/*throw new RuntimeException("exception");*/ //抛异常
}
}
4 service 服务类
@Component("userService")
public class UserService {
private UserDAO userDAO;
public void init() {
System.out.println("init");
}
public void add(User user) {
userDAO.save(user);
}
public UserDAO getUserDAO() {
return userDAO;
}
@Resource(name="u")
public void setUserDAO( UserDAO userDAO) {
this.userDAO = userDAO;
}
public void destroy() {
System.out.println("destroy");
}
}
现在要对service 进行 aop 操作。
5 切面类:
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(public * com.bjsxt.service..*.add(..))")
public void myMethod(){};
@Before("myMethod()")
public void before() {
System.out.println("method staet");
}
@After("myMethod()")
public void after() {
System.out.println("method after");
}
@AfterReturning("execution(public * com.bjsxt.dao..*.*(..))")
public void AfterReturning() {
System.out.println("method AfterReturning");
}
@AfterThrowing("execution(public * com.bjsxt.dao..*.*(..))")
public void AfterThrowing() {
System.out.println("method AfterThrowing");
}
}
解释类:
1 : 定义一个 切点,名字是myMethod.
@Pointcut("execution(public * com.bjsxt.service..*.add(..))")
public void myMethod(){};
对应xml 配置: <aop:pointcut id="myMethod" expression="execution(public * com.bjsxt.service..*.add(..))" />
2 在myMethod切点执行之后,调用after 方法。
@After("myMethod()")
public void after() {
System.out.println("method after");
}
对应XML 配置:
<aop:after pointcut-ref="myMethod" method="after"/>
3 在切点 execution(public * com.bjsxt.dao..*.*(..)) 返回后,执行AfterReturning 方法。
@AfterReturning("execution(public * com.bjsxt.dao..*.*(..))")
public void AfterReturning() {
System.out.println("method AfterReturning");
}
对应 XML :
<aop:after-returning pointcut="execution(public * com.bjsxt.dao..*.*(..)) " method="afterReturning"/>
spring 配置文件。
<context:annotation-config />
<context:component-scan base-package="com.bjsxt"/> <!-- 自动扫描 -->
<aop:aspectj-autoproxy/> <!-- 要添加本行 -->
相关文章推荐
- PC上对限制在微信客户端访问的html页面进行调试
- unity3d之工程性能提升注意点
- Android开发-AsyncTask
- 【iOS】集成支付宝支付/银联支付/微信支付
- Android Studio 的安装与第一个程序
- Android优化应用启动速度
- Android应用的界面编程(二)--Layout布局管理器
- 《Android JNI》04 对java传进来的数组进行操作并返回
- android 提高App启动速度
- Android总结(五)
- Android横竖屏切换小结
- Ubuntu14.04 编译 Android 5.1.1源码(采用国内镜像)
- Android总结(四)
- 获取IOS应用异常崩溃日志信息
- 实现微信布局的四种方式(二)
- AndroidStudio2.0搭建Ndk环境&成功编译使用
- android+json+php+mysql实现用户反馈功能
- iOS客户端ssl签名认证加密双向加密建议使用双向加密更好维护--修改
- unity delegate事件委托
- IOS-界面传值