Bootstrap

Spring&SpringMVC框架中的注解

一,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;
    }

;