Spring中常见的各种通知

四、通知的创建
通知有:前置通知、后置通知、环绕通知和异常通知;
下面我们分别来看一下:
1、创建PersonService接口:	
	package cn.csdn.service;
import java.util.Date;
//抽象主题角色
public interface PersonService {
	public void Study(String name,Date date);
}
2、	创建实现PersonService接口的类:
 package cn.csdn.service;
import java.util.Date;
//主角
public class PersonServiceBean implements PersonService{
	@Override
	public void Study(String name, Date date) {
		System.out.println("学习的科目是"+name+"学习的时间是"+date);
	}
}  

3、	配置bean.Xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=http://www.springframework.org/schema/beans xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-2.5.xsd" >
     <!-- 环绕通知 -->
        <bean id="myAroundAdvice" class="cn.csdn.advice.MyAroundAdvice"/> 
   		<!-- 配置前置通知 -->
   		<bean id="myBeforeAdvice" class="cn.csdn.advice.MyBeforeAdvice"/>
   		<!-- 配置后置通知 -->
   		<bean id="myAfterAdvice" class="cn.csdn.advice.MyAfterAdvice"/>
   	<!-- 配置异常通知 -->
   		<bean id="myThrowsAdvice" class="cn.csdn.advice.MyThrowsAdvice"/>
   	<!-- 引入通知 -->
   		<bean id="auditableBean" class="cn.csdn.advice.AuditableBean"/>
   		<!-- 业务bean -->
        <bean id="personServiceBean" class="cn.csdn.service.PersonServiceBean"/>
    	<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
   		<!--代理接口-->
   		<property name="proxyInterfaces">
   			<list>
   				<value>cn.csdn.service.PersonService</value>
   				<value>cn.csdn.service.Auditable</value>
   			</list>
   		</property>
   		<!--通知名称-->
   		<property name="interceptorNames">
  			<list>
   				<value>myAroundAdvice</value>
   				<value>myBeforeAdvice</value>
   				<value>myAfterAdvice</value>
   				<value>auditableBean</value>
   			</list>
  		</property>
   		<!--通知对象-->
   		<property name="target">
   		<ref bean="personServiceBean"/>
   		</property>
  	</bean>   
</beans>

4、	前置通知的实现:
 package cn.csdn.advice;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class MyBeforeAdvice implements MethodBeforeAdvice{
	@Override
	public void before(Method method, Object[] arg1, Object arg2)throws Throwable {
		//第一个参数方法对象
		// 方法参数
		//目标对象
		Object obj =null;
		if(arg1.length>0){
			obj= arg1[0];
			System.out.println("before-----------方法的名称:"+method.getName()+"  方法的第一个参数值"+obj.toString()+"  目标对象是:"+arg2.getClass());
		}
	}
}         
5、	后置通知的实现:
  package cn.csdn.advice;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class MyAfterAdvice implements AfterReturningAdvice{
	@Override
	public void afterReturning(Object returnValue, Method arg1, Object[] arg2,Object arg3) throws Throwable {
		//执行目标方法之后执行此操作
		System.out.println("after-------方法的返回值是:");
	}
}

6、	环绕通知的实现:
package cn.csdn.advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAroundAdvice implements MethodInterceptor{
	@Override
	public Object invoke(MethodInvocation methodInvocation) throws Throwable {
		System.out.println("执行前");
		Object object=methodInvocation.proceed();
		System.out.println("执行后");
		//ProxyFactoryBean
		return object;
	}
}
7、	异常通知的实现:
package cn.csdn.advice;
import java.lang.reflect.Method;
import org.springframework.aop.ThrowsAdvice;
public class MyThrowsAdvice implements ThrowsAdvice{
		//异常处理操作
		public void afterThrowing(Method method,Object[] args, Object target,Throwable throwable){
			 System.out.println("exception------"+throwable.getMessage());
		}
}
8、	引入通知的实现:
a)	创建接口Auditable:
  package cn.csdn.advice;
import java.util.Date;
public interface Auditable {
//添加一个属性 记录最后一次修改的时间的操作
	void setLastModifiedDate(Date laseModidiedDate);
	Date getLastModifiedDate();
}
b)	创建实现Auditable接口的类:
   package cn.csdn.advice;
import java.util.Date;
import org.springframework.aop.support.DelegatingIntroductionInterceptor;
public class AuditableBean extends DelegatingIntroductionInterceptor implements Auditable{
	private Date laseModidiedDate;
	@Override
	public void setLastModifiedDate(Date laseModidiedDate) {
		this.laseModidiedDate=laseModidiedDate;
	}
	@Override
	public Date getLastModifiedDate() {
		return laseModidiedDate;
	}
}
9、	测试类(AppMain):
      package cn.csdn.junit;
