一,Spring使用注解实现IOC和AOP
注解方式将Bean的定义信息和Bean实现类结合在一起,Spring提供的注解有
@Component:实现Bean组件的定义
@Aspect
@Component
public class UserServiceLogger {}
@Repository:用于标注DAO类
@Repository("userDao")
public class UserDaoImpl implements UserDao {}
@Service:用于标注业务类
@Service("userService")
public class UserServiceImpl implements UserService {}
@Controller:用于标注控制器类
@Controller
public class UserController {}
使用@Autowired注解实现Bean的自动装配,默认按类型匹配,可以使用@Qualifier指定Bean的名称
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
private String who;
private String content;
}
使用@Resource注解实现组件装配,默认按名称匹配
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource(name = "userDao")
private UserDao userDao;
private String who;
private String content;
}
二,Spring使用注解定义切面
AspectJ
AspectJ 面向切面的框架,它扩展了Java语言,定义了AOP 语法,能够在编译期提供代码的织入
@AspectJ
AspectJ 5新增的功能,使用JDK 5.0 注解技术和正规的AspectJ切点表达式语言描述切面
Spring通过集成AspectJ实现了以注解的方式定义增强类,大大减少了配置文件中的工作量 利用轻量级的字节码处理框架asm处理@AspectJ中所描述的方法参数名
使用注解完成五种增强
定义切面
@Aspect
@Component
public class UserServiceLogger {
Logger logger = Logger.getLogger(UserServiceLogger.class);
}
定义切点
@Pointcut("execution(* com.spring2.aop.service.impl.*.*(..))")
public void pointcut() {
}
前置增强
@Before("pointcut()")
public void before(JoinPoint jp) {
logger.info(jp.getSignature().getName() + "保存前");
}
后置增强
@AfterReturning(value = "pointcut()", returning = "result")
public void afterReturning(JoinPoint jp, Object result) {
//连接点(Join Point),getTarget()获取对象,getSignature()连接点方法信息
logger.info(jp.getTarget() + "\t" + jp.getSignature().getName() + "方法\t" + result);
logger.info("保存后");
}
异常抛出增强
@AfterThrowing(value = "pointcut()", throwing = "e")
public void throwException(JoinPoint jp, RuntimeException e) {
logger.info(jp.getTarget() + "\t" + jp.getSignature().getName() + "方法,抛出了" + e);
logger.info("异常了");
}
最终增强
@After("pointcut()")
public void afterLogger(JoinPoint jp) {
logger.info(jp.getTarget() + "\t" + jp.getSignature().getName() + "方法");
logger.info("最终增强");
}
环绕增强
@Around("pointcut()")
public void aroundLogger(ProceedingJoinPoint pjp) {
try {
logger.info("执行前");
Object obj = pjp.proceed();
logger.info("执行后");
} catch (Throwable throwable) {
logger.info("异常了");
throwable.printStackTrace();
} finally {
logger.info("最终了");
}
}
三,Spring使用@Transactional为方法添加事务支持
@Transactional
@Service("userService")
public class UserServiceImpl implements UserService {
……
@Transactional(propagation = Propagation.SUPPORTS)
public List<User> findUsersWithConditions(User user) {
// 省略实现代码
}
}
四,SpringMVC注解驱动控制器
@Controller:标注一个普通的JavaBean成为可以处理请求的控制器
@Controller
public class UserController {}
@RequestMapping:通过请求URL进行映射
@RequestMapping("/tologin.action")
public String toLogin() {
logger.info("进入登陆页面");
//跳转至登陆页面
return "login";
}
@RequestMapping(value="/welcome",method=RequestMethod.GET,params="username")
public String index1(String username) {
logger.info("进入了index1,参数为:" + username);
return "login";
}
/*
* 中文乱码问题得到解决
* 原理: 手动给对应的Accept返回制定格式编码数据。
* 发现produces设置多个Accept只有第一个的charset是有用的,
*/
@RequestMapping(value = "/receive.action", produces = {"text/html;charset=UTF-8;", "application/json;"})
@ResponseBody
public String receive(@RequestBody String name) {
logger.info(name);
String str = "welcome欢迎:" + name;
logger.info(str);
return str;
}
Controller方法中参数前加@RequestParam进行直接入参
@RequestMapping("/welcome1.action")
public String index1(String username) {
logger.info("进入了index1,参数为:" + username);
return "login";
}
@RequestMapping("/welcome2.action")
public String index2(@RequestParam String username) {
logger.info("进入了index2,参数为:" + username);
return "login";
}
@RequestMapping("/welcome3.action")
public String index3(@RequestParam(value = "name", required = false) String username) {
logger.info("进入了index3,参数为:" + username);
return "login";
}
@ModelAttribute 不仅仅和从页面中获取对象的所有属性,而且可以将对象放入request当中
//@ModelAttribute("user")注解方式自动匹配User对象中的属性
@RequestMapping("/adduser.action")
public String addUser(@ModelAttribute("user") User user) {
logger.info(user);
return "redirect:tologin.action";
}
@DateTimeFormat(pattern="yyyy-MM-dd")的使用 设置对应日期属性的字符串格式
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
@PathVariable接收REST风格URL中的参数
@RequestMapping(value = "/userinfo/{username}", method = RequestMethod.GET)
public String userInfo(@PathVariable String username, Model model) {
logger.info("接收到的用户名为" + username);
//模拟查询
User user = new User();
user.setUsername("使用REST风格获取的用户名为:" + username);
user.setPassword("密码999");
//将用户对象放入model作用域中
model.addAttribute("user", user);
return "userinfo";
}
五,Springmvc 处理ajax请求所用的注解
使用注解:@ResponseBody 该注解设置返回值为JSON类型
@RequestMapping("/findbyid.action")
@ResponseBody
public User findById(int id) {
User user = new User();
user.setId(id);
user.setName("张三");
user.setAge(20);
user.setTel("00000000000");
return user;
}
@RequestBody接收的是一个Json对象的字符串
@RequestMapping(value = "/receive2", produces = {"text/html;charset=UTF-8;", "application/json;"})
@ResponseBody
public String receive2(@RequestBody User user) {
logger.info(user.getName());
String str = "你好:" + user.getName();
return str;
}