zoukankan      html  css  js  c++  java
  • spring注解

    使用注解来构造IoC容器(转载)

        在spring 3.0中,通过@controller标注即可将class定义为一个controller类。为使spring能找到定义为controller的bean,需要在applicationContext.xml配置文件中注册<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>。

    在base-package指明一个包

      1. <!-- 激活组件扫描功能,自动扫描通过注解配置的组件 -->  
      2. <context:component-scan base-package="com.om.*"/>

    表明com.om包及其子包中,如果某个类的头上带有特定的注解【@Component/@Repository/@Service/@Controller】,就会将这个对象作为Bean注册进Spring容器。

    1:@Component
        @Component是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用  
    2:@Controller
        @Controller对应表现层的Bean,也就是Action
             @Controller
             public class  UserController{}
                  注:实际上,使用@component,也可以起到@Controller同样的作用。 使用@Controller注解标识UserController之后,就表示要把UserController交给Spring容器管理,在Spring容器中会存在一个名字为"UserController"的action,这个名字是根据UserController类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserController")】或者【@Controller("UserController")】,则使用value作为bean的名字。
    1.     这里的UserController还使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope="prototype" 可以保证当有请求的时候都创建一个Action对象

          

    3:@RequestMapping

        @RequestMapping是一种通过匹配URL路径来访问相应页面的,@RequestMapping 注解将类似 “/user”这样的URL映射到整个类或特定的处理方法上。一般来说,类级别的注解映射特定的请求路径到表单控制器上,而方法级别的注解只是映射为一个特定的HTTP方法请求(“GET”,“POST”等)或HTTP请求参数
    @Controller
    @RequestMapping("/user")
    public class UserController {
    @RequestMapping(value = "/list", method = {RequestMethod.GET,RequestMethod.POST})
    public String list(HttpServletRequest request) {
    
    }
    }

    4:@Autowired

        将 @Autowired 注释标注在成员变量上 ,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

        @Autowired 根据bean 类型从spring 上线文中进行查找,注册类型必须唯一,否则报异常。与@Resource 的区别在于,@Resource 允许通过bean 名称或bean 类型两种方式进行查找@Autowired(required=false) 表示,如果spring 上下文中没有找到该类型的bean 时, 才会使用new SoftPMServiceImpl();      @Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 id 或 name 作为 Map 的 key。      @Autowired 还有一个作用就是,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自动注入这些实现类的实例,不需要额外的操作。

    @Controller
    @RequestMapping("/user")
    public class UserController {
        @Autowired
        private UserBiz userBiz;
    }

    5:@RequestParam

        @RequestParam将请求的参数绑定到方法中的参数上。其实,即使不配置该参数,注解也会默认使用该参数。如果想自定义指定参数的话,如果将@RequestParam的 required 属性设置为false(如@RequestParam(value="id",required=false))。

    6:@RequestBody

        @RequestBody是指方法参数应该被绑定到HTTP请求Body上。

    @RequestMapping(value = "/user",method = RequestMethod.GET)
    public void UserInfo(@RequestBody String userId,User user){
        
    }

    7:@ResponseBody

        @ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。最常用的我们使用ajax传输json,需要再类上面配置@ResponseBody。

    @ResponseBody
    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public String list() {    
        return "Hello World";
    }

    8:@ModelAttribute

        @ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用,示例如下:

    @ModelAttribute
    public User addUser(@RequestParam String userId) {
        ...
    }

    @ModelAttribute方法用来在model中填充属性,如填充下拉列表、宠物类型或检索一个命令对象比如账户(用来在HTML表单上呈现数据)。
        @ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另一种是该方法接受一个模型并添加任意数量的模型属性。用户可以根据自己的需要选择对应的风格。

        @ModelAttribute作用在方法参数上

        当@ModelAttribute作用在方法参数上时,表明该参数可以在方法模型中检索到。如果该参数不在当前模型中,该参数先被实例化然后添加到模型中。一旦模型中有了该参数,该参数的字段应该填充所有请求参数匹配的名称中。这是Spring MVC中重要的数据绑定机制,它省去了单独解析每个表单字段的时间。
        @ModelAttribute是一种很常见的从数据库中检索属性的方法,它通过@SessionAttributes使用request请求存储。在一些情况下,可以很方便的通过URI模板变量和类型转换器检索属性。

    9:@Cacheable 和@CacheFlush 

        @Cacheable :声明一个方法的返回值应该被缓 存  
        例如:@Cacheable(modelId = "testCaching")  
        @CacheFlush :声明一个方法是清空缓存的触发器                   
        例如:@CacheFlush(modelId = "testCaching") 

    10:@Resource  

        @Resource 默认按bean 的name 进行查找,如果没有找到会按type 进行查找, 此时与@Autowired 类似在没有为 @Resource 注解显式指定 name 属性的前提下,如果将其标注在 BeanFactory 类型、ApplicationContext 类型、ResourceLoader 类型、 ApplicationEventPublisher 类型、MessageSource 类型上,那么 Spring 会自动注入这些实现类的实例,不需要额外的操作。此时 name 属性不需要指定 ( 或者指定为""),否则注入失败。

    11:@PostConstruct 和@PreDestroy  

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

        @PreDestroy 在方法上加上注解@PreDestroy ,这个方法就会在Bean 被销毁前被Spring 容器执行。

    12:@Repository 

        与@Controller 、@Service 类似,都是向spring 上下文中注册bean。

    13:@SessionAttributes 

        Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中, 以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。 这一功能是通过类定义处标注 @SessionAttributes 注解来实现的。 @SessionAttributes 只能声明在类上,而不能声明在方法上。    

    例如   
    @SessionAttributes("User") // 将ModelMap 中属性名为User的属性 

    @SessionAttributes({"attr1","attr2"}) 

    @SessionAttributes(types = User.class)   

    @SessionAttributes(types = {User.class,Dept.class})   

    @SessionAttributes(types = {User.class,Dept.class},value={"attr1","attr2"}) 

    14:@InitBinder

        如果希望某个属性编辑器仅作用于特定的 Controller ,可以在 Controller 中定义一个标注 @InitBinder 注解的方法, 可以在该方法中向 Controller 了注册若干个属性编辑器

    @InitBinder  
    public void initBinder(WebDataBinder binder) {  
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false);  
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));  
    }

    15:@Required

        @ required 负责检查一个bean在初始化时其声明的 set方法是否被执行, 当某个被标注了 @Required 的 Setter 方法没有被调用,则 Spring 在解析的时候会抛出异常,以提醒开发者对相应属性进行设置。 @Required 注解只能标注在 Setter 方法之上。因为依赖注入的本质是检查 Setter 方法是否被调用了,而不是真的去检查属性是否赋值了以及赋了什么样的值。如果将该注解标注在非 setXxxx() 类型的方法则被忽略。

    16:@Qualifier

        @Autowired                     @Qualifier("softService")

        private ISoftPMService softPMService; 

        使用@Autowired 时,如果找到多个同一类型的bean,则会抛异常,此时可以使用 @Qualifier("beanName"),明确指定bean的名称进行注入,此时与 @Resource指定name属性作用相同。

    17:@PathVariable

        @PathVariable是用来获得请求url中的动态参数的,当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。

    @RequestMapping(value="/user/{userId}",method = RequestMethod.GET)  
    public String getUser(@PathVariable("userId") String userId){   
          return "";  
    }
    
    
    
     
  • 相关阅读:
    Hive:ORC File Format存储格式详解
    tmpfs使用探讨
    Autofs自动挂载探讨
    新建swap分区的规划、挂载和自动挂载示例
    Linux下禁止使用swap及防止OOM机制导致进程被kill掉
    Linux Swap交换分区探讨
    Linux下配置nfs并远程挂载实战探讨
    java.util.NoSuchElementException问题定位
    spark推测执行的坑
    Spark的性能调优杂谈
  • 原文地址:https://www.cnblogs.com/xzjf/p/7149860.html
Copyright © 2011-2022 走看看