• Spring注解


    AccountController .java 

    Java代码  收藏代码

    1.        /** 

    2.         * 2010-1-23 

    3.         */  

    4.        package org.zlex.spring.controller;  

    5.          

    6.        import javax.servlet.http.HttpServletRequest;  

    7.        import javax.servlet.http.HttpServletResponse;  

    8.          

    9.        import org.springframework.beans.factory.annotation.Autowired;  

    10.     import org.springframework.stereotype.Controller;  

    11.     import org.springframework.web.bind.ServletRequestUtils;  

    12.     import org.springframework.web.bind.annotation.RequestMapping;  

    13.     import org.springframework.web.bind.annotation.RequestMethod;  

    14.     import org.zlex.spring.service.AccountService;  

    15.       

    16.     /** 

    17.      *  

    18.      * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> 

    19.      * @version 1.0 

    20.      * @since 1.0 

    21.      */  

    22.     @Controller  

    23.     @RequestMapping("/account.do")  

    24.     public class AccountController {  

    25.       

    26.         @Autowired  

    27.         private AccountService accountService;  

    28.       

    29.         @RequestMapping(method = RequestMethod.GET)  

    30.         public void hello(HttpServletRequest request, HttpServletResponse response)  

    31.                 throws Exception {  

    32.       

    33.             String username = ServletRequestUtils.getRequiredStringParameter(  

    34.                     request, "username");  

    35.             String password = ServletRequestUtils.getRequiredStringParameter(  

    36.                     request, "password");  

    37.             System.out.println(accountService.verify(username, password));  

    38.         }  

    39.     }  


    分段详述: 

    Java代码  收藏代码

    1.        @Controller  

    2.        @RequestMapping("/account.do")  


    这两行注解,@Controller是告诉Spring容器,这是一个控制器类,@RequestMapping("/account.do")是来定义该控制器对应的请求路径(/account.do 

    Java代码  收藏代码

    1.        @Autowired  

    2.        private AccountService accountService;  


    这是用来自动织入业务层实现AccountService,有了这个注解,我们就可以不用写setAccountService()方法了! 
    同时,JSR-250标准注解,推荐使用@Resource来代替Spring专有的@Autowired注解。 

    引用

    Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource@PostConstruct以及@PreDestroy 

      @Resource的作用相当于@Autowired,只不过@AutowiredbyType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分别是nametypeSpring@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。 

      @Resource装配顺序 

      1. 如果同时指定了nametype,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

      2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常 

      3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常 

      4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配; 

      1.6. @PostConstructJSR-250 

    在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean初始化包括,实例化Bean,并装配Bean的属性(依赖注入))。

    Java代码  收藏代码

    1.@RequestMapping(method = RequestMethod.GET)  

    2.public void hello(HttpServletRequest request, HttpServletResponse response)  

    3.        throws Exception {  

    4.  

    5.    String username = ServletRequestUtils.getRequiredStringParameter(  

    6.            request, "username");  

    7.    String password = ServletRequestUtils.getRequiredStringParameter(  

    8.            request, "password");  

    9.    System.out.println(accountService.verify(username, password));  

    10.     }  


    注解@RequestMapping(method = RequestMethod.GET)指定了访问方法类型。 
    注意,如果没有用这个注解标识方法,Spring容器将不知道那个方法可以用于处理get请求! 

    对于方法名,我们可以随意定!方法中的参数,类似于“HttpServletRequest request, HttpServletResponse response”,只要你需要方法可以是有参也可以是无参

    接口不需要任何Spring注解相关的东西,它就是一个简单的接口! 
    重要的部分在于实现层,如下所示: 
    AccountServiceImpl.java 

    Java代码  收藏代码

    1./** 

    2. * 2010-1-23 

    3. */  

    4.package org.zlex.spring.service.impl;  

    5.  

    6.import org.springframework.beans.factory.annotation.Autowired;  

    7.import org.springframework.stereotype.Service;  

    8.import org.springframework.transaction.annotation.Transactional;  

    9.import org.zlex.spring.dao.AccountDao;  

    10.     import org.zlex.spring.domain.Account;  

    11.     import org.zlex.spring.service.AccountService;  

    12.       

    13.     /** 

    14.      *  

    15.      * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> 

    16.      * @version 1.0 

    17.      * @since 1.0 

    18.      */  

    19.     @Service  

    20.     @Transactional  

    21.     public class AccountServiceImpl implements AccountService {  

    22.       

    23.         @Autowired  

    24.         private AccountDao accountDao;  

    25.       

    26.         /* 

    27.          * (non-Javadoc) 

    28.          *  

    29.          * @see org.zlex.spring.service.AccountService#verify(java.lang.String, 

    30.          * java.lang.String) 

    31.          */  

    32.         @Override  

    33.         public boolean verify(String username, String password) {  

    34.       

    35.             Account account = accountDao.read(username);  

    36.       

    37.             if (password.equals(account.getPassword())) {  

    38.                 return true;  

    39.             } else {  

    40.                 return false;  

    41.             }  

    42.         }  

    43.       

    44.     }  


    注意以下内容: 

    Java代码  收藏代码

    1.@Service  

    2.@Transactional  

     

    注解@Service用于标识这是一个Service层实现,@Transactional用于控制事务,将事务定位在业务层,这是非常务实的做法!

    这里我们没有提到注解@Component,共有4组件式注解: 

    引用

      
    @Component:
    可装载组件  
    @Repository:
    持久层组件  
    @Service:
    服务层组件  
    @Controller:
    控制层组件 

     

    这样spring容器就完成了控制层、业务层和持久层的构建。 

    在注解的方式(Spring3.0)中,你可以使用@Value来指定这个文件。 
    例如,我们想要在一个类中获得一个文件,可以这样写: 

    Java代码  收藏代码

    1.@Value("/WEB-INF/database.properties")  

    2.private File databaseConfig;  



    如果这个properties文件已经正常在容器中加载,可以直接这样写: 

    Java代码  收藏代码

    1.@Value("${jdbc.url}")   

    2.private String url;  


    获得这个url参数!  

    容器中加载这个Properties文件: 

    Xml代码  收藏代码

    1.<util:properties id="jdbc" location="/WEB-INF/database.properties"/>  

    AccountController .java 

    Java代码  收藏代码

    1.        /** 

    2.         * 2010-1-23 

    3.         */  

    4.        package org.zlex.spring.controller;  

    5.          

    6.        import javax.servlet.http.HttpServletRequest;  

    7.        import javax.servlet.http.HttpServletResponse;  

    8.          

    9.        import org.springframework.beans.factory.annotation.Autowired;  

    10.     import org.springframework.stereotype.Controller;  

    11.     import org.springframework.web.bind.ServletRequestUtils;  

    12.     import org.springframework.web.bind.annotation.RequestMapping;  

    13.     import org.springframework.web.bind.annotation.RequestMethod;  

    14.     import org.zlex.spring.service.AccountService;  

    15.       

    16.     /** 

    17.      *  

    18.      * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> 

    19.      * @version 1.0 

    20.      * @since 1.0 

    21.      */  

    22.     @Controller  

    23.     @RequestMapping("/account.do")  

    24.     public class AccountController {  

    25.       

    26.         @Autowired  

    27.         private AccountService accountService;  

    28.       

    29.         @RequestMapping(method = RequestMethod.GET)  

    30.         public void hello(HttpServletRequest request, HttpServletResponse response)  

    31.                 throws Exception {  

    32.       

    33.             String username = ServletRequestUtils.getRequiredStringParameter(  

    34.                     request, "username");  

    35.             String password = ServletRequestUtils.getRequiredStringParameter(  

    36.                     request, "password");  

    37.             System.out.println(accountService.verify(username, password));  

    38.         }  

    39.     }  


    分段详述: 

    Java代码  收藏代码

    1.        @Controller  

    2.        @RequestMapping("/account.do")  


    这两行注解,@Controller是告诉Spring容器,这是一个控制器类,@RequestMapping("/account.do")是来定义该控制器对应的请求路径(/account.do 

    Java代码  收藏代码

    1.        @Autowired  

    2.        private AccountService accountService;  


    这是用来自动织入业务层实现AccountService,有了这个注解,我们就可以不用写setAccountService()方法了! 
    同时,JSR-250标准注解,推荐使用@Resource来代替Spring专有的@Autowired注解。 

    引用

    Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource@PostConstruct以及@PreDestroy 

      @Resource的作用相当于@Autowired,只不过@AutowiredbyType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分别是nametypeSpring@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。 

      @Resource装配顺序 

      1. 如果同时指定了nametype,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

      2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常 

      3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常 

      4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配; 

      1.6. @PostConstructJSR-250 

    在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean初始化包括,实例化Bean,并装配Bean的属性(依赖注入))。

    Java代码  收藏代码

    1.@RequestMapping(method = RequestMethod.GET)  

    2.public void hello(HttpServletRequest request, HttpServletResponse response)  

    3.        throws Exception {  

    4.  

    5.    String username = ServletRequestUtils.getRequiredStringParameter(  

    6.            request, "username");  

    7.    String password = ServletRequestUtils.getRequiredStringParameter(  

    8.            request, "password");  

    9.    System.out.println(accountService.verify(username, password));  

    10.     }  


    注解@RequestMapping(method = RequestMethod.GET)指定了访问方法类型。 
    注意,如果没有用这个注解标识方法,Spring容器将不知道那个方法可以用于处理get请求! 

    对于方法名,我们可以随意定!方法中的参数,类似于“HttpServletRequest request, HttpServletResponse response”,只要你需要方法可以是有参也可以是无参

    接口不需要任何Spring注解相关的东西,它就是一个简单的接口! 
    重要的部分在于实现层,如下所示: 
    AccountServiceImpl.java 

    Java代码  收藏代码

    1./** 

    2. * 2010-1-23 

    3. */  

    4.package org.zlex.spring.service.impl;  

    5.  

    6.import org.springframework.beans.factory.annotation.Autowired;  

    7.import org.springframework.stereotype.Service;  

    8.import org.springframework.transaction.annotation.Transactional;  

    9.import org.zlex.spring.dao.AccountDao;  

    10.     import org.zlex.spring.domain.Account;  

    11.     import org.zlex.spring.service.AccountService;  

    12.       

    13.     /** 

    14.      *  

    15.      * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a> 

    16.      * @version 1.0 

    17.      * @since 1.0 

    18.      */  

    19.     @Service  

    20.     @Transactional  

    21.     public class AccountServiceImpl implements AccountService {  

    22.       

    23.         @Autowired  

    24.         private AccountDao accountDao;  

    25.       

    26.         /* 

    27.          * (non-Javadoc) 

    28.          *  

    29.          * @see org.zlex.spring.service.AccountService#verify(java.lang.String, 

    30.          * java.lang.String) 

    31.          */  

    32.         @Override  

    33.         public boolean verify(String username, String password) {  

    34.       

    35.             Account account = accountDao.read(username);  

    36.       

    37.             if (password.equals(account.getPassword())) {  

    38.                 return true;  

    39.             } else {  

    40.                 return false;  

    41.             }  

    42.         }  

    43.       

    44.     }  


    注意以下内容: 

    Java代码  收藏代码

    1.@Service  

    2.@Transactional  

     

    注解@Service用于标识这是一个Service层实现,@Transactional用于控制事务,将事务定位在业务层,这是非常务实的做法!

    这里我们没有提到注解@Component,共有4组件式注解: 

    引用

      
    @Component:
    可装载组件  
    @Repository:
    持久层组件  
    @Service:
    服务层组件  
    @Controller:
    控制层组件 

     

    这样spring容器就完成了控制层、业务层和持久层的构建。 

    在注解的方式(Spring3.0)中,你可以使用@Value来指定这个文件。 
    例如,我们想要在一个类中获得一个文件,可以这样写: 

    Java代码  收藏代码

    1.@Value("/WEB-INF/database.properties")  

    2.private File databaseConfig;  



    如果这个properties文件已经正常在容器中加载,可以直接这样写: 

    Java代码  收藏代码

    1.@Value("${jdbc.url}")   

    2.private String url;  


    获得这个url参数!  

    容器中加载这个Properties文件: 

    Xml代码  收藏代码

    1.<util:properties id="jdbc" location="/WEB-INF/database.properties"/>  

  • 相关阅读:
    读Hadoop3.2源码,深入了解java调用HDFS的常用操作和HDFS原理
    AI学习笔记:人工智能与机器学习概述
    CDN百科 | 最近,你的APP崩了吗?
    CDN HTTPS安全加速基本概念、解决方案及优化实践
    CDN百科第六讲 | 怎样用CDN抵御攻击?看完这篇漫画你就懂了
    CDN百科第五讲 | CDN和游戏加速器有什么区别?
    CDN百科第四讲 | 如何优雅地在云上“摆摊”——做直播带货,你不得不关注的技术
    CDN百科第三讲 | 如果用了云服务器,还需要做CDN加速吗?
    阿里云杨敬宇:边缘计算行业通识与阿里云ENS的技术演进之路
    CDN百科 | 假如没有CDN,网络世界会变成什么样?
  • 原文地址:https://www.cnblogs.com/fengzhanfei/p/6136955.html
Copyright © 2020-2023  润新知