java面试总结(七)—— Spring注解

@Controller

用于标记在一个类上,声明注解的类是一个Controller,将该类交给Spring容器进行管理,可以使Controller定义更加灵活,可以不用实现Controller接口,请求处理的方法也更加灵活。

分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。@Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是真正处理请求的处理器

单单使用@Controller标记在一个类上还不能真正意义上的说它就是SpringMVC的一个控制器类,因为这个时候Spring还不认识它。这个时候就需要我们把这个控制器类交给Spring来管理。有两种方法将该类交给Spring管理:

第一种方式是在SpringMVC的配置文件中定义MyController的bean对象。

<bean class="com.host.app.web.controller.MyController"/>

第二种方式是在SpringMVC的配置文件中告诉Spring该到哪里去找标记为@Controller的Controller控制器。

<context:component-scan base-package = "com.host.app.web.controller"/>

@Service

和@Controller一样,用于标注在一个类上,表明该类是一个service类。并将该类注册到Spring容器中进行管理

默认注册的bean名称是首小写字母的类名,如果你想自定义bean名称,你可以使用@Service(“name”)或@Service(value = “name”)

@Repository

和上面两个一样,用于标注一个类上,表明该类是一个数据库访问组件,也就是DAO组件,并将该组件注册到Spring容器中进行管理

默认注册的bean名称是首小写字母的类名,如果你想自定义bean名称,你可以使用@Repository(“name”)或@Repository(value = “name”)

@Component

当我们不知道一个类该归为上面的那个注解时,可以使用@Component注解,虽然并不建议这样使用。

@Component是一个通用的注解,作用就是将这个类交给Spring管理,一般当组件不好归类的时候,我们可以使用这个注解进行标注。还有其他的注解如@Controller、@Service、@Repository,也都是将注解的类交给Spring管理,不过这些注解更注重于指定类型的类。

@Autowired

@Autowired 注释,它可以对类成员变量方法构造函数进行标注,完成自动装配的工作。其通过byType方式,用来给指定的字段或方法注入所需的外部资源。用来来消除 set ,get方法。

用法:

Setter 方法中的 @Autowired
你可以在 JavaBean中的 setter 方法中使用 @Autowired 注解。当 Spring遇到一个在 setter 方法中使用的 @Autowired 注解,它会在方法中执行 byType 自动装配。 如:

 @Autowired
   public void setSpellChecker( SpellChecker spellChecker ){
      this.spellChecker = spellChecker;
   }

普通的set方法是将传入的参数赋给相应的属性,和直接autowired效果一样,但是也有一些情况会在set方法里面写一些处理逻辑,这是就需要在set方法上进行标注。

属性(成员变量)中的 @Autowired
你可以在属性中使用 @Autowired 注解来除去 setter 方法。当时使用 为自动连接属性传递的时候,Spring 会将这些传递过来的值或者引用自动分配给那些属性。

使用@Autowired的属性无需生成setter方法,推荐直接在属性上进行@Autowired:在Spring的实例化一个对象时,当对象的一个成员变量是另一个类时,需要对这个成员变量进行实例化一个对象进行装配,Spring默认调用成员变量的setter方法进行装配,使用这个注解,可以省略setter方法。

构造函数中的 @Autowired
你也可以在构造函数中使用 @Autowired。一个构造函数 @Autowired 说明当创建 bean 时,即使在 XML 文件中没有使用 元素配置 bean ,构造函数也会被自动连接。注:构造方法优先执行,如果在构造方法中引用成员变量的一个属性,如果没有在构造方法中使用该注解,则会报错,因为这时候还没有对成员变量进行初始化。注:Java变量的初始化顺序为:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法–>@Autowired

@Autowired 的(required=false)选项
默认情况下,@Autowired 注解意味着依赖是必须的,它类似于 @Required 注解,然而,你可以使用 @Autowired 的 (required=false) 选项关闭默认行为。
即使你不为 age 属性传递任何参数,下面的示例也会成功运行,但是对于 name 属性则需要一个参数。:

public class Student {
   private Integer age;
   private String name;
   @Autowired(required=false)
   public void setAge(Integer age) {
      this.age = age;
   }  
   public Integer getAge() {
      return age;
   }
   @Autowired
   public void setName(String name) {
      this.name = name;
   }   
   public String getName() {
      return name;
   }
}

@Scope

指定装配的bean的作用域,bean在装配是默认的作用域是单例模式,如果想更换为其他作用域,则需要使用该注解指明,如:@scope(“prototype”)

@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。用于方法上:提供进一步的细分映射信息。 相对于类定义处的 URL。最终的请求路径为:类上的地址(未定义时为根目录)+方法上的地址

返回ModelAndView时的url会根据你的 @RequestMapping实际情况组成。 对应项目jsp位置则是一级路径对应一级文件目录。
如url为/default/index对应项目中webapp/default/index.jsp

属性:
value:指定请求的实际地址,指定的地址可以是URI Template 模式;
method:指定请求的method类型, GET、POST、PUT、DELETE等;
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params: 指定request中必须包含某些参数值时,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

若只指定value时,可直接使用@RequestMapping(“sss”);

@RequestParam

该注解用于获取请求的参数,一般获取请求参数有两种方式,一种是request.getParameter(“参数名”) ,第二种是用@RequestParam注解获取。

属性:
value:指定要获取参数的key
defaultValue:用于如果指定的key不存在,则返回该默认值

注:由于Spring中参数的传递是使用流来传递的,但是只能读取一次,所以如果我们在过滤器或拦截器中读取过参数的话,在控制器中就没法再获取到参数,这种就需要我们对参数进行处理。可以参考这篇博文

@ModelAttribute

