spring3.0 aop的annotation实现切面,新手学习

首先有user接口及其实现类userimple

public interface User {

	public void addUser(String name,String password);
	
	public void delUser(String id);
	
	public void updateUser(String id);
	
	public User getUser(int id);
	
}
public class UserImp implements User {

	@Override
	public void addUser(String name, String password) {
		System.out.println("----------addUser----------");
	}

	@Override
	public void delUser(String id) {
		System.out.println("----------delUser----------");
	}

	@Override
	public void updateUser(String id) {
		System.out.println("----------updateUser----------");
	}

	@Override
	public User getUser(int id) {
		System.out.println("----------getUser----------");
		return null;
	}
	
}
再是实现securityHandler,配置相应的aspect和pointcut

@Aspect
public class SecurityHandler2 {

	/**
	 * pointcut 
	 * 参数说明:*,匹配所有返回类型(有返回类型,无返回类型);add*,匹配所有以add开头的方法;..,0个或多个参数
	 * ||可实现多个表达式同时使用
	 */
	@Pointcut("execution(* add*(..)) || (execution(* del*(..))) || (execution(* get*(..)))")
	private void allMethods() {
	}

	/**
	 * Advice
	 * 定义在哪些方法上应用此方法验证
	 */
	@Before("allMethods()")
	public void check() {
		System.out.println("-------------Check Something before------------");
	}
	
	@After("allMethods()")
	public void check1(){
		System.out.println("-----Check Something after----");
	}

}
最后在applicationContext.xml中配置securityhandler及user的实现类

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                     	http://www.springframework.org/schema/aop
			http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

	<aop:aspectj-autoproxy />

	<bean id="securityHander" class="com.spg.testSpring.example.imp.SecurityHandler" />
	<bean id="user" class="com.spg.testSpring.example.imp.UserImp" />

</beans>

注意必须开启aop对annotation的支持,即:

<aop:aspectj-autoproxy />

<pre>
最后在客户端调用

public static void main(String[] args) {

		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		User user = (User) factory.getBean("user");
		user.addUser("aa", "bb");
		user.delUser("12");
		user.getUser(1);
		
	}

由此可实现进行某些操作的之前或之后进行其他的操作。

最后结果:

-------------Check Something before------------
----------addUser----------
-----Check Something after----
-------------Check Something before------------
----------delUser----------
-----Check Something after----
-------------Check Something before------------
----------getUser----------
-----Check Something after----

ps:

如果用jdk1.7进行编译的时候会出错,具体原因不清楚。换1.6运行就没问题。

因为第一次学习,中间出了很多莫名其妙的错误,最后总结出的解决方法,如果确认代码没问题的,把自己导入的关于aop的包全部删除,再重新导入,确保没有重复的包。这是我自己导入的包,当然可能还有多余的包。


 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring AOP中,可以使用切面编程来实现动态数据源的切换。下面是一个简单的示例: 首先,创建一个注解类`DataSource`,用于标识需要切换数据源的方法: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface DataSource { String value() default "default"; } ``` 然后,创建一个切面类`DataSourceAspect`,在该类中定义切点和切面逻辑: ```java @Aspect @Component public class DataSourceAspect { @Around("@annotation(dataSource)") public Object switchDataSource(ProceedingJoinPoint joinPoint, DataSource dataSource) throws Throwable { try { // 获取要切换的数据源名称 String dataSourceName = dataSource.value(); // 根据数据源名称切换数据源 switchDataSource(dataSourceName); // 执行目标方法 return joinPoint.proceed(); } finally { // 切换回默认数据源 switchDataSource("default"); } } // 实际切换数据源的逻辑 private void switchDataSource(String dataSourceName) { // 根据传入的数据源名称进行数据源切换逻辑的实现 // ... } } ``` 在上述代码中,`@Around("@annotation(dataSource)")`表示拦截带有`@DataSource`注解的方法,并执行切面逻辑。在切面逻辑中,首先获取切换的数据源名称,然后根据该名称进行数据源的切换操作。在目标方法执行完毕后,切面逻辑会将数据源切换回默认的数据源。 最后,使用`@DataSource`注解标识需要切换数据源的方法: ```java @Service public class UserService { @DataSource("db1") public void addUser(User user) { // 执行添加用户的逻辑 } @DataSource("db2") public void updateUser(User user) { // 执行更新用户的逻辑 } } ``` 在上述示例中,`addUser`方法使用名为"db1"的数据源,`updateUser`方法使用名为"db2"的数据源。 通过以上步骤,就可以使用Spring AOP实现动态数据源的切换。当调用带有`@DataSource`注解的方法时,切面会根据注解中指定的数据源名称进行数据源切换,从而实现动态切换数据源的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值