SpringMVC系统学习(二) -- 常用注解

大部分开发者都使用注解 因为使用注解大大的加快开发进度以及缩减学习成本特别是SpringBoot这个神器出现之后,使用XML配置视图解析器的就更少了!!

@Controller
标注在Controller层上的注解,表示这是被spring管理的类
同类的注解还有@Repository、@Service
从源码级别来看, @Repository、@Service、@Controller是@Component的别名

@RequestMapping
这里我们就要想 那么请求进来如何找到对应的执行方法呢??这里我们的第二个注解就出来了
@RequestMapping(“XXX”)
这里就是做映射处理的。根据请求的不同来找到不同的Controller层的入口
注意:当@RequestMapping(“XXX”)写在类名上个时候,是代表命名空间,一般开发时都会有命名空间
放在方法名上的时候才代表入口地址
例如:

@Controller
@RequestMapping(value = "topic")
public class TopicController {
	
	Logger log = Logger.getLogger(TopicController.class);
	
	@Autowired
	TopicService topicService ;

	@Transactional
	@RequestMapping(value = "getTopicList", method = { RequestMethod.POST, RequestMethod.GET })	
	public @ResponseBody Object getCandidateList() {
		Result result = new Result();
		try {	
			result.setData(topicService.getTopicList());
			result.setCode(ResultCode.SUCCESS);
			result.setMessage(ResultCode.SUCCESS_MSG);
		} catch (Exception e) {
			result.setCode(ResultCode.ERROR);
			result.setMessage(ResultCode.FAIL_MSG);
			log.error("getTopicList测试出错", e);
		}
		return result;
	}

这里的入口地址应该是 10.110.147,XXX:8080/项目名/topic/getTopicList

@Resource和@Autowired
面试经典的加分点 可以仔细的看一看 理解一下
感谢https://www.cnblogs.com/leskang/p/5445698.html作者
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
1、共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

(1)@Autowired

@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

public class TestServiceImpl {
    // 下面两种@Autowired只要使用一种即可
    @Autowired
    private UserDao userDao; // 用于字段上
    
    @Autowired
    public void setUserDao(UserDao userDao) { // 用于属性的方法上
        this.userDao = userDao;
    }
}

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:

public class TestServiceImpl {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao; 
}

(2)@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

public class TestServiceImpl {
    // 下面两种@Resource只要使用一种即可
    @Resource(name="userDao")
    private UserDao userDao; // 用于字段上
    
    @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
        this.userDao = userDao;
    }
}

注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

@Resource装配顺序:

①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

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

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

④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。

简化来说,使用上的方法不同。

@Autowired默认Type查找 如果需要name查找的话需要使用@Qualifier(“userDao”)打辅助
@Resource(name/type)类似方法重载 根据参数不同采取不同的查找方法

@PathVariable
和@RequestMapping一起使用
例子:

//@PathVariable可以用来映射URL中的占位符到目标方法的参数中
@RequestMapping("/testPathVariable/{id}")
    public String testPathVariable(@PathVariable("id") Integer id)
    {
        System.out.println("testPathVariable:"+id);
        return SUCCESS;
    }

jsp:

<a href="springmvc/testPathVariable/1">testPathVariable</a>

@requestParam

用于GET方式的请求
@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter(“name”),它有三个常用参数:defaultValue = “0”, required = false, value = “isApp”;defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型

@ResponseBody

作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

猜你喜欢

转载自blog.csdn.net/weixin_44395185/article/details/85775617