@ModelAttribute使用大致有有两种,一种是是直接标记在方法上,一种是标记在方法的参数中,两种标记方法产生的效果也各不相同。

当同一个controller中有任意一个方法被@ModelAttribute注解标记,页面请求只要进入这个控制器,不管请求那个方法,均会先执行被@ModelAttribute标记的方法,所以我们可以用@ModelAttribute注解的方法做一些初始化操作。当同一个controller中有多个方法被@ModelAttribute注解标记,所有被@ModelAttribute标记的方法均会被执行,按先后顺序执行,然后再进入请求的方法。
@ModelAttribute标记在参数前,用于从from表单或url地址中取值,因为SpringMVC会自动匹匹配页面传递过来的参数的name属性和后台控制器中的方法中的参数名,如果参数名相同,会自动匹配,如果控制器中方法是封装的bean,会自动匹配bean中的属性。

@Cacheable

使用该注解实现数据缓存

参数:
value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cache的name
key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL
condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL

如:

public SystemUser findById(String userId) {    
    SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);          
    return user ;           
}    
//将缓存保存进andCache,并当参数userId的长度小于32时才保存进缓存,默认使用参数值及类型作为缓存的key    
@Cacheable(value="andCache",condition="#userId.length < 32")    
public boolean isReserved(String userId) {    
    System.out.println("hello andCache"+userId);    
    return false;    
} 

@Resource

和 @Autowired一样都可以用来装配bean. 都可以写在字段上,或写在setter方法上。

不过@Autowired注解是按照byType方式进行装配的,而@Resource则是按照byName进行装配的
使用@Resource注解时有一个问题,就是如果我们装配的一个接口类,有两个实现类,这时候我们直接使用@Resource注解装配,那么会报错,因为它有两个实现类,所以我们需要在后面指定要装配的哪个实现类,如:@Resource(name = "manImpl"),其等价于@Autowired @Qualifier("manImpl")

@PostConstruct

@PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。类似Servlet的init方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。

@PreDestroy

被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

@SessionAttributes

在默认情况下,ModelMap 中的属性作用域是 request 级别,也就是说,当本次请求结束后,ModelMap 中的属性将销毁。如果希望在多个请求中共享 ModelMap 中的属性,必须将其属性转存到 session 中,这样 ModelMap 的属性才可以被跨请求访问。Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现的。

@SessionAttributes("currUser") //将ModelMap中属性名为currUser的属性放到Session属性列表中,以便这个属性可以跨请求访问
public class BbtForumController {  
    @RequestMapping(params = "method=listBoardTopic")  
    public String listBoardTopic(@RequestParam("id")int topicId, User user,  
ModelMap model) {  
        model.addAttribute("currUser",user); //向ModelMap中添加一个属性 
        return "listTopic";  
    }  
}  

我们可以在需要访问 Session 属性的 controller 上加上 @SessionAttributes,然后在 action 需要的 User 参数上加上 @ModelAttribute,并保证两者的属性名称一致。SpringMVC 就会自动将 @SessionAttributes 定义的属性注入到 ModelMap 对象,在 setup action 的参数列表时,去 ModelMap 中取到这样的对象,再添加到参数列表。只要我们不去调用 SessionStatus 的 setComplete() 方法,这个对象就会一直保留在 Session 中,从而实现 Session 信息的共享。

    @Controller  
    @SessionAttributes("currentUser") 
    public class GreetingController{  
    @RequestMapping  
    public void hello<span style="color: #008000;">(@ModelAttribute("currentUser")</span> User user){  
      //user.sayHello()  
    }  
}  

@InitBinder

由@InitBinder表示的方法,可以对WebDataBinder对象进行初始化。WebDataBinder是DataBinder的子类,用于完成由表单到JavaBean属性的绑定。
@InitBinder方法不能有返回值,它必须为void。
@InitBinder方法的参数通常是WebDataBinder,@InitBinder可以对WebDataBinder进行初始化。
如:

@InitBinder  
private void initBinder(WebDataBinder binder){  
    //由表单到JavaBean赋值过程中哪一个值不进行赋值  
    binder.setDisallowedFields("lastName");  
}  

结果为:lastName=, [email protected], gender=0, department=Department

@Required

该注解用于检测属性依赖。用在bean的set方法上

Spring的依赖检查功能仅能检查某些类型的所有属性,不能仅检查特定的属性,灵活性不够。而往往我们只需要检查特定的属性是否设置,而不是特定类型的所有属性。

RequiredAnnotationBeanPostProcessor是一个Spring bean后处理器,它检查带有@Required注解的所有Bean属性是否设置。 Bean后处理器是一类特殊的Spring bean,能够在每个Bean初始化之前执行附加的操作。为了启用这个bean后处理器进行属性检查,必须在Spring IoC容器中注册它。注意,这个bean后处理器只能检查属性是否已经设置,而不能检查属性是否非空。

如:

 @Required
    public void setPrefixGenerator(PrefixGenerator prefixGenerator) {
        this.prefixGenerator = prefixGenerator;
    }

@Qualifier

该注解主要服务于@Autowired 注解 。用于指定要装配多个相同类型的bean中的哪一个。
因为@Autowired 是根据类型自动注入,如果<bean>中有多个该类型的bean,自动注入的时候会报BeanCreationException异常。所以通常通过@Autowired和@Qualifier一起配合着注解。
如:

  @Autowired()  
  @Qualifier("dataSource2")  
  private JdbcTemplate jdbcTemplate;  

@Qualifier(“XXX”)指定要装配的bean的名称。

@ResponseBody

@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

猜你喜欢

转载自blog.csdn.net/qq_33206732/article/details/80420355