import java.util.Date;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.csdn.advice.Auditable;
import cn.csdn.service.PersonService;
public class AppMain {
	@Test
	public void test() {
		ApplicationContext context=new ClassPathXmlApplicationContext("classpath:bean.xml");
		PersonService pService=(PersonService) context.getBean("proxyFactoryBean");
		pService.Study("java",new Date());
		 Auditable au =  (Auditable)pService;
	    au.setLastModifiedDate(new Date());
		 System.out.println(au.getLastModifiedDate());
	}
}    
10、	测试结果:
执行前
before-----------方法的名称:Study  方法的第一个参数值java  目标对象是:class cn.csdn.service.PersonServiceBean
学习的科目是java学习的时间是Wed Apr 18 21:03:55 CST 2012
after-------方法的返回值是:null
执行后
执行前
before-----------方法的名称:setLastModifiedDate  方法的第一个参数值Wed Apr 18 21:03:55 CST 2012  目标对象是:class cn.csdn.service.PersonServiceBean
after-------方法的返回值是:null
执行后
执行前
after-------方法的返回值是:Wed Apr 18 21:03:55 CST 2012
执行后
Wed Apr 18 21:03:55 CST 2012 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot常见的注解有: 1. @SpringBootApplication:用于标记主类,表示该类是Spring Boot应用的入口类。该注解主要包含了@ComponentScan、@EnableAutoConfiguration和 @Configuration三个注解。 2. @RestController:用于标记Controller类,表示该类是Spring MVC的控制器,并且会自动将返回的数据转换为JSON格式。 3. @RequestMapping:用于映射请求URL和Controller方法之间的关系,可以用在类级别和方法级别。在类级别上使用时,会为该类的所有方法的URL添加一个前缀。 4. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:这些注解分别用于标记GET、POST、PUT、DELETE请求的处理方法。它们与@RequestMapping的作用类似,用于指定请求的URL和HTTP方法。 5. @RequestParam:用于从请求参数获取值,将请求参数与方法参数进行绑定。 6. @PathVariable:用于从URL路径获取值,将路径变量与方法参数进行绑定。 7. @RequestBody:用于将请求体的内容绑定到方法参数上,常用于接收JSON格式的请求数据。 8. @ResponseBody:用于将方法返回的对象转换为HTTP响应体,并将其发送给客户端。 9. @Autowired:用于自动注入依赖对象,Spring Boot会自动扫描并创建相应的对象,并将它们注入到标记了@Autowired的属性上。 10. @Configuration:用于标记配置类,指示Spring Boot需要对该类进行额外配置。 以上只是一些常见的注解,Spring Boot还有许多其他的注解供开发者使用,用于不同的场景和功能需求。 ### 回答2: Spring Boot是一个Java框架,提供了很多常见的注解来简化开发。以下是一些常见Spring Boot注解: 1. @SpringBootApplication:这是一个组合注解,用于标注主类。它包含了@EnableAutoConfiguration、@ComponentScan和@Configuration注解,用于自动配置、扫描组件和声明配置文件。 2. @RestController:该注解用于标注一个类,表示这是一个RESTful风格的控制器,用于处理HTTP请求和返回响应。 3. @RequestMapping:用于将请求映射到处理方法或控制器类上。 4. @Autowired:用于自动装配Bean,通过依赖注入来实现组件的自动装配。 5. @Component:用于将类标记为一个Spring组件,通过自动扫描和注册,将其作为Bean管理。 6. @Configuration:标识该类是一个配置类,用于声明Spring的配置信息。 7. @Value:用于注入属性值,从配置文件读取。 8. @PathVariable:用于获取URL的路径参数。 9. @RequestParam:用于获取HTTP请求的请求参数。 10. @ResponseBody:用于将方法的返回值直接作为HTTP响应体返回。 11. @ExceptionHandler:用于捕获处理方法抛出的异常,并进行统一处理。 12. @Transactional:用于标记一个方法或类需要进行事务管理。 13. @Service:用于标记一个类为服务层的组件。 14. @Repository:用于标记一个类为数据访问层的组件。 15. @Aspect:用于声明一个切面,定义横切关注点和通知类型。 以上只是常见的一些Spring Boot注解,还有其他更多的注解用于实现不同的功能和特性。 ### 回答3: Spring Boot常见的注解包括: 1. @SpringBootApplication:用于标记主类,表示这是一个Spring Boot应用程序的入口点。它是由三个注解组成的组合注解:@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。 2. @RestController:用于标记一个类,表示该类是一个RESTful风格的控制器。它将类的方法的返回值直接作为响应内容,而不是返回视图。 3. @RequestMapping:用于映射HTTP请求的URL路径到方法上。可以用在类和方法上,用于指定处理请求的路径。 4. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:这些注解分别用于映射HTTP的GET、POST、PUT、DELETE请求到方法上,可以指定路径,并且支持Ant风格的路径匹配。 5. @PathVariable:用于将URL路径的参数绑定到方法的参数上。通常与@RequestMapping一起使用,用于处理带有路径参数的请求。 6. @RequestParam:用于从请求的URL、查询参数或者表单参数获取参数的值,并绑定到方法的参数上。 7. @RequestBody:用于接收HTTP请求的请求体,并绑定到方法的参数上。通常用于处理POST请求的JSON/XML数据。 8. @ResponseBody:用于将方法的返回值直接作为响应内容返回给客户端。通常用于处理RESTful风格的API请求。 9. @Autowired:用于自动装配依赖的Bean。它可以注入Spring容器Bean,减少手动配置依赖的繁琐操作。 10. @ConfigurationProperties:用于将配置文件的属性值绑定到Spring Boot应用程序的配置类。 以上是Spring Boot常见的注解,这些注解可以帮助我们更方便地开发和配置Spring Boot应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值