常用注解
- MyBatis
- Spring
- JAVA标准装配注解
- AspectJ注解标注切面
- 开启声明式事务处理注解
- 指定Bean的作用域
- SpringMVC
- @RequestMapping 映射指定请求的URL
- @RequestParam 指定其对应的请求参数(是否必须)
- @ModelAttribute 将入参的数据对象放入数据模型中
- @SessionAttributes 将模型中属性存入HttpSession中,在类上使用
- @SessionAttribute 在Session作用域读取相关属性,在参数上使用
- @ExceptionHandler 局部异常处理
- @DateTimeFormat 时间类型的属性格式化
- @RequestBody 一般在异步请求时使用,返回的数据将输出到响应流中
- @JSONField 解决json处理时间类型的问题
- @RestController 合并@Controller和@RequestBody
- @InitBinder 装配自定义编辑器
- JSR 303注解
- REST风格
MyBatis
@Param 实现多参数入参
public void add(@Param("id") int id , @Param(value="name") String userName)
Spring
加载注解定义的Bean(XML配置)
<?xml version="1.0" encoding="UTF-8"?>
<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:p="http://www.springframework.org/schema/p"
//添加对context命名空间的声明
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
//声明
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!--扫描注解标注的类.base-package属性指定需要扫描基准包,多个包名用逗号隔开-->
<context:component-scan base-package="Demo1.service,Demo1.dao" />
</beans>
定义Bean组件的注解
@Component(“userDao”) 定义Bean组件
//定义了一个Dao,等于在XML配置中写了
//<bean id="userDao" class="dao.impl.UserDaoImpl"></bean>
@Component("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void add(User user) {
System.out.println("添加到数据库成功.........");
}
}
=============================================================
//将注解定义的组件自动装配
@Autowired
prviate UserDao userDao;
@Repository(“userDao”) 标注Dao类
//标注此类为Dao类
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void add(User user) {
System.out.println("添加到数据库成功.........");
}
}
=============================================================
//将注解定义的组件自动装配
@Autowired
prviate UserDao userDao;
@Service 标注业务类
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public void add(User user) {
userDao.add(user);
}
}
@Controller 标注控制器类
//标注控制器类
@Controller
public class UserController{
}
装配注解
@Qualifier 有相同类型匹配的Bean时,用此注解指定所需Bean的名称
@Qualifier("userDao")
private UserDao userDao;
@Autowired 自动装配对应的Bean组件
required属性默认为true,即必须找到匹配的Bean完成装配 ,
否则抛出异常,也可以设置属性为false
//将注解定义的组件自动装配
@Autowired
prviate UserDao userDao;
==========================
@Autowired(required = falser)
prviate UserDao userDao;
JAVA标准装配注解
@Resource
如果该注解没有指定name值,将根据字段名或者setter方法名产生的默认的名称
@Resource(name="userDao")
//为dao属性注入name为userDao的bean
private UserDao userDao;
==========================================
//查找名为userDao的Bean,注入属性
@Resource
private UserDao userDao;
==========================================
//查找名为userDao的Bean注入setter方法
@Resource
public void setUserDao(UserDao userDao){
this.dao = userDao;
}
AspectJ注解标注切面
使用时需要在sping.xml中配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--创建bean-->
<bean class="aop.UserServiceLogger"></bean>
<!--开启注解-->
<aop:aspectj-autoproxy/>
</beans>
@Aspect 定义切面
//定义切面
@Aspect
public class Logger{
private static final Logger log= "";
}
@Before 前置增强
//定义前置增强方法
@Before("execution(* service.UserService.*(..))")
public void before(JoinPoint jp){
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法");
}
@AfterReturning 后置增强
//定义后置增强方法
@AfterReturning(pointcut="execution(* service.UserService.*(..))",returning="returnValue")
public void AfterReturning(JoinPoint jp,Object returnValue){
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法,方法返回值="+returnValue);
}
@Pointcut 指定切入点
作为切入点签名的方法必须返回void类型
//指定切入点
@Pintcut("execution(* service.UserService.*(..))")
public void pointcut(){}
@Before("pointcut()")
public void before(JoinPoint jp){
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法");
}
@AfterReturning(pointcut="pointcut()",returning="returnValue")
public void AfterReturning(JoinPoint jp,Object returnValue){
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法,方法返回值="+returnValue);
}
@AfterThrowing
//定义最终增强方法
@AfterThrowing(pointcut="execution(* service.UserService.*(..))",throwing = "e")
public void AfterThrowing(JoinPoint jp,RuntimeException e){
log.error("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法异常:"+e);
}
@After 最终增强
//定义最终增强方法
@After("execution(* service.UserService.*(..))")
public void After(JoinPoint jp){
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法结束");
}
@Around 环绕增强
//定义最终增强方法
@Around ("execution(* service.UserService.*(..))")
public void Around (ProceedingJoinPoint jp) throws Throwable{
log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法结束");
try{
Object result = jp.proceed();
retrun result;
}catch(Throwable e){
throw e;
}finally{
log.info(jp.getSignature().getName()+"方法结束");
}
}
开启声明式事务处理注解
<?xml version="1.0" encoding="UTF-8"?>
<beans 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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--定义事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启声明式事务注解-->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
@Transactional 配置事务
//为该类的所有业务方法统一添加事务处理,也可以配置单一方法
@Transactional
@Service("userService")
public class UserServiceImpl implements UserService{
//为方法配置事务处理
@Transactional(propagation=Propagation.SUPPORTS)
public void Test(){
//......
}
}
指定Bean的作用域
@Scope
Bean的作用域
singleton: 默认值,以单例模式创建,只有一个
prototype: 每次从容器中获取Bean时,都会创建一个新的实例
request: 用于Web应用环境,针对每次HTTP请求都会创建一个实例
session: 一个会话共享同一个实例
global session: 仅在Portlet的Web应用中使用,同一个全局会话共享一个实例,
对于非Portlet环境,等同于session
@Scope("prototype")
@Service("userService")
prublic void UserService(){
}
SpringMVC
@RequestMapping 映射指定请求的URL
@RequestMapping("/test")
public String Test(){
//.....
}
@RequestParam 指定其对应的请求参数(是否必须)
@RequestMapping("/test")
public String Test(@RequestParam(value="uesrName",required=false) String userName){
//value:参数名
//required:是否必须,默认为true,表示请求中必须包含对应的参数名,若不存在将抛出异常
//defaultValue:默认参数名,不推荐使用3335
}
@ModelAttribute 将入参的数据对象放入数据模型中
@RequestMapping(value="/add")
public String add(@ModelAttribute("user")User user){
return "useradd";
}
//不使用注解进行对象入参,可以把Model模型进行入参
@RequestMapping(value="/add")
public String add(User user,Model model){
model.addAttribute("user",user);
return "useradd";
}
@SessionAttributes 将模型中属性存入HttpSession中,在类上使用
@Controller
@SessionAttributes("user")
public class ModelController {
@ModelAttribute("user")
public User initUser(){
User user = new User();
user.setName("default");
return user;
}
}
@SessionAttribute 在Session作用域读取相关属性,在参数上使用
@RequestMapping("/session")
public String session(@SessionAttribute("user") User user){
return "index";
}
@ExceptionHandler 局部异常处理
@ExceptionHandler(value={RuntimeException.class})
public String handlerException(RuntimeException e,HttpServletRequest req){
//在同一处理器类中,有方法抛出RuntimeException异常将会被捕获到此进行处理
req.setAttribute("e",e);
return "error";
}
@DateTimeFormat 时间类型的属性格式化
public class User(){
@DateTimeFormat(pattern="yyyy-MM=dd")
private Date birthday;
}
@RequestBody 一般在异步请求时使用,返回的数据将输出到响应流中
@RequestMapping("/login")
@RequestBody
public User login(User user, HttpServletResponse response){
return new User();
}
//效果等同于如下代码:
@RequestMapping("/login")
public void login(User user, HttpServletResponse rep){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
@JSONField 解决json处理时间类型的问题
public class User(){
@JSONField(pattern="yyyy-MM=dd")
private Date birthday;
}
@RestController 合并@Controller和@RequestBody
@RestController
public class HospitalController {
@Autowired
private HospitalService hospitalService;
@RequestMapping(value = "/findAllHospital",method = RequestMethod.GET)
public List<Hospital> findAllHospital(){
List<Hospital> hospitalList= hospitalService.findAllHospital();
return hospitalList;
}
@InitBinder 装配自定义编辑器
JSR 303注解
Spring本身没有提供JSR303的实现,Hibernate Validator 实现了JSR303,所以要在项目中加入Hibernate Validator的jar文件
@Null //必须为null
@NotNull //必须不为null
@Empty //必须为空
@NotEmpty //必须不为空
@AssertTrue //必须为true
@AssertFalse //必须为false
@Min(value) //必须是一个数字,必须小于指定的值
@Max(value) //必须是一个数字,必须大于指定的值
@DecimalMin(value) //必须是一个数字,必须大于等于指定的值
@DecimalMax(value) //必须是一个数字,必须小于等于指定的值
@Size(max,min) //元素的大小必须在指定的范围内
@Digits(integer,fraction) // 必须是一个数字,其值必须在可接受的范围内
@Past //必须是一个过去的日期
@Future //必须是一个将来的日期
@Pattern(value) //必须符合指定的正则表达式
@Length //字符串大小必须在指定范围内
@Valid //让springMvc在完成数据绑定后,执行数据校验工作
@RequestMapping("/test")
//@Valid注解后面必须紧挨着一个BindingResult参数,否则spring会在校验不通过是直接抛出异常
public String Test(@Valid User user , BindingResult bindingResult){
//判断是否验证通过
if(bindingResult.hasErrors){
//.....
}
}
REST风格
@PathVariable 可以将URL中的{xxx}占位符参数绑定到控制器处理方法的入参中
@RequestMapping(value="/view/{id}",method=RequestMethod.GET)
public String seteUser(@PathVariable String id , Model model){
System.out.print(id);
return "User";
}